From 9537b1f11e1b1b3c4c08f9563d7f165be3a51ac4 Mon Sep 17 00:00:00 2001 From: Bereket Ghebremedhin Date: Mon, 19 Oct 2015 12:23:22 -0400 Subject: [PATCH 01/23] added files from the practice project --- NewJournalEntryViewController.h | 29 ++ NewJournalEntryViewController.m | 88 ++++ .../project.pbxproj | 380 +++++++++++++++++ .../contents.xcworkspacedata | 7 + UNIT2PracticeProject/AppDelegate.h | 17 + UNIT2PracticeProject/AppDelegate.m | 45 ++ .../AppIcon.appiconset/Contents.json | 68 +++ .../Base.lproj/LaunchScreen.storyboard | 27 ++ .../Base.lproj/Main.storyboard | 401 ++++++++++++++++++ UNIT2PracticeProject/DataViewController.h | 35 ++ UNIT2PracticeProject/DataViewController.m | 44 ++ .../EntryListTableViewController.h | 20 + .../EntryListTableViewController.m | 122 ++++++ UNIT2PracticeProject/ImageSingleton.h | 21 + UNIT2PracticeProject/ImageSingleton.m | 30 ++ UNIT2PracticeProject/Info.plist | 47 ++ UNIT2PracticeProject/JournalEntryObject.h | 21 + UNIT2PracticeProject/JournalEntryObject.m | 15 + UNIT2PracticeProject/ModelController.h | 19 + UNIT2PracticeProject/ModelController.m | 91 ++++ .../NewEntryInputViewController.h | 34 ++ .../NewEntryInputViewController.m | 76 ++++ UNIT2PracticeProject/PhotoAlbum.h | 19 + UNIT2PracticeProject/PhotoAlbum.m | 26 ++ UNIT2PracticeProject/RootViewController.h | 25 ++ UNIT2PracticeProject/RootViewController.m | 104 +++++ .../TableOfContentsTableViewController.h | 13 + .../TableOfContentsTableViewController.m | 107 +++++ UNIT2PracticeProject/main.m | 16 + 29 files changed, 1947 insertions(+) create mode 100644 NewJournalEntryViewController.h create mode 100644 NewJournalEntryViewController.m create mode 100644 UNIT2PracticeProject.xcodeproj/project.pbxproj create mode 100644 UNIT2PracticeProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 UNIT2PracticeProject/AppDelegate.h create mode 100644 UNIT2PracticeProject/AppDelegate.m create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard create mode 100644 UNIT2PracticeProject/Base.lproj/Main.storyboard create mode 100644 UNIT2PracticeProject/DataViewController.h create mode 100644 UNIT2PracticeProject/DataViewController.m create mode 100644 UNIT2PracticeProject/EntryListTableViewController.h create mode 100644 UNIT2PracticeProject/EntryListTableViewController.m create mode 100644 UNIT2PracticeProject/ImageSingleton.h create mode 100644 UNIT2PracticeProject/ImageSingleton.m create mode 100644 UNIT2PracticeProject/Info.plist create mode 100644 UNIT2PracticeProject/JournalEntryObject.h create mode 100644 UNIT2PracticeProject/JournalEntryObject.m create mode 100644 UNIT2PracticeProject/ModelController.h create mode 100644 UNIT2PracticeProject/ModelController.m create mode 100644 UNIT2PracticeProject/NewEntryInputViewController.h create mode 100644 UNIT2PracticeProject/NewEntryInputViewController.m create mode 100644 UNIT2PracticeProject/PhotoAlbum.h create mode 100644 UNIT2PracticeProject/PhotoAlbum.m create mode 100644 UNIT2PracticeProject/RootViewController.h create mode 100644 UNIT2PracticeProject/RootViewController.m create mode 100644 UNIT2PracticeProject/TableOfContentsTableViewController.h create mode 100644 UNIT2PracticeProject/TableOfContentsTableViewController.m create mode 100644 UNIT2PracticeProject/main.m diff --git a/NewJournalEntryViewController.h b/NewJournalEntryViewController.h new file mode 100644 index 0000000..9e5a8c1 --- /dev/null +++ b/NewJournalEntryViewController.h @@ -0,0 +1,29 @@ +// +// NewJournalEntryViewController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "JournalEntryObject.h" +#import "NewEntryInputViewController.h" +#import "ImageSingleton.h" + +@interface NewJournalEntryViewController : UIViewController + +< +UIImagePickerControllerDelegate, +UINavigationControllerDelegate +> + +- (IBAction)takeAphotoButtonTapped:(id)sender; + + +- (IBAction)newEntryButtonTapped:(id)sender; + + +@property (strong, nonatomic) IBOutlet UIImageView *capturedPicImageView; + +@end diff --git a/NewJournalEntryViewController.m b/NewJournalEntryViewController.m new file mode 100644 index 0000000..4884705 --- /dev/null +++ b/NewJournalEntryViewController.m @@ -0,0 +1,88 @@ +// +// NewJournalEntryViewController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "NewJournalEntryViewController.h" + +@interface NewJournalEntryViewController () + +@end + +@implementation NewJournalEntryViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + +} + + + + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + + +- (IBAction)takeAphotoButtonTapped:(id)sender { + + UIImagePickerController* picker = [[UIImagePickerController alloc] init]; + picker.delegate = self; + picker.allowsEditing = YES; + picker.sourceType = UIImagePickerControllerSourceTypeCamera; + + [self presentViewController: picker animated:YES completion: NULL]; + + +} + +- (IBAction)newEntryButtonTapped:(id)sender { + + UIImagePickerController *picker = [[UIImagePickerController alloc] init]; + picker.delegate = self; + picker.allowsEditing = YES; + picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; + + [self presentViewController:picker animated:YES completion:NULL]; + + +} + + +- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { + + +// UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; + + self.capturedPicImageView.image = info[UIImagePickerControllerEditedImage]; + + [ImageSingleton myImage].image = self.capturedPicImageView.image; + + //[[PhotoAlbum sharedPhotoAlbum].photoEntries addObject:chosenImage]; + + [picker dismissViewControllerAnimated:YES completion:NULL]; + +} + + +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ + +// if ([segue.identifier isEqualToString:@"InputEntryIdentifier"]) { +// +// NewEntryInputViewController* viewController = segue.destinationViewController; +// +// [ImageSingleton myImage].image = self.capturedPicImageView.image; +// +// if (viewController.selectedPhoto.image != nil) { +// NSLog(@"We have Photo Data"); +// } +// + +} + +@end diff --git a/UNIT2PracticeProject.xcodeproj/project.pbxproj b/UNIT2PracticeProject.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9e5463b --- /dev/null +++ b/UNIT2PracticeProject.xcodeproj/project.pbxproj @@ -0,0 +1,380 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + AB0F265E1BCC5387006685AB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F265D1BCC5387006685AB /* main.m */; }; + AB0F26611BCC5387006685AB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26601BCC5387006685AB /* AppDelegate.m */; }; + AB0F26641BCC5387006685AB /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26631BCC5387006685AB /* RootViewController.m */; }; + AB0F26671BCC5387006685AB /* DataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26661BCC5387006685AB /* DataViewController.m */; }; + AB0F266A1BCC5387006685AB /* ModelController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26691BCC5387006685AB /* ModelController.m */; }; + AB0F266D1BCC5387006685AB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB0F266B1BCC5387006685AB /* Main.storyboard */; }; + AB0F266F1BCC5387006685AB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB0F266E1BCC5387006685AB /* Assets.xcassets */; }; + AB0F26721BCC5387006685AB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB0F26701BCC5387006685AB /* LaunchScreen.storyboard */; }; + AB61513D1BD060B60049FADF /* JournalEntryObject.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ED81BD01C01005BC70B /* JournalEntryObject.m */; }; + AB626ECB1BD00F65005BC70B /* NewJournalEntryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ECA1BD00F65005BC70B /* NewJournalEntryViewController.m */; settings = {ASSET_TAGS = (); }; }; + AB626ECE1BD014BD005BC70B /* NewEntryInputViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ECD1BD014BD005BC70B /* NewEntryInputViewController.m */; settings = {ASSET_TAGS = (); }; }; + AB626ED11BD016D6005BC70B /* EntryListTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ED01BD016D6005BC70B /* EntryListTableViewController.m */; settings = {ASSET_TAGS = (); }; }; + AB626ED61BD01BA4005BC70B /* PhotoAlbum.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ED51BD01BA4005BC70B /* PhotoAlbum.m */; settings = {ASSET_TAGS = (); }; }; + ABF8076C1BD401A400853411 /* ImageSingleton.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF8076B1BD401A400853411 /* ImageSingleton.m */; settings = {ASSET_TAGS = (); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + AB0F26591BCC5387006685AB /* UNIT2PracticeProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UNIT2PracticeProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; + AB0F265D1BCC5387006685AB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + AB0F265F1BCC5387006685AB /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + AB0F26601BCC5387006685AB /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + AB0F26621BCC5387006685AB /* RootViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; + AB0F26631BCC5387006685AB /* RootViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; + AB0F26651BCC5387006685AB /* DataViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DataViewController.h; sourceTree = ""; }; + AB0F26661BCC5387006685AB /* DataViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DataViewController.m; sourceTree = ""; }; + AB0F26681BCC5387006685AB /* ModelController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModelController.h; sourceTree = ""; }; + AB0F26691BCC5387006685AB /* ModelController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ModelController.m; sourceTree = ""; }; + AB0F266C1BCC5387006685AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + AB0F266E1BCC5387006685AB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + AB0F26711BCC5387006685AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + AB0F26731BCC5387006685AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AB626EC91BD00F65005BC70B /* NewJournalEntryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NewJournalEntryViewController.h; path = ../NewJournalEntryViewController.h; sourceTree = ""; }; + AB626ECA1BD00F65005BC70B /* NewJournalEntryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NewJournalEntryViewController.m; path = ../NewJournalEntryViewController.m; sourceTree = ""; }; + AB626ECC1BD014BD005BC70B /* NewEntryInputViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewEntryInputViewController.h; sourceTree = ""; }; + AB626ECD1BD014BD005BC70B /* NewEntryInputViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewEntryInputViewController.m; sourceTree = ""; }; + AB626ECF1BD016D6005BC70B /* EntryListTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntryListTableViewController.h; sourceTree = ""; }; + AB626ED01BD016D6005BC70B /* EntryListTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EntryListTableViewController.m; sourceTree = ""; }; + AB626ED41BD01BA4005BC70B /* PhotoAlbum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoAlbum.h; sourceTree = ""; }; + AB626ED51BD01BA4005BC70B /* PhotoAlbum.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoAlbum.m; sourceTree = ""; }; + AB626ED71BD01C01005BC70B /* JournalEntryObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JournalEntryObject.h; sourceTree = ""; }; + AB626ED81BD01C01005BC70B /* JournalEntryObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JournalEntryObject.m; sourceTree = ""; }; + ABF8076A1BD401A400853411 /* ImageSingleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageSingleton.h; sourceTree = ""; }; + ABF8076B1BD401A400853411 /* ImageSingleton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageSingleton.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + AB0F26561BCC5387006685AB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AB0F26501BCC5387006685AB = { + isa = PBXGroup; + children = ( + AB0F265B1BCC5387006685AB /* UNIT2PracticeProject */, + AB0F265A1BCC5387006685AB /* Products */, + ); + sourceTree = ""; + }; + AB0F265A1BCC5387006685AB /* Products */ = { + isa = PBXGroup; + children = ( + AB0F26591BCC5387006685AB /* UNIT2PracticeProject.app */, + ); + name = Products; + sourceTree = ""; + }; + AB0F265B1BCC5387006685AB /* UNIT2PracticeProject */ = { + isa = PBXGroup; + children = ( + AB0F265F1BCC5387006685AB /* AppDelegate.h */, + AB0F26601BCC5387006685AB /* AppDelegate.m */, + AB0F26621BCC5387006685AB /* RootViewController.h */, + AB0F26631BCC5387006685AB /* RootViewController.m */, + AB0F26651BCC5387006685AB /* DataViewController.h */, + AB0F26661BCC5387006685AB /* DataViewController.m */, + AB0F26681BCC5387006685AB /* ModelController.h */, + AB0F26691BCC5387006685AB /* ModelController.m */, + ABF8076D1BD4444E00853411 /* Singletons */, + AB626ED31BD01B26005BC70B /* Journal Entry Creation */, + AB626ED21BD01B10005BC70B /* Entry List TableView */, + AB0F266B1BCC5387006685AB /* Main.storyboard */, + AB0F266E1BCC5387006685AB /* Assets.xcassets */, + AB0F26701BCC5387006685AB /* LaunchScreen.storyboard */, + AB0F26731BCC5387006685AB /* Info.plist */, + AB0F265C1BCC5387006685AB /* Supporting Files */, + ); + path = UNIT2PracticeProject; + sourceTree = ""; + }; + AB0F265C1BCC5387006685AB /* Supporting Files */ = { + isa = PBXGroup; + children = ( + AB0F265D1BCC5387006685AB /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + AB626ED21BD01B10005BC70B /* Entry List TableView */ = { + isa = PBXGroup; + children = ( + AB626ECF1BD016D6005BC70B /* EntryListTableViewController.h */, + AB626ED01BD016D6005BC70B /* EntryListTableViewController.m */, + ); + name = "Entry List TableView"; + sourceTree = ""; + }; + AB626ED31BD01B26005BC70B /* Journal Entry Creation */ = { + isa = PBXGroup; + children = ( + AB626ED81BD01C01005BC70B /* JournalEntryObject.m */, + AB626ED71BD01C01005BC70B /* JournalEntryObject.h */, + AB626EC91BD00F65005BC70B /* NewJournalEntryViewController.h */, + AB626ECA1BD00F65005BC70B /* NewJournalEntryViewController.m */, + AB626ECC1BD014BD005BC70B /* NewEntryInputViewController.h */, + AB626ECD1BD014BD005BC70B /* NewEntryInputViewController.m */, + ); + name = "Journal Entry Creation"; + sourceTree = ""; + }; + ABF8076D1BD4444E00853411 /* Singletons */ = { + isa = PBXGroup; + children = ( + AB626ED41BD01BA4005BC70B /* PhotoAlbum.h */, + AB626ED51BD01BA4005BC70B /* PhotoAlbum.m */, + ABF8076A1BD401A400853411 /* ImageSingleton.h */, + ABF8076B1BD401A400853411 /* ImageSingleton.m */, + ); + name = Singletons; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + AB0F26581BCC5387006685AB /* UNIT2PracticeProject */ = { + isa = PBXNativeTarget; + buildConfigurationList = AB0F26761BCC5387006685AB /* Build configuration list for PBXNativeTarget "UNIT2PracticeProject" */; + buildPhases = ( + AB0F26551BCC5387006685AB /* Sources */, + AB0F26561BCC5387006685AB /* Frameworks */, + AB0F26571BCC5387006685AB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = UNIT2PracticeProject; + productName = UNIT2PracticeProject; + productReference = AB0F26591BCC5387006685AB /* UNIT2PracticeProject.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + AB0F26511BCC5387006685AB /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = "Bereket "; + TargetAttributes = { + AB0F26581BCC5387006685AB = { + CreatedOnToolsVersion = 7.0.1; + }; + }; + }; + buildConfigurationList = AB0F26541BCC5387006685AB /* Build configuration list for PBXProject "UNIT2PracticeProject" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = AB0F26501BCC5387006685AB; + productRefGroup = AB0F265A1BCC5387006685AB /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + AB0F26581BCC5387006685AB /* UNIT2PracticeProject */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + AB0F26571BCC5387006685AB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB0F26721BCC5387006685AB /* LaunchScreen.storyboard in Resources */, + AB0F266F1BCC5387006685AB /* Assets.xcassets in Resources */, + AB0F266D1BCC5387006685AB /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + AB0F26551BCC5387006685AB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB61513D1BD060B60049FADF /* JournalEntryObject.m in Sources */, + ABF8076C1BD401A400853411 /* ImageSingleton.m in Sources */, + AB626ECB1BD00F65005BC70B /* NewJournalEntryViewController.m in Sources */, + AB0F26671BCC5387006685AB /* DataViewController.m in Sources */, + AB0F26611BCC5387006685AB /* AppDelegate.m in Sources */, + AB0F266A1BCC5387006685AB /* ModelController.m in Sources */, + AB0F265E1BCC5387006685AB /* main.m in Sources */, + AB0F26641BCC5387006685AB /* RootViewController.m in Sources */, + AB626ED11BD016D6005BC70B /* EntryListTableViewController.m in Sources */, + AB626ECE1BD014BD005BC70B /* NewEntryInputViewController.m in Sources */, + AB626ED61BD01BA4005BC70B /* PhotoAlbum.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + AB0F266B1BCC5387006685AB /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + AB0F266C1BCC5387006685AB /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + AB0F26701BCC5387006685AB /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + AB0F26711BCC5387006685AB /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + AB0F26741BCC5387006685AB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + AB0F26751BCC5387006685AB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + AB0F26771BCC5387006685AB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = UNIT2PracticeProject/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = bereketsHW.UNIT2PracticeProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AB0F26781BCC5387006685AB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = UNIT2PracticeProject/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = bereketsHW.UNIT2PracticeProject; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AB0F26541BCC5387006685AB /* Build configuration list for PBXProject "UNIT2PracticeProject" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB0F26741BCC5387006685AB /* Debug */, + AB0F26751BCC5387006685AB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AB0F26761BCC5387006685AB /* Build configuration list for PBXNativeTarget "UNIT2PracticeProject" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB0F26771BCC5387006685AB /* Debug */, + AB0F26781BCC5387006685AB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = AB0F26511BCC5387006685AB /* Project object */; +} diff --git a/UNIT2PracticeProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/UNIT2PracticeProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..4377269 --- /dev/null +++ b/UNIT2PracticeProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/UNIT2PracticeProject/AppDelegate.h b/UNIT2PracticeProject/AppDelegate.h new file mode 100644 index 0000000..215346f --- /dev/null +++ b/UNIT2PracticeProject/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/UNIT2PracticeProject/AppDelegate.m b/UNIT2PracticeProject/AppDelegate.m new file mode 100644 index 0000000..c16b253 --- /dev/null +++ b/UNIT2PracticeProject/AppDelegate.m @@ -0,0 +1,45 @@ +// +// AppDelegate.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard b/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..5a9c4a6 --- /dev/null +++ b/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard new file mode 100644 index 0000000..ef44eb2 --- /dev/null +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UNIT2PracticeProject/DataViewController.h b/UNIT2PracticeProject/DataViewController.h new file mode 100644 index 0000000..9f1e228 --- /dev/null +++ b/UNIT2PracticeProject/DataViewController.h @@ -0,0 +1,35 @@ +// +// DataViewController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "JournalEntryObject.h" + + +@interface DataViewController : UIViewController + + + + +@property (strong, nonatomic) IBOutlet UILabel *dataLabel; // <----not relevant to the project IGNORE! + +//------------------------------------------------------------------------------------------- +@property (strong, nonatomic) IBOutlet UILabel *titleLabel; +@property (strong, nonatomic) IBOutlet UIImageView *imageView; +@property (strong, nonatomic) IBOutlet UITextView *textView; + + +@property (strong, nonatomic) id photoDataObject; +@property (strong, nonatomic) id titleDataObject; +@property (strong, nonatomic) id textEntrydataObject; + + +@property (nonatomic) NSUInteger indexOfSelectedRow; + + +@end + diff --git a/UNIT2PracticeProject/DataViewController.m b/UNIT2PracticeProject/DataViewController.m new file mode 100644 index 0000000..9e0ba2e --- /dev/null +++ b/UNIT2PracticeProject/DataViewController.m @@ -0,0 +1,44 @@ +// +// DataViewController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "DataViewController.h" + +@interface DataViewController () + +@end + +@implementation DataViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + +} + + + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + self.dataLabel.text = [self.photoDataObject description]; + + // for (int count=0; count<[PhotoAlbum sharedPhotoAlbum].photoEntries.count; count++) { + // + // JournalEntryObject* someObject = [[PhotoAlbum sharedPhotoAlbum].photoEntries objectAtIndex:count]; + // NSLog(@"SAVED TITLE : %@", someObject); + // + // // NSLog(@"%@",[PhotoAlbum sharedPhotoAlbum].photoEntries); + // } + // + self.imageView.image = (UIImage *)self.photoDataObject; + self.titleLabel.text= (NSString*)self.titleDataObject; + self.textView.text = (NSString*)self.textEntrydataObject; + +} + + +@end diff --git a/UNIT2PracticeProject/EntryListTableViewController.h b/UNIT2PracticeProject/EntryListTableViewController.h new file mode 100644 index 0000000..b93387d --- /dev/null +++ b/UNIT2PracticeProject/EntryListTableViewController.h @@ -0,0 +1,20 @@ +// +// EntryListTableViewController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "NewEntryInputViewController.h" +#import "JournalEntryObject.h" +#import "PhotoAlbum.h" +#import "RootViewController.h" + +@interface EntryListTableViewController : UITableViewController + +@property (nonatomic) PhotoAlbum* myAlbum; + +@property (nonatomic) NSNumber* count; +@end diff --git a/UNIT2PracticeProject/EntryListTableViewController.m b/UNIT2PracticeProject/EntryListTableViewController.m new file mode 100644 index 0000000..2c51515 --- /dev/null +++ b/UNIT2PracticeProject/EntryListTableViewController.m @@ -0,0 +1,122 @@ +// +// EntryListTableViewController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "EntryListTableViewController.h" + +@implementation EntryListTableViewController + +- (void)viewDidLoad { + + [super viewDidLoad]; + + + [self.tableView reloadData]; + + + // Uncomment the following line to preserve selection between presentations. + // self.clearsSelectionOnViewWillAppear = NO; + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem; +} + + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear: YES]; + [self.tableView reloadData]; + // Dispose of any resources that can be recreated. + +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [PhotoAlbum sharedPhotoAlbum].photoEntries.count; +} + + - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + // [self.tableView reloadData]; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EntryCellIdentifier" forIndexPath:indexPath]; + + JournalEntryObject* journalEntry = [PhotoAlbum sharedPhotoAlbum].photoEntries[indexPath.row]; + cell.textLabel.text = journalEntry.savedTitle; + + + return cell; + } + + +/* + // Override to support conditional editing of the table view. + - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the specified item to be editable. + return YES; + } + */ + +/* + // Override to support editing the table view. + - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Delete the row from the data source + [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } else if (editingStyle == UITableViewCellEditingStyleInsert) { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + +/* + // Override to support rearranging the table view. + - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { + } + */ + +/* + // Override to support conditional rearranging of the table view. + - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the item to be re-orderable. + return YES; + } + */ + +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ + + + + + if ([[segue identifier] isEqualToString:@"SpecificPageIdentifier"]) + { + NSIndexPath* indexPath = [self.tableView indexPathForSelectedRow]; + + JournalEntryObject* journalEntry = [PhotoAlbum sharedPhotoAlbum].photoEntries[indexPath.row]; + + RootViewController* viewController = [segue destinationViewController]; + viewController.titleSelected = journalEntry.savedTitle; + viewController.pageViewController = sender; + + NSLog(@"title %@ ",viewController.titleSelected); + + } + + + + +} + +@end diff --git a/UNIT2PracticeProject/ImageSingleton.h b/UNIT2PracticeProject/ImageSingleton.h new file mode 100644 index 0000000..38def96 --- /dev/null +++ b/UNIT2PracticeProject/ImageSingleton.h @@ -0,0 +1,21 @@ +// +// ImageSingleton.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/18/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import +@interface ImageSingleton : NSObject + + + +@property (nonatomic) UIImage* image; + + ++ (ImageSingleton *)myImage; + + +@end diff --git a/UNIT2PracticeProject/ImageSingleton.m b/UNIT2PracticeProject/ImageSingleton.m new file mode 100644 index 0000000..d7a5175 --- /dev/null +++ b/UNIT2PracticeProject/ImageSingleton.m @@ -0,0 +1,30 @@ +// +// ImageSingleton.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/18/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "ImageSingleton.h" + + +@implementation ImageSingleton + ++ (ImageSingleton *)myImage { + static ImageSingleton *sharedMyManager = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedMyManager = [[self alloc] init]; + sharedMyManager.image = nil; + + }); + + return sharedMyManager; +} + + + + +@end diff --git a/UNIT2PracticeProject/Info.plist b/UNIT2PracticeProject/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/UNIT2PracticeProject/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/UNIT2PracticeProject/JournalEntryObject.h b/UNIT2PracticeProject/JournalEntryObject.h new file mode 100644 index 0000000..dc00663 --- /dev/null +++ b/UNIT2PracticeProject/JournalEntryObject.h @@ -0,0 +1,21 @@ +// +// JournalEntryObject.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "NewJournalEntryViewController.h" +#import "NewEntryInputViewController.h" + + +@interface JournalEntryObject : NSObject + +@property (nonatomic) UIImage* savedImageEntry; +@property (nonatomic) NSString* savedTextEntry; +@property (nonatomic) NSString* savedTitle; + + +@end diff --git a/UNIT2PracticeProject/JournalEntryObject.m b/UNIT2PracticeProject/JournalEntryObject.m new file mode 100644 index 0000000..0c58259 --- /dev/null +++ b/UNIT2PracticeProject/JournalEntryObject.m @@ -0,0 +1,15 @@ +// +// JournalEntryObject.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "JournalEntryObject.h" + +@implementation JournalEntryObject + + + +@end diff --git a/UNIT2PracticeProject/ModelController.h b/UNIT2PracticeProject/ModelController.h new file mode 100644 index 0000000..02d90a4 --- /dev/null +++ b/UNIT2PracticeProject/ModelController.h @@ -0,0 +1,19 @@ +// +// ModelController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import + +@class DataViewController; + +@interface ModelController : NSObject + +- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard; +- (NSUInteger)indexOfViewController:(DataViewController *)viewController; + +@end + diff --git a/UNIT2PracticeProject/ModelController.m b/UNIT2PracticeProject/ModelController.m new file mode 100644 index 0000000..227684d --- /dev/null +++ b/UNIT2PracticeProject/ModelController.m @@ -0,0 +1,91 @@ +// +// ModelController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "ModelController.h" +#import "DataViewController.h" +#import "PhotoAlbum.h" +#import "JournalEntryObject.h" + +/* + A controller object that manages a simple model -- a collection of month names. + + The controller serves as the data source for the page view controller; it therefore implements pageViewController:viewControllerBeforeViewController: and pageViewController:viewControllerAfterViewController:. + It also implements a custom method, viewControllerAtIndex: which is useful in the implementation of the data source methods, and in the initial configuration of the application. + + There is no need to actually create view controllers for each page in advance -- indeed doing so incurs unnecessary overhead. Given the data model, these methods create, configure, and return a new view controller on demand. + */ + + +@interface ModelController () + +@property (readonly, strong, nonatomic) NSArray *pageData; +@end + +@implementation ModelController + +- (instancetype)init { + self = [super init]; + if (self) { + // Create the data model. + //NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + _pageData = [PhotoAlbum sharedPhotoAlbum].photoEntries;; + } + return self; +} + +- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard { + // Return the data view controller for the given index. + if (([self.pageData count] == 0) || (index >= [self.pageData count])) { + return nil; + } + + // Create a new view controller and pass suitable data. + DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"]; + + dataViewController.photoDataObject = [self.pageData[index] savedImageEntry]; + dataViewController.titleDataObject = [self.pageData[index] savedTitle]; + dataViewController.textEntrydataObject = [self.pageData[index] savedTextEntry]; + + return dataViewController; +} + +- (NSUInteger)indexOfViewController:(DataViewController *)viewController { + // Return the index of the given data view controller. + // For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index. + return [self.pageData indexOfObject:viewController.photoDataObject]; + +} + +#pragma mark - Page View Controller Data Source + +- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController +{ + NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; + if ((index == 0) || (index == NSNotFound)) { + return nil; + } + + index--; + return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; +} + +- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController +{ + NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; + if (index == NSNotFound) { + return nil; + } + + index++; + if (index == [self.pageData count]) { + return nil; + } + return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; +} + +@end diff --git a/UNIT2PracticeProject/NewEntryInputViewController.h b/UNIT2PracticeProject/NewEntryInputViewController.h new file mode 100644 index 0000000..69827f3 --- /dev/null +++ b/UNIT2PracticeProject/NewEntryInputViewController.h @@ -0,0 +1,34 @@ +// +// NewEntryInputViewController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import + +#import "NewJournalEntryViewController.h" +#import "PhotoAlbum.h" + +@class JournalEntryObject; + +@interface NewEntryInputViewController : UIViewController + + + +@property (nonatomic) JournalEntryObject *entryObject; + +@property (strong, nonatomic) IBOutlet UITextField *titleTextField; + +@property (strong, nonatomic) IBOutlet UITextView *journalEntryTextView; + + +- (IBAction)saveEntryButtonTapped:(id)sender; + +@property (nonatomic) UIImageView* selectedPhoto; //<------- + +//@property (nonatomic) JournalEntryObject *myJournalEntry; + +@end diff --git a/UNIT2PracticeProject/NewEntryInputViewController.m b/UNIT2PracticeProject/NewEntryInputViewController.m new file mode 100644 index 0000000..1370e0c --- /dev/null +++ b/UNIT2PracticeProject/NewEntryInputViewController.m @@ -0,0 +1,76 @@ +// +// NewEntryInputViewController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "NewEntryInputViewController.h" +#import "EntryListTableViewController.h" +#import "JournalEntryObject.h" +#import "PhotoAlbum.h" + +@interface NewEntryInputViewController () + + + +@end + +@implementation NewEntryInputViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + + + // Do any additional setup after loading the view. + self.entryObject = [[JournalEntryObject alloc] init]; + + if (self.selectedPhoto.image != nil) { + NSLog(@"We have Photo Data"); + } +} + + + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +- (IBAction)saveEntryButtonTapped:(id)sender { + + NSLog(@"%@", self.journalEntryTextView.text); + NSLog(@"%@", self.titleTextField.text); + + self.entryObject.savedTextEntry = self.journalEntryTextView.text; + self.entryObject.savedTitle = self.titleTextField.text; + + self.entryObject.savedImageEntry = [ImageSingleton myImage].image; + + + [[PhotoAlbum sharedPhotoAlbum].photoEntries addObject:self.entryObject]; + + JournalEntryObject* someObject = [[PhotoAlbum sharedPhotoAlbum].photoEntries objectAtIndex:0]; + NSLog(@"SAVED TITLE : %@", someObject.savedTitle); + + // UINavigationController *navController = [self.tabBarController.viewControllers objectAtIndex:1]; + + // EntryListTableViewController* viewcontroller = [navController.viewControllers firstObject]; + + + + + [self dismissViewControllerAnimated:NO completion:nil]; + + +} + + +@end diff --git a/UNIT2PracticeProject/PhotoAlbum.h b/UNIT2PracticeProject/PhotoAlbum.h new file mode 100644 index 0000000..7819127 --- /dev/null +++ b/UNIT2PracticeProject/PhotoAlbum.h @@ -0,0 +1,19 @@ +// +// PhotoAlbum.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import + +@interface PhotoAlbum : NSObject + + +@property (nonatomic) NSMutableArray *photoEntries; + ++ (PhotoAlbum *)sharedPhotoAlbum; + + +@end diff --git a/UNIT2PracticeProject/PhotoAlbum.m b/UNIT2PracticeProject/PhotoAlbum.m new file mode 100644 index 0000000..d38c2a6 --- /dev/null +++ b/UNIT2PracticeProject/PhotoAlbum.m @@ -0,0 +1,26 @@ +// +// PhotoAlbum.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/15/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "PhotoAlbum.h" + +@implementation PhotoAlbum + ++ (PhotoAlbum *)sharedPhotoAlbum { + static PhotoAlbum *sharedMyManager = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedMyManager = [[self alloc] init]; + sharedMyManager.photoEntries = [[NSMutableArray alloc] init]; + }); + + return sharedMyManager; +} + + +@end diff --git a/UNIT2PracticeProject/RootViewController.h b/UNIT2PracticeProject/RootViewController.h new file mode 100644 index 0000000..66397ac --- /dev/null +++ b/UNIT2PracticeProject/RootViewController.h @@ -0,0 +1,25 @@ +// +// RootViewController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "JournalEntryObject.h" +#import "EntryListTableViewController.h" + +@interface RootViewController : UIViewController + +@property (strong, nonatomic) UIPageViewController *pageViewController; + +//@property (nonatomic) NSMutableArray* pageEntries; + +@property (nonatomic) NSUInteger index; + +@property (nonatomic) NSString* titleSelected; + + +@end + diff --git a/UNIT2PracticeProject/RootViewController.m b/UNIT2PracticeProject/RootViewController.m new file mode 100644 index 0000000..b872734 --- /dev/null +++ b/UNIT2PracticeProject/RootViewController.m @@ -0,0 +1,104 @@ +// +// RootViewController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + + +#import "RootViewController.h" +#import "ModelController.h" +#import "DataViewController.h" +#import "PhotoAlbum.h" +#import "EntryListTableViewController.h" + + +@interface RootViewController () + +@property (readonly, strong, nonatomic) ModelController *modelController; +@end + +@implementation RootViewController + +@synthesize modelController = _modelController; + +- (void)viewDidLoad { + [super viewDidLoad]; + NSLog(@"passed %@",self.titleSelected); + + // Do any additional setup after loading the view, typically from a nib. + // Configure the page view controller and add it as a child view controller. + self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; + self.pageViewController.delegate = self; + + DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard]; + NSArray *viewControllers = @[startingViewController]; + + [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; + + self.pageViewController.dataSource = self.modelController; + + [self addChildViewController:self.pageViewController]; + [self.view addSubview:self.pageViewController.view]; + + // Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages. + CGRect pageViewRect = self.view.bounds; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { + pageViewRect = CGRectInset(pageViewRect, 40.0, 40.0); + } + self.pageViewController.view.frame = pageViewRect; + + [self.pageViewController didMoveToParentViewController:self]; + + // Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily. + self.view.gestureRecognizers = self.pageViewController.gestureRecognizers; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (ModelController *)modelController { + // Return the model controller object, creating it if necessary. + // In more complex implementations, the model controller may be passed to the view controller. + if (!_modelController) { + _modelController = [[ModelController alloc] init]; + } + return _modelController; +} + +#pragma mark - UIPageViewController delegate methods + +- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation { + if (UIInterfaceOrientationIsPortrait(orientation) || ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)) { + // In portrait orientation or on iPhone: Set the spine position to "min" and the page view controller's view controllers array to contain just one view controller. Setting the spine position to 'UIPageViewControllerSpineLocationMid' in landscape orientation sets the doubleSided property to YES, so set it to NO here. + + UIViewController *currentViewController = self.pageViewController.viewControllers[0]; + NSArray *viewControllers = @[currentViewController]; + [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; + + self.pageViewController.doubleSided = NO; + return UIPageViewControllerSpineLocationMin; + } + + // In landscape orientation: Set set the spine location to "mid" and the page view controller's view controllers array to contain two view controllers. If the current page is even, set it to contain the current and next view controllers; if it is odd, set the array to contain the previous and current view controllers. + DataViewController *currentViewController = self.pageViewController.viewControllers[0]; + NSArray *viewControllers = nil; + + NSUInteger indexOfCurrentViewController = [self.modelController indexOfViewController:currentViewController]; + if (indexOfCurrentViewController == 0 || indexOfCurrentViewController % 2 == 0) { + UIViewController *nextViewController = [self.modelController pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController]; + viewControllers = @[currentViewController, nextViewController]; + } else { + UIViewController *previousViewController = [self.modelController pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController]; + viewControllers = @[previousViewController, currentViewController]; + } + [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; + + + return UIPageViewControllerSpineLocationMid; +} + +@end diff --git a/UNIT2PracticeProject/TableOfContentsTableViewController.h b/UNIT2PracticeProject/TableOfContentsTableViewController.h new file mode 100644 index 0000000..cdea9f3 --- /dev/null +++ b/UNIT2PracticeProject/TableOfContentsTableViewController.h @@ -0,0 +1,13 @@ +// +// TableOfContentsTableViewController.h +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import + +@interface TableOfContentsTableViewController : UITableViewController + +@end diff --git a/UNIT2PracticeProject/TableOfContentsTableViewController.m b/UNIT2PracticeProject/TableOfContentsTableViewController.m new file mode 100644 index 0000000..97fc855 --- /dev/null +++ b/UNIT2PracticeProject/TableOfContentsTableViewController.m @@ -0,0 +1,107 @@ +// +// TableOfContentsTableViewController.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "TableOfContentsTableViewController.h" +#import "RootViewController.h" +#import "DataViewController.h" + +@interface TableOfContentsTableViewController () + +@end + +@implementation TableOfContentsTableViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Uncomment the following line to preserve selection between presentations. + // self.clearsSelectionOnViewWillAppear = NO; + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 0; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + + return 0; +} + + +//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { +// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableOfContentsCellIdentifier" forIndexPath:indexPath]; +// +// // Configure the cell... +// +// return cell; +//} +// + +/* +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the specified item to be editable. + return YES; +} +*/ + +/* +// Override to support editing the table view. +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Delete the row from the data source + [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } else if (editingStyle == UITableViewCellEditingStyleInsert) { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } +} +*/ + +/* +// Override to support rearranging the table view. +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { +} +*/ + +/* +// Override to support conditional rearranging of the table view. +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the item to be re-orderable. + return YES; +} +*/ + + +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +//- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { +// +// if([segue.identifier isEqual: @"showPageSegue"]){ +// +// RootViewController* viewController = segue.destinationViewController; +// +// +// +// // Get the new view controller using [segue destinationViewController]. +// // Pass the selected object to the new view controller. +// } +//} + + +@end diff --git a/UNIT2PracticeProject/main.m b/UNIT2PracticeProject/main.m new file mode 100644 index 0000000..2fd4ae8 --- /dev/null +++ b/UNIT2PracticeProject/main.m @@ -0,0 +1,16 @@ +// +// main.m +// UNIT2PracticeProject +// +// Created by Bereket on 10/12/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} From 54ddd58eafa729fb4910ee84fcfeb85b6ab1c08c Mon Sep 17 00:00:00 2001 From: Bereket Ghebremedhin Date: Mon, 19 Oct 2015 20:11:51 -0400 Subject: [PATCH 02/23] fixed bug --- UNIT2PracticeProject/Base.lproj/Main.storyboard | 2 +- UNIT2PracticeProject/DataViewController.h | 1 + UNIT2PracticeProject/DataViewController.m | 7 ++++--- UNIT2PracticeProject/ModelController.h | 2 ++ UNIT2PracticeProject/ModelController.m | 5 +++-- .../NewEntryInputViewController.m | 16 ++++++++-------- UNIT2PracticeProject/RootViewController.h | 2 +- UNIT2PracticeProject/RootViewController.m | 3 --- 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index ef44eb2..7a06391 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -142,7 +142,7 @@ - + diff --git a/UNIT2PracticeProject/DataViewController.h b/UNIT2PracticeProject/DataViewController.h index 9f1e228..9543f2c 100644 --- a/UNIT2PracticeProject/DataViewController.h +++ b/UNIT2PracticeProject/DataViewController.h @@ -30,6 +30,7 @@ @property (nonatomic) NSUInteger indexOfSelectedRow; +@property (nonatomic) id dataObject; @end diff --git a/UNIT2PracticeProject/DataViewController.m b/UNIT2PracticeProject/DataViewController.m index 9e0ba2e..fbba8d6 100644 --- a/UNIT2PracticeProject/DataViewController.m +++ b/UNIT2PracticeProject/DataViewController.m @@ -24,7 +24,7 @@ - (void)viewDidLoad { - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - self.dataLabel.text = [self.photoDataObject description]; + // self.dataLabel.text = [self.photoDataObject description]; // for (int count=0; count<[PhotoAlbum sharedPhotoAlbum].photoEntries.count; count++) { // @@ -34,9 +34,10 @@ - (void)viewWillAppear:(BOOL)animated { // // NSLog(@"%@",[PhotoAlbum sharedPhotoAlbum].photoEntries); // } // + self.imageView.image = (UIImage *)self.photoDataObject; - self.titleLabel.text= (NSString*)self.titleDataObject; - self.textView.text = (NSString*)self.textEntrydataObject; + self.titleLabel.text = (NSString*)self.titleDataObject; + self.textView.text = (NSString*)self.textEntrydataObject; } diff --git a/UNIT2PracticeProject/ModelController.h b/UNIT2PracticeProject/ModelController.h index 02d90a4..54e0646 100644 --- a/UNIT2PracticeProject/ModelController.h +++ b/UNIT2PracticeProject/ModelController.h @@ -12,6 +12,8 @@ @interface ModelController : NSObject + + - (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard; - (NSUInteger)indexOfViewController:(DataViewController *)viewController; diff --git a/UNIT2PracticeProject/ModelController.m b/UNIT2PracticeProject/ModelController.m index 227684d..7346751 100644 --- a/UNIT2PracticeProject/ModelController.m +++ b/UNIT2PracticeProject/ModelController.m @@ -47,17 +47,18 @@ - (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UISt // Create a new view controller and pass suitable data. DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"]; + dataViewController.dataObject = self.pageData[index]; dataViewController.photoDataObject = [self.pageData[index] savedImageEntry]; dataViewController.titleDataObject = [self.pageData[index] savedTitle]; dataViewController.textEntrydataObject = [self.pageData[index] savedTextEntry]; - +// return dataViewController; } - (NSUInteger)indexOfViewController:(DataViewController *)viewController { // Return the index of the given data view controller. // For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index. - return [self.pageData indexOfObject:viewController.photoDataObject]; + return [self.pageData indexOfObject:viewController.dataObject]; } diff --git a/UNIT2PracticeProject/NewEntryInputViewController.m b/UNIT2PracticeProject/NewEntryInputViewController.m index 1370e0c..061a596 100644 --- a/UNIT2PracticeProject/NewEntryInputViewController.m +++ b/UNIT2PracticeProject/NewEntryInputViewController.m @@ -57,15 +57,15 @@ - (IBAction)saveEntryButtonTapped:(id)sender { [[PhotoAlbum sharedPhotoAlbum].photoEntries addObject:self.entryObject]; - JournalEntryObject* someObject = [[PhotoAlbum sharedPhotoAlbum].photoEntries objectAtIndex:0]; - NSLog(@"SAVED TITLE : %@", someObject.savedTitle); - - // UINavigationController *navController = [self.tabBarController.viewControllers objectAtIndex:1]; - - // EntryListTableViewController* viewcontroller = [navController.viewControllers firstObject]; - - + // JournalEntryObject* someObject = [[PhotoAlbum sharedPhotoAlbum].photoEntries objectAtIndex:0]; + // NSLog(@"SAVED TITLE : %@", someObject.savedImageEntry); +// UINavigationController *navController = [self.tabBarController.viewControllers objectAtIndex:1]; +// +// EntryListTableViewController* viewcontroller = [navController.viewControllers firstObject]; +// +// +// [self dismissViewControllerAnimated:NO completion:nil]; diff --git a/UNIT2PracticeProject/RootViewController.h b/UNIT2PracticeProject/RootViewController.h index 66397ac..7e27ff4 100644 --- a/UNIT2PracticeProject/RootViewController.h +++ b/UNIT2PracticeProject/RootViewController.h @@ -16,7 +16,7 @@ //@property (nonatomic) NSMutableArray* pageEntries; -@property (nonatomic) NSUInteger index; +//@property (nonatomic) NSUInteger index; @property (nonatomic) NSString* titleSelected; diff --git a/UNIT2PracticeProject/RootViewController.m b/UNIT2PracticeProject/RootViewController.m index b872734..9d7a8d8 100644 --- a/UNIT2PracticeProject/RootViewController.m +++ b/UNIT2PracticeProject/RootViewController.m @@ -25,8 +25,6 @@ @implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; - NSLog(@"passed %@",self.titleSelected); - // Do any additional setup after loading the view, typically from a nib. // Configure the page view controller and add it as a child view controller. self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; @@ -34,7 +32,6 @@ - (void)viewDidLoad { DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard]; NSArray *viewControllers = @[startingViewController]; - [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; self.pageViewController.dataSource = self.modelController; From fde701f4a9956d791302f10f90e187011d55ed61 Mon Sep 17 00:00:00 2001 From: Bereket Ghebremedhin Date: Mon, 19 Oct 2015 20:42:27 -0400 Subject: [PATCH 03/23] changed some colors --- UNIT2PracticeProject/Base.lproj/Main.storyboard | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index 7a06391..2345470 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -318,7 +318,7 @@ - + @@ -337,7 +337,7 @@ - + From 5096d4ebeb5ac499196e3476d5e49801ea5bb13a Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 19 Oct 2015 21:40:07 -0400 Subject: [PATCH 04/23] V1 in the house --- .DS_Store | Bin 0 -> 6148 bytes Podfile | 2 + Podfile.lock | 51 + .../AFNetworking/AFHTTPRequestOperation.h | 70 + .../AFNetworking/AFHTTPRequestOperation.m | 206 ++ .../AFHTTPRequestOperationManager.h | 326 +++ .../AFHTTPRequestOperationManager.m | 284 +++ .../AFNetworking/AFHTTPSessionManager.h | 253 ++ .../AFNetworking/AFHTTPSessionManager.m | 323 +++ .../AFNetworkReachabilityManager.h | 207 ++ .../AFNetworkReachabilityManager.m | 262 ++ Pods/AFNetworking/AFNetworking/AFNetworking.h | 46 + .../AFNetworking/AFSecurityPolicy.h | 142 ++ .../AFNetworking/AFSecurityPolicy.m | 311 +++ .../AFNetworking/AFURLConnectionOperation.h | 344 +++ .../AFNetworking/AFURLConnectionOperation.m | 792 ++++++ .../AFNetworking/AFURLRequestSerialization.h | 473 ++++ .../AFNetworking/AFURLRequestSerialization.m | 1425 +++++++++++ .../AFNetworking/AFURLResponseSerialization.h | 311 +++ .../AFNetworking/AFURLResponseSerialization.m | 825 +++++++ .../AFNetworking/AFURLSessionManager.h | 554 +++++ .../AFNetworking/AFURLSessionManager.m | 1171 +++++++++ Pods/AFNetworking/LICENSE | 19 + Pods/AFNetworking/README.md | 394 +++ .../AFNetworkActivityIndicatorManager.h | 80 + .../AFNetworkActivityIndicatorManager.m | 170 ++ .../UIActivityIndicatorView+AFNetworking.h | 63 + .../UIActivityIndicatorView+AFNetworking.m | 171 ++ .../UIAlertView+AFNetworking.h | 99 + .../UIAlertView+AFNetworking.m | 141 ++ .../UIButton+AFNetworking.h | 186 ++ .../UIButton+AFNetworking.m | 293 +++ .../UIKit+AFNetworking/UIImage+AFNetworking.h | 35 + .../UIImageView+AFNetworking.h | 146 ++ .../UIImageView+AFNetworking.m | 215 ++ .../UIKit+AFNetworking/UIKit+AFNetworking.h | 39 + .../UIProgressView+AFNetworking.h | 91 + .../UIProgressView+AFNetworking.m | 182 ++ .../UIRefreshControl+AFNetworking.h | 68 + .../UIRefreshControl+AFNetworking.m | 166 ++ .../UIWebView+AFNetworking.h | 86 + .../UIWebView+AFNetworking.m | 159 ++ Pods/Bolts/Bolts/Common/BFCancellationToken.h | 38 + Pods/Bolts/Bolts/Common/BFCancellationToken.m | 139 ++ .../Common/BFCancellationTokenRegistration.h | 25 + .../Common/BFCancellationTokenRegistration.m | 73 + .../Bolts/Common/BFCancellationTokenSource.h | 56 + .../Bolts/Common/BFCancellationTokenSource.m | 60 + Pods/Bolts/Bolts/Common/BFDefines.h | 18 + Pods/Bolts/Bolts/Common/BFExecutor.h | 58 + Pods/Bolts/Bolts/Common/BFExecutor.m | 112 + Pods/Bolts/Bolts/Common/BFTask.h | 259 ++ Pods/Bolts/Bolts/Common/BFTask.m | 470 ++++ .../Bolts/Common/BFTaskCompletionSource.h | 87 + .../Bolts/Common/BFTaskCompletionSource.m | 83 + Pods/Bolts/Bolts/Common/Bolts.h | 43 + Pods/Bolts/Bolts/Common/Bolts.m | 21 + Pods/Bolts/Bolts/Common/BoltsVersion.h | 1 + Pods/Bolts/Bolts/iOS/BFAppLink.h | 49 + Pods/Bolts/Bolts/iOS/BFAppLink.m | 62 + Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h | 93 + Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m | 248 ++ Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h | 30 + .../iOS/BFAppLinkReturnToRefererController.h | 87 + .../iOS/BFAppLinkReturnToRefererController.m | 230 ++ .../Bolts/iOS/BFAppLinkReturnToRefererView.h | 77 + .../Bolts/iOS/BFAppLinkReturnToRefererView.m | 269 ++ .../BFAppLinkReturnToRefererView_Internal.h | 17 + Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h | 33 + Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m | 33 + Pods/Bolts/Bolts/iOS/BFAppLink_Internal.h | 23 + Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h | 45 + Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m | 62 + .../Bolts/iOS/BFMeasurementEvent_Internal.h | 19 + Pods/Bolts/Bolts/iOS/BFURL.h | 75 + Pods/Bolts/Bolts/iOS/BFURL.m | 149 ++ Pods/Bolts/Bolts/iOS/BFURL_Internal.h | 15 + .../Bolts/iOS/BFWebViewAppLinkResolver.h | 26 + .../Bolts/iOS/BFWebViewAppLinkResolver.m | 298 +++ Pods/Bolts/LICENSE | 30 + Pods/Bolts/README.md | 682 +++++ .../FBSDKCoreKit/FBSDKAccessToken.h | 166 ++ .../FBSDKCoreKit/FBSDKAccessToken.m | 200 ++ .../FBSDKCoreKit/FBSDKAppEvents.h | 462 ++++ .../FBSDKCoreKit/FBSDKAppEvents.m | 831 +++++++ .../FBSDKCoreKit/FBSDKAppLinkResolver.h | 82 + .../FBSDKCoreKit/FBSDKAppLinkResolver.m | 195 ++ .../FBSDKCoreKit/FBSDKAppLinkUtility.h | 55 + .../FBSDKCoreKit/FBSDKAppLinkUtility.m | 80 + .../FBSDKCoreKit/FBSDKApplicationDelegate.h | 74 + .../FBSDKCoreKit/FBSDKApplicationDelegate.m | 430 ++++ .../FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h | 26 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m | 430 ++++ .../FBSDKCoreKit/FBSDKConstants.h | 210 ++ .../FBSDKCoreKit/FBSDKConstants.m | 34 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h | 33 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h | 38 + .../FBSDKGraphErrorRecoveryProcessor.h | 97 + .../FBSDKGraphErrorRecoveryProcessor.m | 155 ++ .../FBSDKCoreKit/FBSDKGraphRequest.h | 120 + .../FBSDKCoreKit/FBSDKGraphRequest.m | 204 ++ .../FBSDKGraphRequestConnection.h | 325 +++ .../FBSDKGraphRequestConnection.m | 1011 ++++++++ .../FBSDKGraphRequestDataAttachment.h | 52 + .../FBSDKGraphRequestDataAttachment.m | 41 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h | 39 + .../FBSDKCoreKit/FBSDKMutableCopying.h | 35 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h | 148 ++ .../FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m | 268 ++ .../FBSDKCoreKit/FBSDKProfilePictureView.h | 59 + .../FBSDKCoreKit/FBSDKProfilePictureView.m | 368 +++ .../FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h | 209 ++ .../FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m | 223 ++ .../FBSDKCoreKit/FBSDKTestUsersManager.h | 102 + .../FBSDKCoreKit/FBSDKTestUsersManager.m | 328 +++ .../FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h | 55 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m | 90 + .../AppEvents/FBSDKAppEvents+Internal.h | 158 ++ .../AppEvents/FBSDKAppEventsDeviceInfo.h | 25 + .../AppEvents/FBSDKAppEventsDeviceInfo.m | 252 ++ .../Internal/AppEvents/FBSDKAppEventsState.h | 38 + .../Internal/AppEvents/FBSDKAppEventsState.m | 161 ++ .../AppEvents/FBSDKAppEventsStateManager.h | 34 + .../AppEvents/FBSDKAppEventsStateManager.m | 78 + .../AppEvents/FBSDKAppEventsUtility.h | 57 + .../AppEvents/FBSDKAppEventsUtility.m | 305 +++ .../Internal/AppEvents/FBSDKPaymentObserver.h | 25 + .../Internal/AppEvents/FBSDKPaymentObserver.m | 281 +++ .../Internal/AppEvents/FBSDKTimeSpentData.h | 36 + .../Internal/AppEvents/FBSDKTimeSpentData.m | 305 +++ .../FBSDKBoltsMeasurementEventListener.h | 23 + .../FBSDKBoltsMeasurementEventListener.m | 78 + .../Internal/Base64/FBSDKBase64.h | 51 + .../Internal/Base64/FBSDKBase64.m | 133 + .../Internal/BridgeAPI/FBSDKBridgeAPICrypto.h | 31 + .../Internal/BridgeAPI/FBSDKBridgeAPICrypto.m | 139 ++ .../BridgeAPI/FBSDKBridgeAPIProtocol.h | 44 + .../BridgeAPI/FBSDKBridgeAPIProtocolType.h | 25 + .../BridgeAPI/FBSDKBridgeAPIRequest+Private.h | 35 + .../BridgeAPI/FBSDKBridgeAPIRequest.h | 44 + .../BridgeAPI/FBSDKBridgeAPIRequest.m | 166 ++ .../BridgeAPI/FBSDKBridgeAPIResponse.h | 39 + .../BridgeAPI/FBSDKBridgeAPIResponse.m | 135 + .../Internal/BridgeAPI/FBSDKURLOpening.h | 30 + .../FBSDKBridgeAPIProtocolNativeV1.h | 70 + .../FBSDKBridgeAPIProtocolNativeV1.m | 338 +++ .../FBSDKBridgeAPIProtocolWebV1.h | 25 + .../FBSDKBridgeAPIProtocolWebV1.m | 116 + .../FBSDKBridgeAPIProtocolWebV2.h | 25 + .../FBSDKBridgeAPIProtocolWebV2.m | 130 + .../Internal/Cryptography/FBSDKCrypto.h | 63 + .../Internal/Cryptography/FBSDKCrypto.m | 287 +++ .../FBSDKErrorRecoveryAttempter.h | 34 + .../FBSDKErrorRecoveryAttempter.m | 56 + .../_FBSDKTemporaryErrorRecoveryAttempter.h | 23 + .../_FBSDKTemporaryErrorRecoveryAttempter.m | 28 + .../FBSDKApplicationDelegate+Internal.h | 51 + .../Internal/FBSDKAudioResourceLoader.h | 36 + .../Internal/FBSDKAudioResourceLoader.m | 151 ++ .../Internal/FBSDKContainerViewController.h | 35 + .../Internal/FBSDKContainerViewController.m | 78 + .../Internal/FBSDKCoreKit+Internal.h | 68 + .../Internal/FBSDKDynamicFrameworkLoader.h | 236 ++ .../Internal/FBSDKDynamicFrameworkLoader.m | 556 +++++ .../FBSDKCoreKit/Internal/FBSDKError.h | 56 + .../FBSDKCoreKit/Internal/FBSDKError.m | 163 ++ .../Internal/FBSDKInternalUtility.h | 321 +++ .../Internal/FBSDKInternalUtility.m | 666 +++++ .../FBSDKCoreKit/Internal/FBSDKLogger.h | 88 + .../FBSDKCoreKit/Internal/FBSDKLogger.m | 219 ++ .../FBSDKCoreKit/Internal/FBSDKMath.h | 38 + .../FBSDKCoreKit/Internal/FBSDKMath.m | 159 ++ .../Internal/FBSDKMonotonicTime.h | 67 + .../Internal/FBSDKMonotonicTime.m | 86 + .../Internal/FBSDKProfile+Internal.h | 26 + .../Internal/FBSDKSettings+Internal.h | 36 + .../Internal/FBSDKSystemAccountStoreAdapter.h | 82 + .../Internal/FBSDKSystemAccountStoreAdapter.m | 275 +++ .../FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h | 32 + .../FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m | 43 + .../FBSDKCoreKit/Internal/FBSDKTypeUtility.h | 32 + .../FBSDKCoreKit/Internal/FBSDKTypeUtility.m | 120 + .../Network/FBSDKGraphRequest+Internal.h | 56 + .../Internal/Network/FBSDKGraphRequestBody.h | 47 + .../Internal/Network/FBSDKGraphRequestBody.m | 131 + .../FBSDKGraphRequestConnection+Internal.h | 25 + .../Network/FBSDKGraphRequestMetadata.h | 40 + .../Network/FBSDKGraphRequestMetadata.m | 62 + .../FBSDKGraphRequestPiggybackManager.h | 30 + .../FBSDKGraphRequestPiggybackManager.m | 140 ++ .../Internal/Network/FBSDKURLConnection.h | 51 + .../Internal/Network/FBSDKURLConnection.m | 191 ++ .../FBSDKDialogConfiguration.h | 34 + .../FBSDKDialogConfiguration.m | 78 + .../FBSDKErrorConfiguration.h | 36 + .../FBSDKErrorConfiguration.m | 176 ++ .../FBSDKErrorRecoveryConfiguration.h | 35 + .../FBSDKErrorRecoveryConfiguration.m | 86 + .../FBSDKServerConfiguration+Internal.h | 25 + .../FBSDKServerConfiguration.h | 74 + .../FBSDKServerConfiguration.m | 219 ++ ...FBSDKServerConfigurationManager+Internal.h | 31 + .../FBSDKServerConfigurationManager.h | 40 + .../FBSDKServerConfigurationManager.m | 357 +++ .../TokenCaching/FBSDKAccessTokenCache.h | 27 + .../TokenCaching/FBSDKAccessTokenCache.m | 82 + .../TokenCaching/FBSDKAccessTokenCacheV3.h | 30 + .../TokenCaching/FBSDKAccessTokenCacheV3.m | 79 + .../TokenCaching/FBSDKAccessTokenCacheV3_17.h | 25 + .../TokenCaching/FBSDKAccessTokenCacheV3_17.m | 63 + .../TokenCaching/FBSDKAccessTokenCacheV3_21.h | 25 + .../TokenCaching/FBSDKAccessTokenCacheV3_21.m | 66 + .../TokenCaching/FBSDKAccessTokenCacheV4.h | 26 + .../TokenCaching/FBSDKAccessTokenCacheV4.m | 97 + .../TokenCaching/FBSDKAccessTokenCaching.h | 31 + .../TokenCaching/FBSDKKeychainStore.h | 40 + .../TokenCaching/FBSDKKeychainStore.m | 161 ++ .../FBSDKKeychainStoreViaBundleID.h | 29 + .../FBSDKKeychainStoreViaBundleID.m | 50 + .../Internal/UI/FBSDKButton+Subclass.h | 59 + .../FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h | 25 + .../FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m | 89 + .../FBSDKCoreKit/Internal/UI/FBSDKColor.h | 22 + .../FBSDKCoreKit/Internal/UI/FBSDKColor.m | 31 + .../FBSDKCoreKit/Internal/UI/FBSDKIcon.h | 31 + .../FBSDKCoreKit/Internal/UI/FBSDKIcon.m | 64 + .../FBSDKCoreKit/Internal/UI/FBSDKLogo.h | 25 + .../FBSDKCoreKit/Internal/UI/FBSDKLogo.m | 59 + .../Internal/UI/FBSDKMaleSilhouetteIcon.h | 25 + .../Internal/UI/FBSDKMaleSilhouetteIcon.m | 51 + .../FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h | 89 + .../Internal/UI/FBSDKViewImpressionTracker.h | 29 + .../Internal/UI/FBSDKViewImpressionTracker.m | 97 + .../Internal/WebDialog/FBSDKWebDialog.h | 44 + .../Internal/WebDialog/FBSDKWebDialog.m | 340 +++ .../Internal/WebDialog/FBSDKWebDialogView.h | 39 + .../Internal/WebDialog/FBSDKWebDialogView.m | 188 ++ Pods/FBSDKCoreKit/LICENSE | 17 + Pods/FBSDKCoreKit/README.mdown | 46 + .../FBSDKShareKit/FBSDKAppGroupAddDialog.h | 101 + .../FBSDKShareKit/FBSDKAppGroupAddDialog.m | 185 ++ .../FBSDKShareKit/FBSDKAppGroupContent.h | 68 + .../FBSDKShareKit/FBSDKAppGroupContent.m | 109 + .../FBSDKShareKit/FBSDKAppGroupJoinDialog.h | 99 + .../FBSDKShareKit/FBSDKAppGroupJoinDialog.m | 167 ++ .../FBSDKShareKit/FBSDKAppInviteContent.h | 54 + .../FBSDKShareKit/FBSDKAppInviteContent.m | 99 + .../FBSDKShareKit/FBSDKAppInviteDialog.h | 111 + .../FBSDKShareKit/FBSDKAppInviteDialog.m | 197 ++ .../FBSDKShareKit/FBSDKGameRequestContent.h | 131 + .../FBSDKShareKit/FBSDKGameRequestContent.m | 164 ++ .../FBSDKShareKit/FBSDKGameRequestDialog.h | 105 + .../FBSDKShareKit/FBSDKGameRequestDialog.m | 265 ++ .../FBSDKShareKit/FBSDKLikeButton.h | 42 + .../FBSDKShareKit/FBSDKLikeButton.m | 294 +++ .../FBSDKShareKit/FBSDKLikeControl.h | 139 ++ .../FBSDKShareKit/FBSDKLikeControl.m | 664 +++++ .../FBSDKShareKit/FBSDKLikeObjectType.h | 40 + .../FBSDKShareKit/FBSDKLikeObjectType.m | 32 + .../FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h | 45 + .../FBSDKShareKit/FBSDKMessageDialog.h | 35 + .../FBSDKShareKit/FBSDKMessageDialog.m | 221 ++ .../FBSDKShareKit/FBSDKSendButton.h | 32 + .../FBSDKShareKit/FBSDKSendButton.m | 97 + .../FBSDKShareKit/FBSDKShareAPI.h | 79 + .../FBSDKShareKit/FBSDKShareAPI.m | 701 ++++++ .../FBSDKShareKit/FBSDKShareButton.h | 32 + .../FBSDKShareKit/FBSDKShareButton.m | 90 + .../FBSDKShareKit/FBSDKShareConstants.h | 50 + .../FBSDKShareKit/FBSDKShareConstants.m | 24 + .../FBSDKShareKit/FBSDKShareDialog.h | 52 + .../FBSDKShareKit/FBSDKShareDialog.m | 781 ++++++ .../FBSDKShareKit/FBSDKShareDialogMode.h | 64 + .../FBSDKShareKit/FBSDKShareDialogMode.m | 51 + .../FBSDKShareKit/FBSDKShareKit.h | 47 + .../FBSDKShareKit/FBSDKShareLinkContent.h | 56 + .../FBSDKShareKit/FBSDKShareLinkContent.m | 150 ++ .../FBSDKShareKit/FBSDKShareOpenGraphAction.h | 69 + .../FBSDKShareKit/FBSDKShareOpenGraphAction.m | 117 + .../FBSDKShareOpenGraphContent.h | 49 + .../FBSDKShareOpenGraphContent.m | 132 + .../FBSDKShareKit/FBSDKShareOpenGraphObject.h | 58 + .../FBSDKShareKit/FBSDKShareOpenGraphObject.m | 63 + .../FBSDKShareOpenGraphValueContainer.h | 160 ++ .../FBSDKShareOpenGraphValueContainer.m | 238 ++ .../FBSDKShareKit/FBSDKSharePhoto.h | 80 + .../FBSDKShareKit/FBSDKSharePhoto.m | 119 + .../FBSDKShareKit/FBSDKSharePhotoContent.h | 41 + .../FBSDKShareKit/FBSDKSharePhotoContent.m | 133 + .../FBSDKShareKit/FBSDKShareVideo.h | 48 + .../FBSDKShareKit/FBSDKShareVideo.m | 89 + .../FBSDKShareKit/FBSDKShareVideoContent.h | 49 + .../FBSDKShareKit/FBSDKShareVideoContent.m | 130 + .../FBSDKShareKit/FBSDKSharing.h | 110 + .../FBSDKShareKit/FBSDKSharingButton.h | 35 + .../FBSDKShareKit/FBSDKSharingContent.h | 56 + .../Internal/FBSDKCheckmarkIcon.h | 25 + .../Internal/FBSDKCheckmarkIcon.m | 43 + ...SDKGameRequestFrictionlessRecipientCache.h | 26 + ...SDKGameRequestFrictionlessRecipientCache.m | 100 + .../Internal/FBSDKLikeActionController.h | 48 + .../Internal/FBSDKLikeActionController.m | 1062 ++++++++ .../Internal/FBSDKLikeActionControllerCache.h | 31 + .../Internal/FBSDKLikeActionControllerCache.m | 116 + .../Internal/FBSDKLikeBoxBorderView.h | 33 + .../Internal/FBSDKLikeBoxBorderView.m | 323 +++ .../FBSDKShareKit/Internal/FBSDKLikeBoxView.h | 43 + .../FBSDKShareKit/Internal/FBSDKLikeBoxView.m | 108 + .../Internal/FBSDKLikeButton+Internal.h | 29 + .../Internal/FBSDKLikeButtonPopWAV.h | 24 + .../Internal/FBSDKLikeButtonPopWAV.m | 36 + .../Internal/FBSDKLikeControl+Internal.h | 27 + .../FBSDKShareKit/Internal/FBSDKLikeDialog.h | 49 + .../FBSDKShareKit/Internal/FBSDKLikeDialog.m | 159 ++ .../Internal/FBSDKMessengerIcon.h | 25 + .../Internal/FBSDKMessengerIcon.m | 50 + .../Internal/FBSDKShareDefines.h | 30 + .../FBSDKShareKit/Internal/FBSDKShareError.h | 25 + .../FBSDKShareKit/Internal/FBSDKShareError.m | 30 + .../Internal/FBSDKShareKit+Internal.h | 26 + .../Internal/FBSDKShareLinkContent+Internal.h | 26 + ...SDKShareOpenGraphValueContainer+Internal.h | 29 + .../Internal/FBSDKShareUtility.h | 55 + .../Internal/FBSDKShareUtility.m | 727 ++++++ Pods/FBSDKShareKit/LICENSE | 17 + Pods/FBSDKShareKit/README.mdown | 46 + .../AFNetworking/AFHTTPRequestOperation.h | 1 + .../AFHTTPRequestOperationManager.h | 1 + .../AFNetworking/AFHTTPSessionManager.h | 1 + .../AFNetworkActivityIndicatorManager.h | 1 + .../AFNetworkReachabilityManager.h | 1 + .../Private/AFNetworking/AFNetworking.h | 1 + .../Private/AFNetworking/AFSecurityPolicy.h | 1 + .../AFNetworking/AFURLConnectionOperation.h | 1 + .../AFNetworking/AFURLRequestSerialization.h | 1 + .../AFNetworking/AFURLResponseSerialization.h | 1 + .../AFNetworking/AFURLSessionManager.h | 1 + .../UIActivityIndicatorView+AFNetworking.h | 1 + .../AFNetworking/UIAlertView+AFNetworking.h | 1 + .../AFNetworking/UIButton+AFNetworking.h | 1 + .../AFNetworking/UIImage+AFNetworking.h | 1 + .../AFNetworking/UIImageView+AFNetworking.h | 1 + .../Private/AFNetworking/UIKit+AFNetworking.h | 1 + .../UIProgressView+AFNetworking.h | 1 + .../UIRefreshControl+AFNetworking.h | 1 + .../AFNetworking/UIWebView+AFNetworking.h | 1 + Pods/Headers/Private/Bolts/BFAppLink.h | 1 + .../Private/Bolts/BFAppLinkNavigation.h | 1 + .../Private/Bolts/BFAppLinkResolving.h | 1 + .../BFAppLinkReturnToRefererController.h | 1 + .../Bolts/BFAppLinkReturnToRefererView.h | 1 + .../BFAppLinkReturnToRefererView_Internal.h | 1 + Pods/Headers/Private/Bolts/BFAppLinkTarget.h | 1 + .../Private/Bolts/BFAppLink_Internal.h | 1 + .../Private/Bolts/BFCancellationToken.h | 1 + .../Bolts/BFCancellationTokenRegistration.h | 1 + .../Private/Bolts/BFCancellationTokenSource.h | 1 + Pods/Headers/Private/Bolts/BFDefines.h | 1 + Pods/Headers/Private/Bolts/BFExecutor.h | 1 + .../Private/Bolts/BFMeasurementEvent.h | 1 + .../Bolts/BFMeasurementEvent_Internal.h | 1 + Pods/Headers/Private/Bolts/BFTask.h | 1 + .../Private/Bolts/BFTaskCompletionSource.h | 1 + Pods/Headers/Private/Bolts/BFURL.h | 1 + Pods/Headers/Private/Bolts/BFURL_Internal.h | 1 + .../Private/Bolts/BFWebViewAppLinkResolver.h | 1 + Pods/Headers/Private/Bolts/Bolts.h | 1 + Pods/Headers/Private/Bolts/BoltsVersion.h | 1 + .../Private/FBSDKCoreKit/FBSDKAccessToken.h | 1 + .../Private/FBSDKCoreKit/FBSDKAppEvents.h | 1 + .../FBSDKCoreKit/FBSDKAppLinkResolver.h | 1 + .../FBSDKCoreKit/FBSDKAppLinkUtility.h | 1 + .../FBSDKCoreKit/FBSDKApplicationDelegate.h | 1 + .../Private/FBSDKCoreKit/FBSDKButton.h | 1 + .../Private/FBSDKCoreKit/FBSDKConstants.h | 1 + .../Private/FBSDKCoreKit/FBSDKCopying.h | 1 + .../Private/FBSDKCoreKit/FBSDKCoreKit.h | 1 + .../AppEvents/FBSDKAppEvents+Internal.h | 1 + .../AppEvents/FBSDKAppEventsDeviceInfo.h | 1 + .../AppEvents/FBSDKAppEventsState.h | 1 + .../AppEvents/FBSDKAppEventsStateManager.h | 1 + .../AppEvents/FBSDKAppEventsUtility.h | 1 + .../AppEvents/FBSDKPaymentObserver.h | 1 + .../AppEvents/FBSDKTimeSpentData.h | 1 + .../FBSDKBoltsMeasurementEventListener.h | 1 + .../FBSDKCoreKit/Base64/FBSDKBase64.h | 1 + .../BridgeAPI/FBSDKBridgeAPICrypto.h | 1 + .../BridgeAPI/FBSDKBridgeAPIProtocol.h | 1 + .../BridgeAPI/FBSDKBridgeAPIProtocolType.h | 1 + .../BridgeAPI/FBSDKBridgeAPIRequest+Private.h | 1 + .../BridgeAPI/FBSDKBridgeAPIRequest.h | 1 + .../BridgeAPI/FBSDKBridgeAPIResponse.h | 1 + .../FBSDKCoreKit/BridgeAPI/FBSDKURLOpening.h | 1 + .../FBSDKBridgeAPIProtocolNativeV1.h | 1 + .../FBSDKBridgeAPIProtocolWebV1.h | 1 + .../FBSDKBridgeAPIProtocolWebV2.h | 1 + .../FBSDKCoreKit/Cryptography/FBSDKCrypto.h | 1 + .../FBSDKErrorRecoveryAttempter.h | 1 + .../_FBSDKTemporaryErrorRecoveryAttempter.h | 1 + .../FBSDKApplicationDelegate+Internal.h | 1 + .../FBSDKCoreKit/FBSDKAudioResourceLoader.h | 1 + .../FBSDKContainerViewController.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit+Internal.h | 1 + .../FBSDKDynamicFrameworkLoader.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKError.h | 1 + .../FBSDKCoreKit/FBSDKInternalUtility.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKLogger.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit/FBSDKMath.h | 1 + .../FBSDKCoreKit/FBSDKMonotonicTime.h | 1 + .../FBSDKCoreKit/FBSDKProfile+Internal.h | 1 + .../FBSDKCoreKit/FBSDKSettings+Internal.h | 1 + .../FBSDKSystemAccountStoreAdapter.h | 1 + .../FBSDKCoreKit/FBSDKTriStateBOOL.h | 1 + .../FBSDKCoreKit/FBSDKTypeUtility.h | 1 + .../Network/FBSDKGraphRequest+Internal.h | 1 + .../Network/FBSDKGraphRequestBody.h | 1 + .../FBSDKGraphRequestConnection+Internal.h | 1 + .../Network/FBSDKGraphRequestMetadata.h | 1 + .../FBSDKGraphRequestPiggybackManager.h | 1 + .../FBSDKCoreKit/Network/FBSDKURLConnection.h | 1 + .../FBSDKDialogConfiguration.h | 1 + .../FBSDKErrorConfiguration.h | 1 + .../FBSDKErrorRecoveryConfiguration.h | 1 + .../FBSDKServerConfiguration+Internal.h | 1 + .../FBSDKServerConfiguration.h | 1 + ...FBSDKServerConfigurationManager+Internal.h | 1 + .../FBSDKServerConfigurationManager.h | 1 + .../TokenCaching/FBSDKAccessTokenCache.h | 1 + .../TokenCaching/FBSDKAccessTokenCacheV3.h | 1 + .../TokenCaching/FBSDKAccessTokenCacheV3_17.h | 1 + .../TokenCaching/FBSDKAccessTokenCacheV3_21.h | 1 + .../TokenCaching/FBSDKAccessTokenCacheV4.h | 1 + .../TokenCaching/FBSDKAccessTokenCaching.h | 1 + .../TokenCaching/FBSDKKeychainStore.h | 1 + .../FBSDKKeychainStoreViaBundleID.h | 1 + .../FBSDKCoreKit/UI/FBSDKButton+Subclass.h | 1 + .../FBSDKCoreKit/UI/FBSDKCloseIcon.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKColor.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKIcon.h | 1 + .../FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKLogo.h | 1 + .../FBSDKCoreKit/UI/FBSDKMaleSilhouetteIcon.h | 1 + .../FBSDKCoreKit/UI/FBSDKUIUtility.h | 1 + .../UI/FBSDKViewImpressionTracker.h | 1 + .../FBSDKCoreKit/WebDialog/FBSDKWebDialog.h | 1 + .../WebDialog/FBSDKWebDialogView.h | 1 + .../FBSDKGraphErrorRecoveryProcessor.h | 1 + .../Private/FBSDKCoreKit/FBSDKGraphRequest.h | 1 + .../FBSDKGraphRequestConnection.h | 1 + .../FBSDKGraphRequestDataAttachment.h | 1 + .../Private/FBSDKCoreKit/FBSDKMacros.h | 1 + .../FBSDKCoreKit/FBSDKMutableCopying.h | 1 + .../Private/FBSDKCoreKit/FBSDKProfile.h | 1 + .../FBSDKCoreKit/FBSDKProfilePictureView.h | 1 + .../Private/FBSDKCoreKit/FBSDKSettings.h | 1 + .../FBSDKCoreKit/FBSDKTestUsersManager.h | 1 + .../Private/FBSDKCoreKit/FBSDKUtility.h | 1 + .../FBSDKShareKit/FBSDKAppGroupAddDialog.h | 1 + .../FBSDKShareKit/FBSDKAppGroupContent.h | 1 + .../FBSDKShareKit/FBSDKAppGroupJoinDialog.h | 1 + .../FBSDKShareKit/FBSDKAppInviteContent.h | 1 + .../FBSDKShareKit/FBSDKAppInviteDialog.h | 1 + .../FBSDKShareKit/FBSDKCheckmarkIcon.h | 1 + .../FBSDKShareKit/FBSDKGameRequestContent.h | 1 + .../FBSDKShareKit/FBSDKGameRequestDialog.h | 1 + ...SDKGameRequestFrictionlessRecipientCache.h | 1 + .../FBSDKShareKit/FBSDKLikeActionController.h | 1 + .../FBSDKLikeActionControllerCache.h | 1 + .../FBSDKShareKit/FBSDKLikeBoxBorderView.h | 1 + .../FBSDKShareKit/FBSDKLikeBoxView.h | 1 + .../FBSDKShareKit/FBSDKLikeButton+Internal.h | 1 + .../FBSDKShareKit/FBSDKLikeButton.h | 1 + .../FBSDKShareKit/FBSDKLikeButtonPopWAV.h | 1 + .../FBSDKShareKit/FBSDKLikeControl+Internal.h | 1 + .../FBSDKShareKit/FBSDKLikeControl.h | 1 + .../FBSDKShareKit/FBSDKLikeDialog.h | 1 + .../FBSDKShareKit/FBSDKLikeObjectType.h | 1 + .../FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h | 1 + .../FBSDKShareKit/FBSDKMessageDialog.h | 1 + .../FBSDKShareKit/FBSDKMessengerIcon.h | 1 + .../FBSDKShareKit/FBSDKSendButton.h | 1 + .../FBSDKShareKit/FBSDKShareAPI.h | 1 + .../FBSDKShareKit/FBSDKShareButton.h | 1 + .../FBSDKShareKit/FBSDKShareConstants.h | 1 + .../FBSDKShareKit/FBSDKShareDefines.h | 1 + .../FBSDKShareKit/FBSDKShareDialog.h | 1 + .../FBSDKShareKit/FBSDKShareDialogMode.h | 1 + .../FBSDKShareKit/FBSDKShareError.h | 1 + .../FBSDKShareKit/FBSDKShareKit+Internal.h | 1 + .../FBSDKShareKit/FBSDKShareKit.h | 1 + .../FBSDKShareLinkContent+Internal.h | 1 + .../FBSDKShareKit/FBSDKShareLinkContent.h | 1 + .../FBSDKShareKit/FBSDKShareOpenGraphAction.h | 1 + .../FBSDKShareOpenGraphContent.h | 1 + .../FBSDKShareKit/FBSDKShareOpenGraphObject.h | 1 + ...SDKShareOpenGraphValueContainer+Internal.h | 1 + .../FBSDKShareOpenGraphValueContainer.h | 1 + .../FBSDKShareKit/FBSDKSharePhoto.h | 1 + .../FBSDKShareKit/FBSDKSharePhotoContent.h | 1 + .../FBSDKShareKit/FBSDKShareUtility.h | 1 + .../FBSDKShareKit/FBSDKShareVideo.h | 1 + .../FBSDKShareKit/FBSDKShareVideoContent.h | 1 + .../FBSDKShareKit/FBSDKSharing.h | 1 + .../FBSDKShareKit/FBSDKSharingButton.h | 1 + .../FBSDKShareKit/FBSDKSharingContent.h | 1 + .../AFNetworking/AFHTTPRequestOperation.h | 1 + .../AFHTTPRequestOperationManager.h | 1 + .../AFNetworking/AFHTTPSessionManager.h | 1 + .../AFNetworkActivityIndicatorManager.h | 1 + .../AFNetworkReachabilityManager.h | 1 + .../Public/AFNetworking/AFNetworking.h | 1 + .../Public/AFNetworking/AFSecurityPolicy.h | 1 + .../AFNetworking/AFURLConnectionOperation.h | 1 + .../AFNetworking/AFURLRequestSerialization.h | 1 + .../AFNetworking/AFURLResponseSerialization.h | 1 + .../Public/AFNetworking/AFURLSessionManager.h | 1 + .../UIActivityIndicatorView+AFNetworking.h | 1 + .../AFNetworking/UIAlertView+AFNetworking.h | 1 + .../AFNetworking/UIButton+AFNetworking.h | 1 + .../AFNetworking/UIImage+AFNetworking.h | 1 + .../AFNetworking/UIImageView+AFNetworking.h | 1 + .../Public/AFNetworking/UIKit+AFNetworking.h | 1 + .../UIProgressView+AFNetworking.h | 1 + .../UIRefreshControl+AFNetworking.h | 1 + .../AFNetworking/UIWebView+AFNetworking.h | 1 + Pods/Headers/Public/Bolts/BFAppLink.h | 1 + .../Public/Bolts/BFAppLinkNavigation.h | 1 + .../Headers/Public/Bolts/BFAppLinkResolving.h | 1 + .../BFAppLinkReturnToRefererController.h | 1 + .../Bolts/BFAppLinkReturnToRefererView.h | 1 + .../BFAppLinkReturnToRefererView_Internal.h | 1 + Pods/Headers/Public/Bolts/BFAppLinkTarget.h | 1 + .../Headers/Public/Bolts/BFAppLink_Internal.h | 1 + .../Public/Bolts/BFCancellationToken.h | 1 + .../Bolts/BFCancellationTokenRegistration.h | 1 + .../Public/Bolts/BFCancellationTokenSource.h | 1 + Pods/Headers/Public/Bolts/BFDefines.h | 1 + Pods/Headers/Public/Bolts/BFExecutor.h | 1 + .../Headers/Public/Bolts/BFMeasurementEvent.h | 1 + .../Bolts/BFMeasurementEvent_Internal.h | 1 + Pods/Headers/Public/Bolts/BFTask.h | 1 + .../Public/Bolts/BFTaskCompletionSource.h | 1 + Pods/Headers/Public/Bolts/BFURL.h | 1 + Pods/Headers/Public/Bolts/BFURL_Internal.h | 1 + .../Public/Bolts/BFWebViewAppLinkResolver.h | 1 + Pods/Headers/Public/Bolts/Bolts.h | 1 + Pods/Headers/Public/Bolts/BoltsVersion.h | 1 + .../Public/FBSDKCoreKit/FBSDKAccessToken.h | 1 + .../Public/FBSDKCoreKit/FBSDKAppEvents.h | 1 + .../FBSDKCoreKit/FBSDKAppLinkResolver.h | 1 + .../Public/FBSDKCoreKit/FBSDKAppLinkUtility.h | 1 + .../FBSDKCoreKit/FBSDKApplicationDelegate.h | 1 + .../Headers/Public/FBSDKCoreKit/FBSDKButton.h | 1 + .../Public/FBSDKCoreKit/FBSDKConstants.h | 1 + .../Public/FBSDKCoreKit/FBSDKCopying.h | 1 + .../Public/FBSDKCoreKit/FBSDKCoreKit.h | 1 + .../FBSDKGraphErrorRecoveryProcessor.h | 1 + .../Public/FBSDKCoreKit/FBSDKGraphRequest.h | 1 + .../FBSDKGraphRequestConnection.h | 1 + .../FBSDKGraphRequestDataAttachment.h | 1 + .../Headers/Public/FBSDKCoreKit/FBSDKMacros.h | 1 + .../Public/FBSDKCoreKit/FBSDKMutableCopying.h | 1 + .../Public/FBSDKCoreKit/FBSDKProfile.h | 1 + .../FBSDKCoreKit/FBSDKProfilePictureView.h | 1 + .../Public/FBSDKCoreKit/FBSDKSettings.h | 1 + .../FBSDKCoreKit/FBSDKTestUsersManager.h | 1 + .../Public/FBSDKCoreKit/FBSDKUtility.h | 1 + .../FBSDKShareKit/FBSDKAppGroupAddDialog.h | 1 + .../FBSDKShareKit/FBSDKAppGroupContent.h | 1 + .../FBSDKShareKit/FBSDKAppGroupJoinDialog.h | 1 + .../FBSDKShareKit/FBSDKAppInviteContent.h | 1 + .../FBSDKShareKit/FBSDKAppInviteDialog.h | 1 + .../FBSDKShareKit/FBSDKGameRequestContent.h | 1 + .../FBSDKShareKit/FBSDKGameRequestDialog.h | 1 + .../FBSDKShareKit/FBSDKLikeButton.h | 1 + .../FBSDKShareKit/FBSDKLikeControl.h | 1 + .../FBSDKShareKit/FBSDKLikeObjectType.h | 1 + .../FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h | 1 + .../FBSDKShareKit/FBSDKMessageDialog.h | 1 + .../FBSDKShareKit/FBSDKSendButton.h | 1 + .../FBSDKShareKit/FBSDKShareAPI.h | 1 + .../FBSDKShareKit/FBSDKShareButton.h | 1 + .../FBSDKShareKit/FBSDKShareConstants.h | 1 + .../FBSDKShareKit/FBSDKShareDialog.h | 1 + .../FBSDKShareKit/FBSDKShareDialogMode.h | 1 + .../FBSDKShareKit/FBSDKShareKit.h | 1 + .../FBSDKShareKit/FBSDKShareLinkContent.h | 1 + .../FBSDKShareKit/FBSDKShareOpenGraphAction.h | 1 + .../FBSDKShareOpenGraphContent.h | 1 + .../FBSDKShareKit/FBSDKShareOpenGraphObject.h | 1 + .../FBSDKShareOpenGraphValueContainer.h | 1 + .../FBSDKShareKit/FBSDKSharePhoto.h | 1 + .../FBSDKShareKit/FBSDKSharePhotoContent.h | 1 + .../FBSDKShareKit/FBSDKShareVideo.h | 1 + .../FBSDKShareKit/FBSDKShareVideoContent.h | 1 + .../FBSDKShareKit/FBSDKSharing.h | 1 + .../FBSDKShareKit/FBSDKSharingButton.h | 1 + .../FBSDKShareKit/FBSDKSharingContent.h | 1 + Pods/Manifest.lock | 51 + Pods/Pods.xcodeproj/project.pbxproj | 2193 +++++++++++++++++ .../AFNetworking/AFNetworking-dummy.m | 5 + .../AFNetworking/AFNetworking-prefix.pch | 11 + .../AFNetworking/AFNetworking.xcconfig | 5 + Pods/Target Support Files/Bolts/Bolts-dummy.m | 5 + .../Bolts/Bolts-prefix.pch | 4 + .../Target Support Files/Bolts/Bolts.xcconfig | 4 + .../FBSDKCoreKit/FBSDKCoreKit-dummy.m | 5 + .../FBSDKCoreKit/FBSDKCoreKit-prefix.pch | 4 + .../FBSDKCoreKit/FBSDKCoreKit.xcconfig | 5 + .../FBSDKShareKit/FBSDKShareKit-dummy.m | 5 + .../FBSDKShareKit/FBSDKShareKit-prefix.pch | 4 + .../FBSDKShareKit/FBSDKShareKit.xcconfig | 5 + .../Pods/Pods-acknowledgements.markdown | 101 + .../Pods/Pods-acknowledgements.plist | 143 ++ Pods/Target Support Files/Pods/Pods-dummy.m | 5 + .../Pods/Pods-frameworks.sh | 84 + .../Pods/Pods-resources.sh | 95 + .../Pods/Pods.debug.xcconfig | 5 + .../Pods/Pods.release.xcconfig | 5 + .../project.pbxproj | 111 +- .../contents.xcworkspacedata | 10 + .../615377296_o.imageset/615377296_o.jpg | Bin 0 -> 111815 bytes .../615377296_o.imageset/Contents.json | 21 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/Main.storyboard | 258 +- UNIT2PracticeProject/CollectionViewCell.h | 17 + UNIT2PracticeProject/CollectionViewCell.m | 13 + .../DetailMeetUpViewController.h | 16 + .../DetailMeetUpViewController.m | 38 + UNIT2PracticeProject/MeetUpCVC.h | 16 + UNIT2PracticeProject/MeetUpCVC.m | 175 ++ UNIT2PracticeProject/ObjectsInMeetUp.h | 19 + UNIT2PracticeProject/ObjectsInMeetUp.m | 13 + 632 files changed, 48995 insertions(+), 9 deletions(-) create mode 100644 .DS_Store create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h create mode 100644 Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m create mode 100644 Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h create mode 100644 Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m create mode 100644 Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h create mode 100644 Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m create mode 100644 Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h create mode 100644 Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m create mode 100644 Pods/AFNetworking/AFNetworking/AFNetworking.h create mode 100644 Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h create mode 100644 Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m create mode 100644 Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h create mode 100644 Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m create mode 100644 Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h create mode 100644 Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m create mode 100644 Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h create mode 100644 Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m create mode 100644 Pods/AFNetworking/AFNetworking/AFURLSessionManager.h create mode 100644 Pods/AFNetworking/AFNetworking/AFURLSessionManager.m create mode 100644 Pods/AFNetworking/LICENSE create mode 100644 Pods/AFNetworking/README.md create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h create mode 100644 Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m create mode 100644 Pods/Bolts/Bolts/Common/BFCancellationToken.h create mode 100644 Pods/Bolts/Bolts/Common/BFCancellationToken.m create mode 100644 Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h create mode 100644 Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m create mode 100644 Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h create mode 100644 Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m create mode 100644 Pods/Bolts/Bolts/Common/BFDefines.h create mode 100644 Pods/Bolts/Bolts/Common/BFExecutor.h create mode 100644 Pods/Bolts/Bolts/Common/BFExecutor.m create mode 100644 Pods/Bolts/Bolts/Common/BFTask.h create mode 100644 Pods/Bolts/Bolts/Common/BFTask.m create mode 100644 Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h create mode 100644 Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m create mode 100644 Pods/Bolts/Bolts/Common/Bolts.h create mode 100644 Pods/Bolts/Bolts/Common/Bolts.m create mode 100644 Pods/Bolts/Bolts/Common/BoltsVersion.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLink.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLink.m create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m create mode 100644 Pods/Bolts/Bolts/iOS/BFAppLink_Internal.h create mode 100644 Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h create mode 100644 Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m create mode 100644 Pods/Bolts/Bolts/iOS/BFMeasurementEvent_Internal.h create mode 100644 Pods/Bolts/Bolts/iOS/BFURL.h create mode 100644 Pods/Bolts/Bolts/iOS/BFURL.m create mode 100644 Pods/Bolts/Bolts/iOS/BFURL_Internal.h create mode 100644 Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h create mode 100644 Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m create mode 100644 Pods/Bolts/LICENSE create mode 100644 Pods/Bolts/README.md create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h create mode 100644 Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m create mode 100644 Pods/FBSDKCoreKit/LICENSE create mode 100644 Pods/FBSDKCoreKit/README.mdown create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h create mode 100644 Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m create mode 100644 Pods/FBSDKShareKit/LICENSE create mode 100644 Pods/FBSDKShareKit/README.mdown create mode 120000 Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h create mode 120000 Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h create mode 120000 Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h create mode 120000 Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h create mode 120000 Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h create mode 120000 Pods/Headers/Private/AFNetworking/AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h create mode 120000 Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h create mode 120000 Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h create mode 120000 Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h create mode 120000 Pods/Headers/Private/AFNetworking/AFURLSessionManager.h create mode 120000 Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h create mode 120000 Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLink.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLinkNavigation.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLinkResolving.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLinkTarget.h create mode 120000 Pods/Headers/Private/Bolts/BFAppLink_Internal.h create mode 120000 Pods/Headers/Private/Bolts/BFCancellationToken.h create mode 120000 Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h create mode 120000 Pods/Headers/Private/Bolts/BFCancellationTokenSource.h create mode 120000 Pods/Headers/Private/Bolts/BFDefines.h create mode 120000 Pods/Headers/Private/Bolts/BFExecutor.h create mode 120000 Pods/Headers/Private/Bolts/BFMeasurementEvent.h create mode 120000 Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h create mode 120000 Pods/Headers/Private/Bolts/BFTask.h create mode 120000 Pods/Headers/Private/Bolts/BFTaskCompletionSource.h create mode 120000 Pods/Headers/Private/Bolts/BFURL.h create mode 120000 Pods/Headers/Private/Bolts/BFURL_Internal.h create mode 120000 Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h create mode 120000 Pods/Headers/Private/Bolts/Bolts.h create mode 120000 Pods/Headers/Private/Bolts/BoltsVersion.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEvents+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsDeviceInfo.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsState.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsStateManager.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsUtility.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKPaymentObserver.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKTimeSpentData.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppLink/FBSDKBoltsMeasurementEventListener.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Base64/FBSDKBase64.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPICrypto.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocol.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocolType.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest+Private.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIResponse.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKURLOpening.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Cryptography/FBSDKCrypto.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/FBSDKErrorRecoveryAttempter.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKAudioResourceLoader.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKContainerViewController.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKError.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKInternalUtility.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKLogger.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMath.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMonotonicTime.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTriStateBOOL.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTypeUtility.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequest+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestBody.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestConnection+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestMetadata.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestPiggybackManager.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKURLConnection.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKDialogConfiguration.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorConfiguration.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCache.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_17.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_21.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV4.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCaching.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStore.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStoreViaBundleID.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKButton+Subclass.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKCloseIcon.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKColor.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKIcon.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKLogo.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKMaleSilhouetteIcon.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKUIUtility.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKViewImpressionTracker.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialog.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialogView.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h create mode 120000 Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h create mode 120000 Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h create mode 120000 Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h create mode 120000 Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h create mode 120000 Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h create mode 120000 Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h create mode 120000 Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h create mode 120000 Pods/Headers/Public/AFNetworking/AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h create mode 120000 Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h create mode 120000 Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h create mode 120000 Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h create mode 120000 Pods/Headers/Public/AFNetworking/AFURLSessionManager.h create mode 120000 Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIImage+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h create mode 120000 Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLink.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLinkNavigation.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLinkResolving.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView_Internal.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLinkTarget.h create mode 120000 Pods/Headers/Public/Bolts/BFAppLink_Internal.h create mode 120000 Pods/Headers/Public/Bolts/BFCancellationToken.h create mode 120000 Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h create mode 120000 Pods/Headers/Public/Bolts/BFCancellationTokenSource.h create mode 120000 Pods/Headers/Public/Bolts/BFDefines.h create mode 120000 Pods/Headers/Public/Bolts/BFExecutor.h create mode 120000 Pods/Headers/Public/Bolts/BFMeasurementEvent.h create mode 120000 Pods/Headers/Public/Bolts/BFMeasurementEvent_Internal.h create mode 120000 Pods/Headers/Public/Bolts/BFTask.h create mode 120000 Pods/Headers/Public/Bolts/BFTaskCompletionSource.h create mode 120000 Pods/Headers/Public/Bolts/BFURL.h create mode 120000 Pods/Headers/Public/Bolts/BFURL_Internal.h create mode 120000 Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h create mode 120000 Pods/Headers/Public/Bolts/Bolts.h create mode 120000 Pods/Headers/Public/Bolts/BoltsVersion.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h create mode 120000 Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h create mode 120000 Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h create mode 100644 Pods/Manifest.lock create mode 100644 Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m create mode 100644 Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch create mode 100644 Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig create mode 100644 Pods/Target Support Files/Bolts/Bolts-dummy.m create mode 100644 Pods/Target Support Files/Bolts/Bolts-prefix.pch create mode 100644 Pods/Target Support Files/Bolts/Bolts.xcconfig create mode 100644 Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m create mode 100644 Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch create mode 100644 Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig create mode 100644 Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m create mode 100644 Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch create mode 100644 Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig create mode 100644 Pods/Target Support Files/Pods/Pods-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods/Pods-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods/Pods-dummy.m create mode 100755 Pods/Target Support Files/Pods/Pods-frameworks.sh create mode 100755 Pods/Target Support Files/Pods/Pods-resources.sh create mode 100644 Pods/Target Support Files/Pods/Pods.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods/Pods.release.xcconfig create mode 100644 UNIT2PracticeProject.xcworkspace/contents.xcworkspacedata create mode 100644 UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/615377296_o.jpg create mode 100644 UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/Contents.json create mode 100644 UNIT2PracticeProject/CollectionViewCell.h create mode 100644 UNIT2PracticeProject/CollectionViewCell.m create mode 100644 UNIT2PracticeProject/DetailMeetUpViewController.h create mode 100644 UNIT2PracticeProject/DetailMeetUpViewController.m create mode 100644 UNIT2PracticeProject/MeetUpCVC.h create mode 100644 UNIT2PracticeProject/MeetUpCVC.m create mode 100644 UNIT2PracticeProject/ObjectsInMeetUp.h create mode 100644 UNIT2PracticeProject/ObjectsInMeetUp.m diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..83f152c862375565cb146634651c2bd55d8bc6ba GIT binary patch literal 6148 zcmeHKOG*Pl5Phv#1l?rmO8NvsynvH1E<_L^x>qv6_z5%QgRW$b;0fG&1y`QI6ZxvT z2^mHgG9idmLDlPD)pS4Tt|3z;|$Cljb13VFPWb7Bb>704E=?;eZqzDIl zd2bqTlBa35m=A%^)84a2ZM45ho-N}Y&6>w6#;fQ3kbwS|{5_JlDef^Nhw@gAsvM5r z))BM9P?&6^hfZGrrg5 za7jS3#(*(UWnepWJCgs8f3E+lPS!I9jDdf}fNQ0Lw9g~O+*&)F 4.7' +pod 'AFNetworking', '~> 2.6' \ No newline at end of file diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..ce85d2d --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,51 @@ +PODS: + - AFNetworking (2.6.1): + - AFNetworking/NSURLConnection (= 2.6.1) + - AFNetworking/NSURLSession (= 2.6.1) + - AFNetworking/Reachability (= 2.6.1) + - AFNetworking/Security (= 2.6.1) + - AFNetworking/Serialization (= 2.6.1) + - AFNetworking/UIKit (= 2.6.1) + - AFNetworking/NSURLConnection (2.6.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.6.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.6.1) + - AFNetworking/Security (2.6.1) + - AFNetworking/Serialization (2.6.1) + - AFNetworking/UIKit (2.6.1): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + - Bolts (1.3.0): + - Bolts/AppLinks (= 1.3.0) + - Bolts/Tasks (= 1.3.0) + - Bolts/AppLinks (1.3.0): + - Bolts/Tasks + - Bolts/Tasks (1.3.0) + - FBSDKCoreKit (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/arc (= 4.7.0) + - FBSDKCoreKit/no-arc (= 4.7.0) + - FBSDKCoreKit/arc (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/no-arc (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/arc + - FBSDKShareKit (4.7.0): + - FBSDKCoreKit + +DEPENDENCIES: + - AFNetworking (~> 2.6) + - FBSDKShareKit (~> 4.7) + +SPEC CHECKSUMS: + AFNetworking: 8e4e60500beb8bec644cf575beee72990a76d399 + Bolts: 805a4a87413e49d4a0c2b7d469084cbc46b09342 + FBSDKCoreKit: eb580bfc2040ad44f4c0b4f4d0befb1d35bce59c + FBSDKShareKit: 1f927bb05e4d36a99d5d5bf2f4b1ff294ce3e15c + +COCOAPODS: 0.39.0 diff --git a/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h new file mode 100644 index 0000000..cf6def4 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1,70 @@ +// AFHTTPRequestOperation.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import +#import "AFURLConnectionOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + `AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + */ +@interface AFHTTPRequestOperation : AFURLConnectionOperation + +///------------------------------------------------ +/// @name Getting HTTP URL Connection Information +///------------------------------------------------ + +/** + The last HTTP response received by the operation's connection. + */ +@property (readonly, nonatomic, strong, nullable) NSHTTPURLResponse *response; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an AFHTTPResponse serializer, which uses the raw data as its response object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. + + @warning `responseSerializer` must not be `nil`. Setting a response serializer will clear out any cached value + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + An object constructed by the `responseSerializer` from the response and response data. Returns `nil` unless the operation `isFinished`, has a `response`, and has `responseData` with non-zero content length. If an error occurs during serialization, `nil` will be returned, and the `error` property will be populated with the serialization error. + */ +@property (readonly, nonatomic, strong, nullable) id responseObject; + +///----------------------------------------------------------- +/// @name Setting Completion Block Success / Failure Callbacks +///----------------------------------------------------------- + +/** + Sets the `completionBlock` property with a block that executes either the specified success or failure block, depending on the state of the request on completion. If `error` returns a value, which can be caused by an unacceptable status code or content type, then `failure` is executed. Otherwise, `success` is executed. + + This method should be overridden in subclasses in order to specify the response object passed into the success block. + + @param success The block to be executed on the completion of a successful request. This block has no return value and takes two arguments: the receiver operation and the object constructed from the response data of the request. + @param failure The block to be executed on the completion of an unsuccessful request. This block has no return value and takes two arguments: the receiver operation and the error that occurred during the request. + */ +- (void)setCompletionBlockWithSuccess:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m new file mode 100644 index 0000000..b8deda8 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m @@ -0,0 +1,206 @@ +// AFHTTPRequestOperation.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFHTTPRequestOperation.h" + +static dispatch_queue_t http_request_operation_processing_queue() { + static dispatch_queue_t af_http_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_http_request_operation_processing_queue = dispatch_queue_create("com.alamofire.networking.http-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return af_http_request_operation_processing_queue; +} + +static dispatch_group_t http_request_operation_completion_group() { + static dispatch_group_t af_http_request_operation_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_http_request_operation_completion_group = dispatch_group_create(); + }); + + return af_http_request_operation_completion_group; +} + +#pragma mark - + +@interface AFURLConnectionOperation () +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@end + +@interface AFHTTPRequestOperation () +@property (readwrite, nonatomic, strong) NSHTTPURLResponse *response; +@property (readwrite, nonatomic, strong) id responseObject; +@property (readwrite, nonatomic, strong) NSError *responseSerializationError; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation AFHTTPRequestOperation +@dynamic response; +@dynamic lock; + +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest { + self = [super initWithRequest:urlRequest]; + if (!self) { + return nil; + } + + self.responseSerializer = [AFHTTPResponseSerializer serializer]; + + return self; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + [self.lock lock]; + _responseSerializer = responseSerializer; + self.responseObject = nil; + self.responseSerializationError = nil; + [self.lock unlock]; +} + +- (id)responseObject { + [self.lock lock]; + if (!_responseObject && [self isFinished] && !self.error) { + NSError *error = nil; + self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:self.responseData error:&error]; + if (error) { + self.responseSerializationError = error; + } + } + [self.lock unlock]; + + return _responseObject; +} + +- (NSError *)error { + if (_responseSerializationError) { + return _responseSerializationError; + } else { + return [super error]; + } +} + +#pragma mark - AFHTTPRequestOperation + +- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + self.completionBlock = ^{ + if (self.completionGroup) { + dispatch_group_enter(self.completionGroup); + } + + dispatch_async(http_request_operation_processing_queue(), ^{ + if (self.error) { + if (failure) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + id responseObject = self.responseObject; + if (self.error) { + if (failure) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + success(self, responseObject); + }); + } + } + } + + if (self.completionGroup) { + dispatch_group_leave(self.completionGroup); + } + }); + }; +#pragma clang diagnostic pop +} + +#pragma mark - AFURLRequestOperation + +- (void)pause { + [super pause]; + + u_int64_t offset = 0; + if ([self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey]) { + offset = [(NSNumber *)[self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey] unsignedLongLongValue]; + } else { + offset = [(NSData *)[self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey] length]; + } + + NSMutableURLRequest *mutableURLRequest = [self.request mutableCopy]; + if ([self.response respondsToSelector:@selector(allHeaderFields)] && [[self.response allHeaderFields] valueForKey:@"ETag"]) { + [mutableURLRequest setValue:[[self.response allHeaderFields] valueForKey:@"ETag"] forHTTPHeaderField:@"If-Range"]; + } + [mutableURLRequest setValue:[NSString stringWithFormat:@"bytes=%llu-", offset] forHTTPHeaderField:@"Range"]; + self.request = mutableURLRequest; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestOperation *operation = [super copyWithZone:zone]; + + operation.responseSerializer = [self.responseSerializer copyWithZone:zone]; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +@end diff --git a/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h new file mode 100644 index 0000000..d2385ed --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1,326 @@ +// AFHTTPRequestOperationManager.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import +#import +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +#import "AFHTTPRequestOperation.h" +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" +#import "AFSecurityPolicy.h" +#import "AFNetworkReachabilityManager.h" + +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + `AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + + ## Subclassing Notes + + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. + + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. + + ## Methods to Override + + To change the behavior of all request operation construction for an `AFHTTPRequestOperationManager` subclass, override `HTTPRequestOperationWithRequest:success:failure`. + + ## Serialization + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` + + ## URL Construction Using Relative Paths + + For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. + + Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + ## Network Reachability Monitoring + + Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. + + ## NSSecureCoding & NSCopying Caveats + + `AFHTTPRequestOperationManager` conforms to the `NSSecureCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. There are a few minor caveats to keep in mind, however: + + - Archives and copies of HTTP clients will be initialized with an empty operation queue. + - NSSecureCoding cannot serialize / deserialize block properties, so an archive of an HTTP client will not include any reachability callback block that may be set. + */ +@interface AFHTTPRequestOperationManager : NSObject + +/** + The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + */ +@property (readonly, nonatomic, strong, nullable) NSURL *baseURL; + +/** + Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. + + @warning `requestSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to a JSON serializer, which serializes data from responses with a `application/json` MIME type, and falls back to the raw data object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + The operation queue on which request operations are scheduled and run. + */ +@property (nonatomic, strong) NSOperationQueue *operationQueue; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether request operations should consult the credential storage for authenticating the connection. `YES` by default. + + @see AFURLConnectionOperation -shouldUseCredentialStorage + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used by request operations for authentication challenges. + + @see AFURLConnectionOperation -credential + */ +@property (nonatomic, strong, nullable) NSURLCredential *credential; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used by created request operations to evaluate server trust for secure connections. `AFHTTPRequestOperationManager` uses the `defaultPolicy` unless otherwise specified. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///------------------------------------ +/// @name Managing Network Reachability +///------------------------------------ + +/** + The network reachability manager. `AFHTTPRequestOperationManager` uses the `sharedManager` by default. + */ +@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; + +///------------------------------- +/// @name Managing Callback Queues +///------------------------------- + +/** + The dispatch queue for the `completionBlock` of request operations. If `NULL` (default), the main queue is used. + */ +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; +#else +@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; +#endif + +/** + The dispatch group for the `completionBlock` of request operations. If `NULL` (default), a private dispatch group is used. + */ +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_group_t completionGroup; +#else +@property (nonatomic, assign, nullable) dispatch_group_t completionGroup; +#endif + +///--------------------------------------------- +/// @name Creating and Initializing HTTP Clients +///--------------------------------------------- + +/** + Creates and returns an `AFHTTPRequestOperationManager` object. + */ ++ (instancetype)manager; + +/** + Initializes an `AFHTTPRequestOperationManager` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(nullable NSURL *)url NS_DESIGNATED_INITIALIZER; + +///--------------------------------------- +/// @name Managing HTTP Request Operations +///--------------------------------------- + +/** + Creates an `AFHTTPRequestOperation`, and sets the response serializers to that of the HTTP client. + + @param request The request object to be loaded asynchronously during execution of the operation. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + */ +- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates and runs an `AFHTTPRequestOperation` with a `GET` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `HEAD` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes a single arguments: the request operation. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a multipart `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(nullable id)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `PUT` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `PATCH` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `DELETE` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (nullable AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m new file mode 100644 index 0000000..60739e5 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m @@ -0,0 +1,284 @@ +// AFHTTPRequestOperationManager.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import "AFHTTPRequestOperationManager.h" +#import "AFHTTPRequestOperation.h" + +#import +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +@interface AFHTTPRequestOperationManager () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@end + +@implementation AFHTTPRequestOperationManager + ++ (instancetype)manager { + return [[self alloc] initWithBaseURL:nil]; +} + +- (instancetype)init { + return [self initWithBaseURL:nil]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + self = [super init]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; + + self.operationQueue = [[NSOperationQueue alloc] init]; + + self.shouldUseCredentialStorage = YES; + + return self; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +#endif + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + NSParameterAssert(requestSerializer); + + _requestSerializer = requestSerializer; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + _responseSerializer = responseSerializer; +} + +#pragma mark - + +- (AFHTTPRequestOperation *)HTTPRequestOperationWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + return [self HTTPRequestOperationWithRequest:request success:success failure:failure]; +} + +- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + operation.responseSerializer = self.responseSerializer; + operation.shouldUseCredentialStorage = self.shouldUseCredentialStorage; + operation.credential = self.credential; + operation.securityPolicy = self.securityPolicy; + + [operation setCompletionBlockWithSuccess:success failure:failure]; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +#pragma mark - + +- (AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters success:^(AFHTTPRequestOperation *requestOperation, __unused id responseObject) { + if (success) { + success(requestOperation); + } + } failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.operationQueue]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURL *baseURL = [decoder decodeObjectForKey:NSStringFromSelector(@selector(baseURL))]; + + self = [self initWithBaseURL:baseURL]; + if (!self) { + return nil; + } + + self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))]; + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.baseURL forKey:NSStringFromSelector(@selector(baseURL))]; + [coder encodeObject:self.requestSerializer forKey:NSStringFromSelector(@selector(requestSerializer))]; + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestOperationManager *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL]; + + HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; + HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; + + return HTTPClient; +} + +@end diff --git a/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h new file mode 100644 index 0000000..e516e6d --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1,253 @@ +// AFHTTPSessionManager.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import +#if !TARGET_OS_WATCH +#import +#endif +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +#import "AFURLSessionManager.h" + +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + +/** + `AFHTTPSessionManager` is a subclass of `AFURLSessionManager` with convenience methods for making HTTP requests. When a `baseURL` is provided, requests made with the `GET` / `POST` / et al. convenience methods can be made with relative paths. + + ## Subclassing Notes + + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. + + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. + + ## Methods to Override + + To change the behavior of all data task operation construction, which is also used in the `GET` / `POST` / et al. convenience methods, override `dataTaskWithRequest:completionHandler:`. + + ## Serialization + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` + + ## URL Construction Using Relative Paths + + For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. + + Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. + */ + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_OS_WATCH + +NS_ASSUME_NONNULL_BEGIN + +@interface AFHTTPSessionManager : AFURLSessionManager + +/** + The URL used to construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + */ +@property (readonly, nonatomic, strong, nullable) NSURL *baseURL; + +/** + Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. + + @warning `requestSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns an `AFHTTPSessionManager` object. + */ ++ (instancetype)manager; + +/** + Initializes an `AFHTTPSessionManager` object with the specified base URL. + + @param url The base URL for the HTTP client. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(nullable NSURL *)url; + +/** + Initializes an `AFHTTPSessionManager` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. + @param configuration The configuration used to create the managed session. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(nullable NSURL *)url + sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates and runs an `NSURLSessionDataTask` with a `GET` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `HEAD` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes a single arguments: the data task. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a multipart `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(nullable id)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `PUT` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `PATCH` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `DELETE` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m new file mode 100644 index 0000000..bd9163f --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m @@ -0,0 +1,323 @@ +// AFHTTPSessionManager.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFHTTPSessionManager.h" + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_WATCH_OS + +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" + +#import +#import + +#ifdef _SYSTEMCONFIGURATION_H +#import +#import +#import +#import +#import +#endif + +#if TARGET_OS_IOS +#import +#elif TARGET_OS_WATCH +#import +#endif + +@interface AFHTTPSessionManager () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@end + +@implementation AFHTTPSessionManager +@dynamic responseSerializer; + ++ (instancetype)manager { + return [[[self class] alloc] initWithBaseURL:nil]; +} + +- (instancetype)init { + return [self initWithBaseURL:nil]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + return [self initWithBaseURL:url sessionConfiguration:nil]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + return [self initWithBaseURL:nil sessionConfiguration:configuration]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url + sessionConfiguration:(NSURLSessionConfiguration *)configuration +{ + self = [super initWithSessionConfiguration:configuration]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + return self; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +#endif + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + NSParameterAssert(requestSerializer); + + _requestSerializer = requestSerializer; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + [super setResponseSerializer:responseSerializer]; +} + +#pragma mark - + +- (NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters success:^(NSURLSessionDataTask *task, __unused id responseObject) { + if (success) { + success(task); + } + } failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + if (error) { + if (failure) { + failure(task, error); + } + } else { + if (success) { + success(task, responseObject); + } + } + }]; + + [task resume]; + + return task; +} + +- (NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *, id))success + failure:(void (^)(NSURLSessionDataTask *, NSError *))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + __block NSURLSessionDataTask *dataTask = nil; + dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + if (error) { + if (failure) { + failure(dataTask, error); + } + } else { + if (success) { + success(dataTask, responseObject); + } + } + }]; + + return dataTask; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.session, self.operationQueue]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURL *baseURL = [decoder decodeObjectOfClass:[NSURL class] forKey:NSStringFromSelector(@selector(baseURL))]; + NSURLSessionConfiguration *configuration = [decoder decodeObjectOfClass:[NSURLSessionConfiguration class] forKey:@"sessionConfiguration"]; + if (!configuration) { + NSString *configurationIdentifier = [decoder decodeObjectOfClass:[NSString class] forKey:@"identifier"]; + if (configurationIdentifier) { +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1100) + configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationIdentifier]; +#else + configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:configurationIdentifier]; +#endif + } + } + + self = [self initWithBaseURL:baseURL sessionConfiguration:configuration]; + if (!self) { + return nil; + } + + self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))]; + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.baseURL forKey:NSStringFromSelector(@selector(baseURL))]; + if ([self.session.configuration conformsToProtocol:@protocol(NSCoding)]) { + [coder encodeObject:self.session.configuration forKey:@"sessionConfiguration"]; + } else { + [coder encodeObject:self.session.configuration.identifier forKey:@"identifier"]; + } + [coder encodeObject:self.requestSerializer forKey:NSStringFromSelector(@selector(requestSerializer))]; + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPSessionManager *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL sessionConfiguration:self.session.configuration]; + + HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; + HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; + + return HTTPClient; +} + +@end + +#endif diff --git a/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h new file mode 100644 index 0000000..e2eb945 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1,207 @@ +// AFNetworkReachabilityManager.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#if !TARGET_OS_WATCH +#import + +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + +typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { + AFNetworkReachabilityStatusUnknown = -1, + AFNetworkReachabilityStatusNotReachable = 0, + AFNetworkReachabilityStatusReachableViaWWAN = 1, + AFNetworkReachabilityStatusReachableViaWiFi = 2, +}; + +NS_ASSUME_NONNULL_BEGIN + +/** + `AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + + Reachability can be used to determine background information about why a network operation failed, or to trigger a network operation retrying when a connection is established. It should not be used to prevent a user from initiating a network request, as it's possible that an initial request may be required to establish reachability. + + See Apple's Reachability Sample Code (https://developer.apple.com/library/ios/samplecode/reachability/) + + @warning Instances of `AFNetworkReachabilityManager` must be started with `-startMonitoring` before reachability status can be determined. + */ +@interface AFNetworkReachabilityManager : NSObject + +/** + The current network reachability status. + */ +@property (readonly, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; + +/** + Whether or not the network is currently reachable. + */ +@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable; + +/** + Whether or not the network is currently reachable via WWAN. + */ +@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN; + +/** + Whether or not the network is currently reachable via WiFi. + */ +@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Returns the shared network reachability manager. + */ ++ (instancetype)sharedManager; + +/** + Creates and returns a network reachability manager for the specified domain. + + @param domain The domain used to evaluate network reachability. + + @return An initialized network reachability manager, actively monitoring the specified domain. + */ ++ (instancetype)managerForDomain:(NSString *)domain; + +/** + Creates and returns a network reachability manager for the socket address. + + @param address The socket address (`sockaddr_in`) used to evaluate network reachability. + + @return An initialized network reachability manager, actively monitoring the specified socket address. + */ ++ (instancetype)managerForAddress:(const void *)address; + +/** + Initializes an instance of a network reachability manager from the specified reachability object. + + @param reachability The reachability object to monitor. + + @return An initialized network reachability manager, actively monitoring the specified reachability. + */ +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER; + +///-------------------------------------------------- +/// @name Starting & Stopping Reachability Monitoring +///-------------------------------------------------- + +/** + Starts monitoring for changes in network reachability status. + */ +- (void)startMonitoring; + +/** + Stops monitoring for changes in network reachability status. + */ +- (void)stopMonitoring; + +///------------------------------------------------- +/// @name Getting Localized Reachability Description +///------------------------------------------------- + +/** + Returns a localized string representation of the current network reachability status. + */ +- (NSString *)localizedNetworkReachabilityStatusString; + +///--------------------------------------------------- +/// @name Setting Network Reachability Change Callback +///--------------------------------------------------- + +/** + Sets a callback to be executed when the network availability of the `baseURL` host changes. + + @param block A block object to be executed when the network availability of the `baseURL` host changes.. This block has no return value and takes a single argument which represents the various reachability states from the device to the `baseURL`. + */ +- (void)setReachabilityStatusChangeBlock:(nullable void (^)(AFNetworkReachabilityStatus status))block; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Network Reachability + + The following constants are provided by `AFNetworkReachabilityManager` as possible network reachability statuses. + + enum { + AFNetworkReachabilityStatusUnknown, + AFNetworkReachabilityStatusNotReachable, + AFNetworkReachabilityStatusReachableViaWWAN, + AFNetworkReachabilityStatusReachableViaWiFi, + } + + `AFNetworkReachabilityStatusUnknown` + The `baseURL` host reachability is not known. + + `AFNetworkReachabilityStatusNotReachable` + The `baseURL` host cannot be reached. + + `AFNetworkReachabilityStatusReachableViaWWAN` + The `baseURL` host can be reached via a cellular connection, such as EDGE or GPRS. + + `AFNetworkReachabilityStatusReachableViaWiFi` + The `baseURL` host can be reached via a Wi-Fi connection. + + ### Keys for Notification UserInfo Dictionary + + Strings that are used as keys in a `userInfo` dictionary in a network reachability status change notification. + + `AFNetworkingReachabilityNotificationStatusItem` + A key in the userInfo dictionary in a `AFNetworkingReachabilityDidChangeNotification` notification. + The corresponding value is an `NSNumber` object representing the `AFNetworkReachabilityStatus` value for the current reachability status. + */ + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when network reachability changes. + This notification assigns no notification object. The `userInfo` dictionary contains an `NSNumber` object under the `AFNetworkingReachabilityNotificationStatusItem` key, representing the `AFNetworkReachabilityStatus` value for the current network reachability. + + @warning In order for network reachability to be monitored, include the `SystemConfiguration` framework in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (`Prefix.pch`). + */ +FOUNDATION_EXPORT NSString * const AFNetworkingReachabilityDidChangeNotification; +FOUNDATION_EXPORT NSString * const AFNetworkingReachabilityNotificationStatusItem; + +///-------------------- +/// @name Functions +///-------------------- + +/** + Returns a localized string representation of an `AFNetworkReachabilityStatus` value. + */ +FOUNDATION_EXPORT NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status); + +NS_ASSUME_NONNULL_END +#endif diff --git a/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m new file mode 100644 index 0000000..2e5e2ed --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m @@ -0,0 +1,262 @@ +// AFNetworkReachabilityManager.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFNetworkReachabilityManager.h" +#if !TARGET_OS_WATCH + +#import +#import +#import +#import +#import + +NSString * const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change"; +NSString * const AFNetworkingReachabilityNotificationStatusItem = @"AFNetworkingReachabilityNotificationStatusItem"; + +typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status); + +typedef NS_ENUM(NSUInteger, AFNetworkReachabilityAssociation) { + AFNetworkReachabilityForAddress = 1, + AFNetworkReachabilityForAddressPair = 2, + AFNetworkReachabilityForName = 3, +}; + +NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusNotReachable: + return NSLocalizedStringFromTable(@"Not Reachable", @"AFNetworking", nil); + case AFNetworkReachabilityStatusReachableViaWWAN: + return NSLocalizedStringFromTable(@"Reachable via WWAN", @"AFNetworking", nil); + case AFNetworkReachabilityStatusReachableViaWiFi: + return NSLocalizedStringFromTable(@"Reachable via WiFi", @"AFNetworking", nil); + case AFNetworkReachabilityStatusUnknown: + default: + return NSLocalizedStringFromTable(@"Unknown", @"AFNetworking", nil); + } +} + +static AFNetworkReachabilityStatus AFNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) { + BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); + BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); + BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)); + BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0); + BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction)); + + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusUnknown; + if (isNetworkReachable == NO) { + status = AFNetworkReachabilityStatusNotReachable; + } +#if TARGET_OS_IPHONE + else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { + status = AFNetworkReachabilityStatusReachableViaWWAN; + } +#endif + else { + status = AFNetworkReachabilityStatusReachableViaWiFi; + } + + return status; +} + +static void AFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) { + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); + AFNetworkReachabilityStatusBlock block = (__bridge AFNetworkReachabilityStatusBlock)info; + if (block) { + block(status); + } + + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + NSDictionary *userInfo = @{ AFNetworkingReachabilityNotificationStatusItem: @(status) }; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:userInfo]; + }); + +} + +static const void * AFNetworkReachabilityRetainCallback(const void *info) { + return Block_copy(info); +} + +static void AFNetworkReachabilityReleaseCallback(const void *info) { + if (info) { + Block_release(info); + } +} + +@interface AFNetworkReachabilityManager () +@property (readwrite, nonatomic, strong) id networkReachability; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityAssociation networkReachabilityAssociation; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; +@property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock; +@end + +@implementation AFNetworkReachabilityManager + ++ (instancetype)sharedManager { + static AFNetworkReachabilityManager *_sharedManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + struct sockaddr_in address; + bzero(&address, sizeof(address)); + address.sin_len = sizeof(address); + address.sin_family = AF_INET; + + _sharedManager = [self managerForAddress:&address]; + }); + + return _sharedManager; +} + ++ (instancetype)managerForDomain:(NSString *)domain { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [domain UTF8String]); + + AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; + manager.networkReachabilityAssociation = AFNetworkReachabilityForName; + + return manager; +} + ++ (instancetype)managerForAddress:(const void *)address { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address); + + AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; + manager.networkReachabilityAssociation = AFNetworkReachabilityForAddress; + + return manager; +} + +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability { + self = [super init]; + if (!self) { + return nil; + } + + self.networkReachability = CFBridgingRelease(reachability); + self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown; + + return self; +} + +- (instancetype)init NS_UNAVAILABLE +{ + return nil; +} + +- (void)dealloc { + [self stopMonitoring]; +} + +#pragma mark - + +- (BOOL)isReachable { + return [self isReachableViaWWAN] || [self isReachableViaWiFi]; +} + +- (BOOL)isReachableViaWWAN { + return self.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN; +} + +- (BOOL)isReachableViaWiFi { + return self.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi; +} + +#pragma mark - + +- (void)startMonitoring { + [self stopMonitoring]; + + if (!self.networkReachability) { + return; + } + + __weak __typeof(self)weakSelf = self; + AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + + strongSelf.networkReachabilityStatus = status; + if (strongSelf.networkReachabilityStatusBlock) { + strongSelf.networkReachabilityStatusBlock(status); + } + + }; + + id networkReachability = self.networkReachability; + SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL}; + SCNetworkReachabilitySetCallback((__bridge SCNetworkReachabilityRef)networkReachability, AFNetworkReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop((__bridge SCNetworkReachabilityRef)networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + + switch (self.networkReachabilityAssociation) { + case AFNetworkReachabilityForName: + break; + case AFNetworkReachabilityForAddress: + case AFNetworkReachabilityForAddressPair: + default: { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{ + SCNetworkReachabilityFlags flags; + SCNetworkReachabilityGetFlags((__bridge SCNetworkReachabilityRef)networkReachability, &flags); + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); + dispatch_async(dispatch_get_main_queue(), ^{ + callback(status); + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; + + + }); + }); + } + break; + } +} + +- (void)stopMonitoring { + if (!self.networkReachability) { + return; + } + + SCNetworkReachabilityUnscheduleFromRunLoop((__bridge SCNetworkReachabilityRef)self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); +} + +#pragma mark - + +- (NSString *)localizedNetworkReachabilityStatusString { + return AFStringFromNetworkReachabilityStatus(self.networkReachabilityStatus); +} + +#pragma mark - + +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block { + self.networkReachabilityStatusBlock = block; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { + if ([key isEqualToString:@"reachable"] || [key isEqualToString:@"reachableViaWWAN"] || [key isEqualToString:@"reachableViaWiFi"]) { + return [NSSet setWithObject:@"networkReachabilityStatus"]; + } + + return [super keyPathsForValuesAffectingValueForKey:key]; +} + +@end +#endif diff --git a/Pods/AFNetworking/AFNetworking/AFNetworking.h b/Pods/AFNetworking/AFNetworking/AFNetworking.h new file mode 100644 index 0000000..6d442bb --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFNetworking.h @@ -0,0 +1,46 @@ +// AFNetworking.h +// +// Copyright (c) 2013 AFNetworking (http://afnetworking.com/) +// +// 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. + +#import +#import + +#ifndef _AFNETWORKING_ + #define _AFNETWORKING_ + + #import "AFURLRequestSerialization.h" + #import "AFURLResponseSerialization.h" + #import "AFSecurityPolicy.h" +#if !TARGET_OS_WATCH + #import "AFNetworkReachabilityManager.h" + #import "AFURLConnectionOperation.h" + #import "AFHTTPRequestOperation.h" + #import "AFHTTPRequestOperationManager.h" +#endif + +#if ( ( defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || \ + ( defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 ) || \ + TARGET_OS_WATCH ) + #import "AFURLSessionManager.h" + #import "AFHTTPSessionManager.h" +#endif + +#endif /* _AFNETWORKING_ */ diff --git a/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h new file mode 100644 index 0000000..3c38da8 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1,142 @@ +// AFSecurityPolicy.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import +#import + +typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, +}; + +/** + `AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + + Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + */ + +NS_ASSUME_NONNULL_BEGIN + +@interface AFSecurityPolicy : NSObject + +/** + The criteria by which server trust should be evaluated against the pinned SSL certificates. Defaults to `AFSSLPinningModeNone`. + */ +@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode; + +/** + The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. Note that if you create an array with duplicate certificates, the duplicate certificates will be removed. Note that if pinning is enabled, `evaluateServerTrust:forDomain:` will return true if any pinned certificate matches. + */ +@property (nonatomic, strong, nullable) NSArray *pinnedCertificates; + +/** + Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. + */ +@property (nonatomic, assign) BOOL allowInvalidCertificates; + +/** + Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES`. + */ +@property (nonatomic, assign) BOOL validatesDomainName; + +///----------------------------------------- +/// @name Getting Specific Security Policies +///----------------------------------------- + +/** + Returns the shared default security policy, which does not allow invalid certificates, validates domain name, and does not validate against pinned certificates or public keys. + + @return The default security policy. + */ ++ (instancetype)defaultPolicy; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns a security policy with the specified pinning mode. + + @param pinningMode The SSL pinning mode. + + @return A new security policy. + */ ++ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode; + +///------------------------------ +/// @name Evaluating Server Trust +///------------------------------ + +/** + Whether or not the specified server trust should be accepted, based on the security policy. + + This method should be used when responding to an authentication challenge from a server. + + @param serverTrust The X.509 certificate trust of the server. + + @return Whether or not to trust the server. + + @warning This method has been deprecated in favor of `-evaluateServerTrust:forDomain:`. + */ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust DEPRECATED_ATTRIBUTE; + +/** + Whether or not the specified server trust should be accepted, based on the security policy. + + This method should be used when responding to an authentication challenge from a server. + + @param serverTrust The X.509 certificate trust of the server. + @param domain The domain of serverTrust. If `nil`, the domain will not be validated. + + @return Whether or not to trust the server. + */ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(nullable NSString *)domain; + +@end + +NS_ASSUME_NONNULL_END + +///---------------- +/// @name Constants +///---------------- + +/** + ## SSL Pinning Modes + + The following constants are provided by `AFSSLPinningMode` as possible SSL pinning modes. + + enum { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, + } + + `AFSSLPinningModeNone` + Do not used pinned certificates to validate servers. + + `AFSSLPinningModePublicKey` + Validate host certificates against public keys of pinned certificates. + + `AFSSLPinningModeCertificate` + Validate host certificates against pinned certificates. +*/ diff --git a/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m new file mode 100644 index 0000000..e8eaa65 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m @@ -0,0 +1,311 @@ +// AFSecurityPolicy.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFSecurityPolicy.h" + +#import + +#if !TARGET_OS_IOS && !TARGET_OS_WATCH +static NSData * AFSecKeyGetData(SecKeyRef key) { + CFDataRef data = NULL; + + __Require_noErr_Quiet(SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data), _out); + + return (__bridge_transfer NSData *)data; + +_out: + if (data) { + CFRelease(data); + } + + return nil; +} +#endif + +static BOOL AFSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { +#if TARGET_OS_IOS || TARGET_OS_WATCH + return [(__bridge id)key1 isEqual:(__bridge id)key2]; +#else + return [AFSecKeyGetData(key1) isEqual:AFSecKeyGetData(key2)]; +#endif +} + +static id AFPublicKeyForCertificate(NSData *certificate) { + id allowedPublicKey = nil; + SecCertificateRef allowedCertificate; + SecCertificateRef allowedCertificates[1]; + CFArrayRef tempCertificates = nil; + SecPolicyRef policy = nil; + SecTrustRef allowedTrust = nil; + SecTrustResultType result; + + allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); + __Require_Quiet(allowedCertificate != NULL, _out); + + allowedCertificates[0] = allowedCertificate; + tempCertificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); + + policy = SecPolicyCreateBasicX509(); + __Require_noErr_Quiet(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); + __Require_noErr_Quiet(SecTrustEvaluate(allowedTrust, &result), _out); + + allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); + +_out: + if (allowedTrust) { + CFRelease(allowedTrust); + } + + if (policy) { + CFRelease(policy); + } + + if (tempCertificates) { + CFRelease(tempCertificates); + } + + if (allowedCertificate) { + CFRelease(allowedCertificate); + } + + return allowedPublicKey; +} + +static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { + BOOL isValid = NO; + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); + + isValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed); + +_out: + return isValid; +} + +static NSArray * AFCertificateTrustChainForServerTrust(SecTrustRef serverTrust) { + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; + } + + return [NSArray arrayWithArray:trustChain]; +} + +static NSArray * AFPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) { + SecPolicyRef policy = SecPolicyCreateBasicX509(); + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + + SecCertificateRef someCertificates[] = {certificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); + + SecTrustRef trust; + __Require_noErr_Quiet(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); + + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(trust, &result), _out); + + [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; + + _out: + if (trust) { + CFRelease(trust); + } + + if (certificates) { + CFRelease(certificates); + } + + continue; + } + CFRelease(policy); + + return [NSArray arrayWithArray:trustChain]; +} + +#pragma mark - + +@interface AFSecurityPolicy() +@property (readwrite, nonatomic, assign) AFSSLPinningMode SSLPinningMode; +@property (readwrite, nonatomic, strong) NSArray *pinnedPublicKeys; +@end + +@implementation AFSecurityPolicy + ++ (NSArray *)defaultPinnedCertificates { + static NSArray *_defaultPinnedCertificates = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; + + NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:[paths count]]; + for (NSString *path in paths) { + NSData *certificateData = [NSData dataWithContentsOfFile:path]; + [certificates addObject:certificateData]; + } + + _defaultPinnedCertificates = [[NSArray alloc] initWithArray:certificates]; + }); + + return _defaultPinnedCertificates; +} + ++ (instancetype)defaultPolicy { + AFSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = AFSSLPinningModeNone; + + return securityPolicy; +} + ++ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode { + AFSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = pinningMode; + + [securityPolicy setPinnedCertificates:[self defaultPinnedCertificates]]; + + return securityPolicy; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + self.validatesDomainName = YES; + + return self; +} + +- (void)setPinnedCertificates:(NSArray *)pinnedCertificates { + _pinnedCertificates = [[NSOrderedSet orderedSetWithArray:pinnedCertificates] array]; + + if (self.pinnedCertificates) { + NSMutableArray *mutablePinnedPublicKeys = [NSMutableArray arrayWithCapacity:[self.pinnedCertificates count]]; + for (NSData *certificate in self.pinnedCertificates) { + id publicKey = AFPublicKeyForCertificate(certificate); + if (!publicKey) { + continue; + } + [mutablePinnedPublicKeys addObject:publicKey]; + } + self.pinnedPublicKeys = [NSArray arrayWithArray:mutablePinnedPublicKeys]; + } else { + self.pinnedPublicKeys = nil; + } +} + +#pragma mark - + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust { + return [self evaluateServerTrust:serverTrust forDomain:nil]; +} + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain +{ + if (domain && self.allowInvalidCertificates && self.validatesDomainName && (self.SSLPinningMode == AFSSLPinningModeNone || [self.pinnedCertificates count] == 0)) { + // https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html + // According to the docs, you should only trust your provided certs for evaluation. + // Pinned certificates are added to the trust. Without pinned certificates, + // there is nothing to evaluate against. + // + // From Apple Docs: + // "Do not implicitly trust self-signed certificates as anchors (kSecTrustOptionImplicitAnchors). + // Instead, add your own (self-signed) CA certificate to the list of trusted anchors." + NSLog(@"In order to validate a domain name for self signed certificates, you MUST use pinning."); + return NO; + } + + NSMutableArray *policies = [NSMutableArray array]; + if (self.validatesDomainName) { + [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; + } else { + [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; + } + + SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); + + if (self.SSLPinningMode == AFSSLPinningModeNone) { + if (self.allowInvalidCertificates || AFServerTrustIsValid(serverTrust)){ + return YES; + } else { + return NO; + } + } else if (!AFServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { + return NO; + } + + NSArray *serverCertificates = AFCertificateTrustChainForServerTrust(serverTrust); + switch (self.SSLPinningMode) { + case AFSSLPinningModeNone: + default: + return NO; + case AFSSLPinningModeCertificate: { + NSMutableArray *pinnedCertificates = [NSMutableArray array]; + for (NSData *certificateData in self.pinnedCertificates) { + [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; + } + SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates); + + if (!AFServerTrustIsValid(serverTrust)) { + return NO; + } + + NSUInteger trustedCertificateCount = 0; + for (NSData *trustChainCertificate in serverCertificates) { + if ([self.pinnedCertificates containsObject:trustChainCertificate]) { + trustedCertificateCount++; + } + } + return trustedCertificateCount > 0; + } + case AFSSLPinningModePublicKey: { + NSUInteger trustedPublicKeyCount = 0; + NSArray *publicKeys = AFPublicKeyTrustChainForServerTrust(serverTrust); + + for (id trustChainPublicKey in publicKeys) { + for (id pinnedPublicKey in self.pinnedPublicKeys) { + if (AFSecKeyIsEqualToKey((__bridge SecKeyRef)trustChainPublicKey, (__bridge SecKeyRef)pinnedPublicKey)) { + trustedPublicKeyCount += 1; + } + } + } + return trustedPublicKeyCount > 0; + } + } + + return NO; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingPinnedPublicKeys { + return [NSSet setWithObject:@"pinnedCertificates"]; +} + +@end diff --git a/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h new file mode 100644 index 0000000..c21119e --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1,344 @@ +// AFURLConnectionOperation.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" +#import "AFSecurityPolicy.h" + +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + +/** + `AFURLConnectionOperation` is a subclass of `NSOperation` that implements `NSURLConnection` delegate methods. + + ## Subclassing Notes + + This is the base class of all network request operations. You may wish to create your own subclass in order to implement additional `NSURLConnection` delegate methods (see "`NSURLConnection` Delegate Methods" below), or to provide additional properties and/or class constructors. + + If you are creating a subclass that communicates over the HTTP or HTTPS protocols, you may want to consider subclassing `AFHTTPRequestOperation` instead, as it supports specifying acceptable content types or status codes. + + ## NSURLConnection Delegate Methods + + `AFURLConnectionOperation` implements the following `NSURLConnection` delegate methods: + + - `connection:didReceiveResponse:` + - `connection:didReceiveData:` + - `connectionDidFinishLoading:` + - `connection:didFailWithError:` + - `connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:` + - `connection:willCacheResponse:` + - `connectionShouldUseCredentialStorage:` + - `connection:needNewBodyStream:` + - `connection:willSendRequestForAuthenticationChallenge:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Callbacks and Completion Blocks + + The built-in `completionBlock` provided by `NSOperation` allows for custom behavior to be executed after the request finishes. It is a common pattern for class constructors in subclasses to take callback block parameters, and execute them conditionally in the body of its `completionBlock`. Make sure to handle cancelled operations appropriately when setting a `completionBlock` (i.e. returning early before parsing response data). See the implementation of any of the `AFHTTPRequestOperation` subclasses for an example of this. + + Subclasses are strongly discouraged from overriding `setCompletionBlock:`, as `AFURLConnectionOperation`'s implementation includes a workaround to mitigate retain cycles, and what Apple rather ominously refers to as ["The Deallocation Problem"](http://developer.apple.com/library/ios/#technotes/tn2109/). + + ## SSL Pinning + + Relying on the CA trust model to validate SSL certificates exposes your app to security vulnerabilities, such as man-in-the-middle attacks. For applications that connect to known servers, SSL certificate pinning provides an increased level of security, by checking server certificate validity against those specified in the app bundle. + + SSL with certificate pinning is strongly recommended for any application that transmits sensitive information to an external webservice. + + Connections will be validated on all matching certificates with a `.cer` extension in the bundle root. + + ## NSCoding & NSCopying Conformance + + `AFURLConnectionOperation` conforms to the `NSCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. However, because of the intrinsic limitations of capturing the exact state of an operation at a particular moment, there are some important caveats to keep in mind: + + ### NSCoding Caveats + + - Encoded operations do not include any block or stream properties. Be sure to set `completionBlock`, `outputStream`, and any callback blocks as necessary when using `-initWithCoder:` or `NSKeyedUnarchiver`. + - Operations are paused on `encodeWithCoder:`. If the operation was encoded while paused or still executing, its archived state will return `YES` for `isReady`. Otherwise, the state of an operation when encoding will remain unchanged. + + ### NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new operation with the `NSURLRequest` of the original. So rather than an exact copy of the operation at that particular instant, the copying mechanism returns a completely new instance, which can be useful for retrying operations. + - A copy of an operation will not include the `outputStream` of the original. + - Operation copies do not include `completionBlock`, as it often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ operation when copied. + */ + +NS_ASSUME_NONNULL_BEGIN + +@interface AFURLConnectionOperation : NSOperation + +///------------------------------- +/// @name Accessing Run Loop Modes +///------------------------------- + +/** + The run loop modes in which the operation will run on the network thread. By default, this is a single-member set containing `NSRunLoopCommonModes`. + */ +@property (nonatomic, strong) NSSet *runLoopModes; + +///----------------------------------------- +/// @name Getting URL Connection Information +///----------------------------------------- + +/** + The request used by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLRequest *request; + +/** + The last response received by the operation's connection. + */ +@property (readonly, nonatomic, strong, nullable) NSURLResponse *response; + +/** + The error, if any, that occurred in the lifecycle of the request. + */ +@property (readonly, nonatomic, strong, nullable) NSError *error; + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + The data received during the request. + */ +@property (readonly, nonatomic, strong, nullable) NSData *responseData; + +/** + The string representation of the response data. + */ +@property (readonly, nonatomic, copy, nullable) NSString *responseString; + +/** + The string encoding of the response. + + If the response does not specify a valid string encoding, `responseStringEncoding` will return `NSUTF8StringEncoding`. + */ +@property (readonly, nonatomic, assign) NSStringEncoding responseStringEncoding; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. + + This is the value that is returned in the `NSURLConnectionDelegate` method `-connectionShouldUseCredentialStorage:`. + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. + + This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. + */ +@property (nonatomic, strong, nullable) NSURLCredential *credential; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used to evaluate server trust for secure connections. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///------------------------ +/// @name Accessing Streams +///------------------------ + +/** + The input stream used to read data to be sent during the request. + + This property acts as a proxy to the `HTTPBodyStream` property of `request`. + */ +@property (nonatomic, strong) NSInputStream *inputStream; + +/** + The output stream that is used to write data received until the request is finished. + + By default, data is accumulated into a buffer that is stored into `responseData` upon completion of the request, with the intermediary `outputStream` property set to `nil`. When `outputStream` is set, the data will not be accumulated into an internal buffer, and as a result, the `responseData` property of the completed request will be `nil`. The output stream will be scheduled in the network thread runloop upon being set. + */ +@property (nonatomic, strong, nullable) NSOutputStream *outputStream; + +///--------------------------------- +/// @name Managing Callback Queues +///--------------------------------- + +/** + The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. + */ +#if OS_OBJECT_USE_OBJC +@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; +#else +@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; +#endif + +/** + The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. + */ +#if OS_OBJECT_USE_OBJC +@property (nonatomic, strong, nullable) dispatch_group_t completionGroup; +#else +@property (nonatomic, assign, nullable) dispatch_group_t completionGroup; +#endif + +///--------------------------------------------- +/// @name Managing Request Operation Information +///--------------------------------------------- + +/** + The user info dictionary for the receiver. + */ +@property (nonatomic, strong) NSDictionary *userInfo; +// FIXME: It doesn't seem that this userInfo is used anywhere in the implementation. + +///------------------------------------------------------ +/// @name Initializing an AFURLConnectionOperation Object +///------------------------------------------------------ + +/** + Initializes and returns a newly allocated operation object with a url connection configured with the specified url request. + + This is the designated initializer. + + @param urlRequest The request object to be used by the operation connection. + */ +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest NS_DESIGNATED_INITIALIZER; + +///---------------------------------- +/// @name Pausing / Resuming Requests +///---------------------------------- + +/** + Pauses the execution of the request operation. + + A paused operation returns `NO` for `-isReady`, `-isExecuting`, and `-isFinished`. As such, it will remain in an `NSOperationQueue` until it is either cancelled or resumed. Pausing a finished, cancelled, or paused operation has no effect. + */ +- (void)pause; + +/** + Whether the request operation is currently paused. + + @return `YES` if the operation is currently paused, otherwise `NO`. + */ +- (BOOL)isPaused; + +/** + Resumes the execution of the paused request operation. + + Pause/Resume behavior varies depending on the underlying implementation for the operation class. In its base implementation, resuming a paused requests restarts the original request. However, since HTTP defines a specification for how to request a specific content range, `AFHTTPRequestOperation` will resume downloading the request from where it left off, instead of restarting the original request. + */ +- (void)resume; + +///---------------------------------------------- +/// @name Configuring Backgrounding Task Behavior +///---------------------------------------------- + +/** + Specifies that the operation should continue execution after the app has entered the background, and the expiration handler for that background task. + + @param handler A handler to be called shortly before the application’s remaining background time reaches 0. The handler is wrapped in a block that cancels the operation, and cleans up and marks the end of execution, unlike the `handler` parameter in `UIApplication -beginBackgroundTaskWithExpirationHandler:`, which expects this to be done in the handler itself. The handler is called synchronously on the main thread, thus blocking the application’s suspension momentarily while the application is notified. + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(nullable void (^)(void))handler NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); +#endif + +///--------------------------------- +/// @name Setting Progress Callbacks +///--------------------------------- + +/** + Sets a callback to be called when an undetermined number of bytes have been uploaded to the server. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes three arguments: the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setUploadProgressBlock:(nullable void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block; + +/** + Sets a callback to be called when an undetermined number of bytes have been downloaded from the server. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setDownloadProgressBlock:(nullable void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block; + +///------------------------------------------------- +/// @name Setting NSURLConnection Delegate Callbacks +///------------------------------------------------- + +/** + Sets a block to be executed when the connection will authenticate a challenge in order to download its request, as handled by the `NSURLConnectionDelegate` method `connection:willSendRequestForAuthenticationChallenge:`. + + @param block A block object to be executed when the connection will authenticate a challenge in order to download its request. The block has no return type and takes two arguments: the URL connection object, and the challenge that must be authenticated. This block must invoke one of the challenge-responder methods (NSURLAuthenticationChallengeSender protocol). + + If `allowsInvalidSSLCertificate` is set to YES, `connection:willSendRequestForAuthenticationChallenge:` will attempt to have the challenge sender use credentials with invalid SSL certificates. + */ +- (void)setWillSendRequestForAuthenticationChallengeBlock:(nullable void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block; + +/** + Sets a block to be executed when the server redirects the request from one URL to another URL, or when the request URL changed by the `NSURLProtocol` subclass handling the request in order to standardize its format, as handled by the `NSURLConnectionDataDelegate` method `connection:willSendRequest:redirectResponse:`. + + @param block A block object to be executed when the request URL was changed. The block returns an `NSURLRequest` object, the URL request to redirect, and takes three arguments: the URL connection object, the the proposed redirected request, and the URL response that caused the redirect. + */ +- (void)setRedirectResponseBlock:(nullable NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block; + + +/** + Sets a block to be executed to modify the response a connection will cache, if any, as handled by the `NSURLConnectionDelegate` method `connection:willCacheResponse:`. + + @param block A block object to be executed to determine what response a connection will cache, if any. The block returns an `NSCachedURLResponse` object, the cached response to store in memory or `nil` to prevent the response from being cached, and takes two arguments: the URL connection object, and the cached response provided for the request. + */ +- (void)setCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block; + +/// + +/** + + */ ++ (NSArray *)batchOfRequestOperations:(nullable NSArray *)operations + progressBlock:(nullable void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(nullable void (^)(NSArray *operations))completionBlock; + +@end + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when an operation begins executing. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingOperationDidStartNotification; + +/** + Posted when an operation finishes. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingOperationDidFinishNotification; + +NS_ASSUME_NONNULL_END diff --git a/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m new file mode 100644 index 0000000..0568005 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m @@ -0,0 +1,792 @@ +// AFURLConnectionOperation.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFURLConnectionOperation.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +#if !__has_feature(objc_arc) +#error AFNetworking must be built with ARC. +// You can turn on ARC for only AFNetworking files by adding -fobjc-arc to the build phase for each of its files. +#endif + +typedef NS_ENUM(NSInteger, AFOperationState) { + AFOperationPausedState = -1, + AFOperationReadyState = 1, + AFOperationExecutingState = 2, + AFOperationFinishedState = 3, +}; + +static dispatch_group_t url_request_operation_completion_group() { + static dispatch_group_t af_url_request_operation_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_request_operation_completion_group = dispatch_group_create(); + }); + + return af_url_request_operation_completion_group; +} + +static dispatch_queue_t url_request_operation_completion_queue() { + static dispatch_queue_t af_url_request_operation_completion_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_request_operation_completion_queue = dispatch_queue_create("com.alamofire.networking.operation.queue", DISPATCH_QUEUE_CONCURRENT ); + }); + + return af_url_request_operation_completion_queue; +} + +static NSString * const kAFNetworkingLockName = @"com.alamofire.networking.operation.lock"; + +NSString * const AFNetworkingOperationDidStartNotification = @"com.alamofire.networking.operation.start"; +NSString * const AFNetworkingOperationDidFinishNotification = @"com.alamofire.networking.operation.finish"; + +typedef void (^AFURLConnectionOperationProgressBlock)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +typedef void (^AFURLConnectionOperationAuthenticationChallengeBlock)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge); +typedef NSCachedURLResponse * (^AFURLConnectionOperationCacheResponseBlock)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse); +typedef NSURLRequest * (^AFURLConnectionOperationRedirectResponseBlock)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse); +typedef void (^AFURLConnectionOperationBackgroundTaskCleanupBlock)(); + +static inline NSString * AFKeyPathFromOperationState(AFOperationState state) { + switch (state) { + case AFOperationReadyState: + return @"isReady"; + case AFOperationExecutingState: + return @"isExecuting"; + case AFOperationFinishedState: + return @"isFinished"; + case AFOperationPausedState: + return @"isPaused"; + default: { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + return @"state"; +#pragma clang diagnostic pop + } + } +} + +static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperationState toState, BOOL isCancelled) { + switch (fromState) { + case AFOperationReadyState: + switch (toState) { + case AFOperationPausedState: + case AFOperationExecutingState: + return YES; + case AFOperationFinishedState: + return isCancelled; + default: + return NO; + } + case AFOperationExecutingState: + switch (toState) { + case AFOperationPausedState: + case AFOperationFinishedState: + return YES; + default: + return NO; + } + case AFOperationFinishedState: + return NO; + case AFOperationPausedState: + return toState == AFOperationReadyState; + default: { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + switch (toState) { + case AFOperationPausedState: + case AFOperationReadyState: + case AFOperationExecutingState: + case AFOperationFinishedState: + return YES; + default: + return NO; + } + } +#pragma clang diagnostic pop + } +} + +@interface AFURLConnectionOperation () +@property (readwrite, nonatomic, assign) AFOperationState state; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@property (readwrite, nonatomic, strong) NSURLConnection *connection; +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@property (readwrite, nonatomic, strong) NSError *error; +@property (readwrite, nonatomic, strong) NSData *responseData; +@property (readwrite, nonatomic, copy) NSString *responseString; +@property (readwrite, nonatomic, assign) NSStringEncoding responseStringEncoding; +@property (readwrite, nonatomic, assign) long long totalBytesRead; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationBackgroundTaskCleanupBlock backgroundTaskCleanup; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock uploadProgress; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock downloadProgress; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationAuthenticationChallengeBlock authenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationCacheResponseBlock cacheResponse; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationRedirectResponseBlock redirectResponse; + +- (void)operationDidStart; +- (void)finish; +- (void)cancelConnection; +@end + +@implementation AFURLConnectionOperation +@synthesize outputStream = _outputStream; + ++ (void)networkRequestThreadEntryPoint:(id)__unused object { + @autoreleasepool { + [[NSThread currentThread] setName:@"AFNetworking"]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; + [runLoop run]; + } +} + ++ (NSThread *)networkRequestThread { + static NSThread *_networkRequestThread = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil]; + [_networkRequestThread start]; + }); + + return _networkRequestThread; +} + +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest { + NSParameterAssert(urlRequest); + + self = [super init]; + if (!self) { + return nil; + } + + _state = AFOperationReadyState; + + self.lock = [[NSRecursiveLock alloc] init]; + self.lock.name = kAFNetworkingLockName; + + self.runLoopModes = [NSSet setWithObject:NSRunLoopCommonModes]; + + self.request = urlRequest; + + self.shouldUseCredentialStorage = YES; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + return self; +} + +- (instancetype)init NS_UNAVAILABLE +{ + return nil; +} + +- (void)dealloc { + if (_outputStream) { + [_outputStream close]; + _outputStream = nil; + } + + if (_backgroundTaskCleanup) { + _backgroundTaskCleanup(); + } +} + +#pragma mark - + +- (void)setResponseData:(NSData *)responseData { + [self.lock lock]; + if (!responseData) { + _responseData = nil; + } else { + _responseData = [NSData dataWithBytes:responseData.bytes length:responseData.length]; + } + [self.lock unlock]; +} + +- (NSString *)responseString { + [self.lock lock]; + if (!_responseString && self.response && self.responseData) { + self.responseString = [[NSString alloc] initWithData:self.responseData encoding:self.responseStringEncoding]; + } + [self.lock unlock]; + + return _responseString; +} + +- (NSStringEncoding)responseStringEncoding { + [self.lock lock]; + if (!_responseStringEncoding && self.response) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (self.response.textEncodingName) { + CFStringEncoding IANAEncoding = CFStringConvertIANACharSetNameToEncoding((__bridge CFStringRef)self.response.textEncodingName); + if (IANAEncoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(IANAEncoding); + } + } + + self.responseStringEncoding = stringEncoding; + } + [self.lock unlock]; + + return _responseStringEncoding; +} + +- (NSInputStream *)inputStream { + return self.request.HTTPBodyStream; +} + +- (void)setInputStream:(NSInputStream *)inputStream { + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + mutableRequest.HTTPBodyStream = inputStream; + self.request = mutableRequest; +} + +- (NSOutputStream *)outputStream { + if (!_outputStream) { + self.outputStream = [NSOutputStream outputStreamToMemory]; + } + + return _outputStream; +} + +- (void)setOutputStream:(NSOutputStream *)outputStream { + [self.lock lock]; + if (outputStream != _outputStream) { + if (_outputStream) { + [_outputStream close]; + } + + _outputStream = outputStream; + } + [self.lock unlock]; +} + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler { + [self.lock lock]; + if (!self.backgroundTaskCleanup) { + UIApplication *application = [UIApplication sharedApplication]; + UIBackgroundTaskIdentifier __block backgroundTaskIdentifier = UIBackgroundTaskInvalid; + __weak __typeof(self)weakSelf = self; + + self.backgroundTaskCleanup = ^(){ + if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { + [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier]; + backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + }; + + backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ + __strong __typeof(weakSelf)strongSelf = weakSelf; + + if (handler) { + handler(); + } + + if (strongSelf) { + [strongSelf cancel]; + strongSelf.backgroundTaskCleanup(); + } + }]; + } + [self.lock unlock]; +} +#endif + +#pragma mark - + +- (void)setState:(AFOperationState)state { + if (!AFStateTransitionIsValid(self.state, state, [self isCancelled])) { + return; + } + + [self.lock lock]; + NSString *oldStateKey = AFKeyPathFromOperationState(self.state); + NSString *newStateKey = AFKeyPathFromOperationState(state); + + [self willChangeValueForKey:newStateKey]; + [self willChangeValueForKey:oldStateKey]; + _state = state; + [self didChangeValueForKey:oldStateKey]; + [self didChangeValueForKey:newStateKey]; + [self.lock unlock]; +} + +- (void)pause { + if ([self isPaused] || [self isFinished] || [self isCancelled]) { + return; + } + + [self.lock lock]; + if ([self isExecuting]) { + [self performSelector:@selector(operationDidPause) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; + }); + } + + self.state = AFOperationPausedState; + [self.lock unlock]; +} + +- (void)operationDidPause { + [self.lock lock]; + [self.connection cancel]; + [self.lock unlock]; +} + +- (BOOL)isPaused { + return self.state == AFOperationPausedState; +} + +- (void)resume { + if (![self isPaused]) { + return; + } + + [self.lock lock]; + self.state = AFOperationReadyState; + + [self start]; + [self.lock unlock]; +} + +#pragma mark - + +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block { + self.uploadProgress = block; +} + +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block { + self.downloadProgress = block; +} + +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block { + self.authenticationChallenge = block; +} + +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block { + self.cacheResponse = block; +} + +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block { + self.redirectResponse = block; +} + +#pragma mark - NSOperation + +- (void)setCompletionBlock:(void (^)(void))block { + [self.lock lock]; + if (!block) { + [super setCompletionBlock:nil]; + } else { + __weak __typeof(self)weakSelf = self; + [super setCompletionBlock:^ { + __strong __typeof(weakSelf)strongSelf = weakSelf; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_group_t group = strongSelf.completionGroup ?: url_request_operation_completion_group(); + dispatch_queue_t queue = strongSelf.completionQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + + dispatch_group_async(group, queue, ^{ + block(); + }); + + dispatch_group_notify(group, url_request_operation_completion_queue(), ^{ + [strongSelf setCompletionBlock:nil]; + }); + }]; + } + [self.lock unlock]; +} + +- (BOOL)isReady { + return self.state == AFOperationReadyState && [super isReady]; +} + +- (BOOL)isExecuting { + return self.state == AFOperationExecutingState; +} + +- (BOOL)isFinished { + return self.state == AFOperationFinishedState; +} + +- (BOOL)isConcurrent { + return YES; +} + +- (void)start { + [self.lock lock]; + if ([self isCancelled]) { + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } else if ([self isReady]) { + self.state = AFOperationExecutingState; + + [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + [self.lock unlock]; +} + +- (void)operationDidStart { + [self.lock lock]; + if (![self isCancelled]) { + self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + for (NSString *runLoopMode in self.runLoopModes) { + [self.connection scheduleInRunLoop:runLoop forMode:runLoopMode]; + [self.outputStream scheduleInRunLoop:runLoop forMode:runLoopMode]; + } + + [self.outputStream open]; + [self.connection start]; + } + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidStartNotification object:self]; + }); +} + +- (void)finish { + [self.lock lock]; + self.state = AFOperationFinishedState; + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; + }); +} + +- (void)cancel { + [self.lock lock]; + if (![self isFinished] && ![self isCancelled]) { + [super cancel]; + + if ([self isExecuting]) { + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + } + [self.lock unlock]; +} + +- (void)cancelConnection { + NSDictionary *userInfo = nil; + if ([self.request URL]) { + userInfo = @{NSURLErrorFailingURLErrorKey : [self.request URL]}; + } + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:userInfo]; + + if (![self isFinished]) { + if (self.connection) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:error]; + } else { + // Accommodate race condition where `self.connection` has not yet been set before cancellation + self.error = error; + [self finish]; + } + } +} + +#pragma mark - + ++ (NSArray *)batchOfRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock +{ + if (!operations || [operations count] == 0) { + return @[[NSBlockOperation blockOperationWithBlock:^{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(@[]); + } + }); + }]]; + } + + __block dispatch_group_t group = dispatch_group_create(); + NSBlockOperation *batchedOperation = [NSBlockOperation blockOperationWithBlock:^{ + dispatch_group_notify(group, dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(operations); + } + }); + }]; + + for (AFURLConnectionOperation *operation in operations) { + operation.completionGroup = group; + void (^originalCompletionBlock)(void) = [operation.completionBlock copy]; + __weak __typeof(operation)weakOperation = operation; + operation.completionBlock = ^{ + __strong __typeof(weakOperation)strongOperation = weakOperation; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_queue_t queue = strongOperation.completionQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + dispatch_group_async(group, queue, ^{ + if (originalCompletionBlock) { + originalCompletionBlock(); + } + + NSUInteger numberOfFinishedOperations = [[operations indexesOfObjectsPassingTest:^BOOL(id op, NSUInteger __unused idx, BOOL __unused *stop) { + return [op isFinished]; + }] count]; + + if (progressBlock) { + progressBlock(numberOfFinishedOperations, [operations count]); + } + + dispatch_group_leave(group); + }); + }; + + dispatch_group_enter(group); + [batchedOperation addDependency:operation]; + } + + return [operations arrayByAddingObject:batchedOperation]; +} + +#pragma mark - NSObject + +- (NSString *)description { + [self.lock lock]; + NSString *description = [NSString stringWithFormat:@"<%@: %p, state: %@, cancelled: %@ request: %@, response: %@>", NSStringFromClass([self class]), self, AFKeyPathFromOperationState(self.state), ([self isCancelled] ? @"YES" : @"NO"), self.request, self.response]; + [self.lock unlock]; + return description; +} + +#pragma mark - NSURLConnectionDelegate + +- (void)connection:(NSURLConnection *)connection +willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge +{ + if (self.authenticationChallenge) { + self.authenticationChallenge(connection, challenge); + return; + } + + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] cancelAuthenticationChallenge:challenge]; + } + } else { + if ([challenge previousFailureCount] == 0) { + if (self.credential) { + [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } +} + +- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connection { + return self.shouldUseCredentialStorage; +} + +- (NSURLRequest *)connection:(NSURLConnection *)connection + willSendRequest:(NSURLRequest *)request + redirectResponse:(NSURLResponse *)redirectResponse +{ + if (self.redirectResponse) { + return self.redirectResponse(connection, request, redirectResponse); + } else { + return request; + } +} + +- (void)connection:(NSURLConnection __unused *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite +{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.uploadProgress) { + self.uploadProgress((NSUInteger)bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + }); +} + +- (void)connection:(NSURLConnection __unused *)connection +didReceiveResponse:(NSURLResponse *)response +{ + self.response = response; +} + +- (void)connection:(NSURLConnection __unused *)connection + didReceiveData:(NSData *)data +{ + NSUInteger length = [data length]; + while (YES) { + NSInteger totalNumberOfBytesWritten = 0; + if ([self.outputStream hasSpaceAvailable]) { + const uint8_t *dataBuffer = (uint8_t *)[data bytes]; + + NSInteger numberOfBytesWritten = 0; + while (totalNumberOfBytesWritten < (NSInteger)length) { + numberOfBytesWritten = [self.outputStream write:&dataBuffer[(NSUInteger)totalNumberOfBytesWritten] maxLength:(length - (NSUInteger)totalNumberOfBytesWritten)]; + if (numberOfBytesWritten == -1) { + break; + } + + totalNumberOfBytesWritten += numberOfBytesWritten; + } + + break; + } else { + [self.connection cancel]; + if (self.outputStream.streamError) { + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError]; + } + return; + } + } + + dispatch_async(dispatch_get_main_queue(), ^{ + self.totalBytesRead += (long long)length; + + if (self.downloadProgress) { + self.downloadProgress(length, self.totalBytesRead, self.response.expectedContentLength); + } + }); +} + +- (void)connectionDidFinishLoading:(NSURLConnection __unused *)connection { + self.responseData = [self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; + + [self.outputStream close]; + if (self.responseData) { + self.outputStream = nil; + } + + self.connection = nil; + + [self finish]; +} + +- (void)connection:(NSURLConnection __unused *)connection + didFailWithError:(NSError *)error +{ + self.error = error; + + [self.outputStream close]; + if (self.responseData) { + self.outputStream = nil; + } + + self.connection = nil; + + [self finish]; +} + +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection + willCacheResponse:(NSCachedURLResponse *)cachedResponse +{ + if (self.cacheResponse) { + return self.cacheResponse(connection, cachedResponse); + } else { + if ([self isCancelled]) { + return nil; + } + + return cachedResponse; + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURLRequest *request = [decoder decodeObjectOfClass:[NSURLRequest class] forKey:NSStringFromSelector(@selector(request))]; + + self = [self initWithRequest:request]; + if (!self) { + return nil; + } + + self.state = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(state))] integerValue]; + self.response = [decoder decodeObjectOfClass:[NSHTTPURLResponse class] forKey:NSStringFromSelector(@selector(response))]; + self.error = [decoder decodeObjectOfClass:[NSError class] forKey:NSStringFromSelector(@selector(error))]; + self.responseData = [decoder decodeObjectOfClass:[NSData class] forKey:NSStringFromSelector(@selector(responseData))]; + self.totalBytesRead = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(totalBytesRead))] longLongValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [self pause]; + + [coder encodeObject:self.request forKey:NSStringFromSelector(@selector(request))]; + + switch (self.state) { + case AFOperationExecutingState: + case AFOperationPausedState: + [coder encodeInteger:AFOperationReadyState forKey:NSStringFromSelector(@selector(state))]; + break; + default: + [coder encodeInteger:self.state forKey:NSStringFromSelector(@selector(state))]; + break; + } + + [coder encodeObject:self.response forKey:NSStringFromSelector(@selector(response))]; + [coder encodeObject:self.error forKey:NSStringFromSelector(@selector(error))]; + [coder encodeObject:self.responseData forKey:NSStringFromSelector(@selector(responseData))]; + [coder encodeInt64:self.totalBytesRead forKey:NSStringFromSelector(@selector(totalBytesRead))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFURLConnectionOperation *operation = [(AFURLConnectionOperation *)[[self class] allocWithZone:zone] initWithRequest:self.request]; + + operation.uploadProgress = self.uploadProgress; + operation.downloadProgress = self.downloadProgress; + operation.authenticationChallenge = self.authenticationChallenge; + operation.cacheResponse = self.cacheResponse; + operation.redirectResponse = self.redirectResponse; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +@end diff --git a/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h new file mode 100644 index 0000000..ef4d366 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1,473 @@ +// AFURLRequestSerialization.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import +#if TARGET_OS_IOS +#import +#elif TARGET_OS_WATCH +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + The `AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary. + + For example, a JSON request serializer may set the HTTP body of the request to a JSON representation, and set the `Content-Type` HTTP header field value to `application/json`. + */ +@protocol AFURLRequestSerialization + +/** + Returns a request with the specified parameters encoded into a copy of the original request. + + @param request The original request. + @param parameters The parameters to be encoded. + @param error The error that occurred while attempting to encode the request parameters. + + @return A serialized request. + */ +- (nullable NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(nullable id)parameters + error:(NSError * __nullable __autoreleasing *)error; + +@end + +#pragma mark - + +/** + + */ +typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) { + AFHTTPRequestQueryStringDefaultStyle = 0, +}; + +@protocol AFMultipartFormData; + +/** + `AFHTTPRequestSerializer` conforms to the `AFURLRequestSerialization` & `AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation. + + Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPRequestSerializer` in order to ensure consistent default behavior. + */ +@interface AFHTTPRequestSerializer : NSObject + +/** + The string encoding used to serialize parameters. `NSUTF8StringEncoding` by default. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + Whether created requests can use the device’s cellular radio (if present). `YES` by default. + + @see NSMutableURLRequest -setAllowsCellularAccess: + */ +@property (nonatomic, assign) BOOL allowsCellularAccess; + +/** + The cache policy of created requests. `NSURLRequestUseProtocolCachePolicy` by default. + + @see NSMutableURLRequest -setCachePolicy: + */ +@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy; + +/** + Whether created requests should use the default cookie handling. `YES` by default. + + @see NSMutableURLRequest -setHTTPShouldHandleCookies: + */ +@property (nonatomic, assign) BOOL HTTPShouldHandleCookies; + +/** + Whether created requests can continue transmitting data before receiving a response from an earlier transmission. `NO` by default + + @see NSMutableURLRequest -setHTTPShouldUsePipelining: + */ +@property (nonatomic, assign) BOOL HTTPShouldUsePipelining; + +/** + The network service type for created requests. `NSURLNetworkServiceTypeDefault` by default. + + @see NSMutableURLRequest -setNetworkServiceType: + */ +@property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType; + +/** + The timeout interval, in seconds, for created requests. The default timeout interval is 60 seconds. + + @see NSMutableURLRequest -setTimeoutInterval: + */ +@property (nonatomic, assign) NSTimeInterval timeoutInterval; + +///--------------------------------------- +/// @name Configuring HTTP Request Headers +///--------------------------------------- + +/** + Default HTTP header field values to be applied to serialized requests. By default, these include the following: + + - `Accept-Language` with the contents of `NSLocale +preferredLanguages` + - `User-Agent` with the contents of various bundle identifiers and OS designations + + @discussion To add or remove default request headers, use `setValue:forHTTPHeaderField:`. + */ +@property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders; + +/** + Creates and returns a serializer with default configuration. + */ ++ (instancetype)serializer; + +/** + Sets the value for the HTTP headers set in request objects made by the HTTP client. If `nil`, removes the existing value for that header. + + @param field The HTTP header to set a default value for + @param value The value set as default for the specified header, or `nil` + */ +- (void)setValue:(nullable NSString *)value +forHTTPHeaderField:(NSString *)field; + +/** + Returns the value for the HTTP headers set in the request serializer. + + @param field The HTTP header to retrieve the default value for + + @return The value set as default for the specified header, or `nil` + */ +- (nullable NSString *)valueForHTTPHeaderField:(NSString *)field; + +/** + Sets the "Authorization" HTTP header set in request objects made by the HTTP client to a basic authentication value with Base64-encoded username and password. This overwrites any existing value for this header. + + @param username The HTTP basic auth username + @param password The HTTP basic auth password + */ +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password; + +/** + @deprecated This method has been deprecated. Use -setValue:forHTTPHeaderField: instead. + */ +- (void)setAuthorizationHeaderFieldWithToken:(NSString *)token DEPRECATED_ATTRIBUTE; + + +/** + Clears any existing value for the "Authorization" HTTP header. + */ +- (void)clearAuthorizationHeader; + +///------------------------------------------------------- +/// @name Configuring Query String Parameter Serialization +///------------------------------------------------------- + +/** + HTTP methods for which serialized requests will encode parameters as a query string. `GET`, `HEAD`, and `DELETE` by default. + */ +@property (nonatomic, strong) NSSet *HTTPMethodsEncodingParametersInURI; + +/** + Set the method of query string serialization according to one of the pre-defined styles. + + @param style The serialization style. + + @see AFHTTPRequestQueryStringSerializationStyle + */ +- (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializationStyle)style; + +/** + Set the a custom method of query string serialization according to the specified block. + + @param block A block that defines a process of encoding parameters into a query string. This block returns the query string and takes three arguments: the request, the parameters to encode, and the error that occurred when attempting to encode parameters for the given request. + */ +- (void)setQueryStringSerializationWithBlock:(nullable NSString * (^)(NSURLRequest *request, id parameters, NSError * __autoreleasing *error))block; + +///------------------------------- +/// @name Creating Request Objects +///------------------------------- + +/** + @deprecated This method has been deprecated. Use -requestWithMethod:URLString:parameters:error: instead. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters DEPRECATED_ATTRIBUTE; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and URL string. + + If the HTTP method is `GET`, `HEAD`, or `DELETE`, the parameters will be used to construct a url-encoded query string that is appended to the request's URL. Otherwise, the parameters will be encoded according to the value of the `parameterEncoding` property, and set as the request body. + + @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. This parameter must not be `nil`. + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be either set as a query string for `GET` requests, or the request HTTP body. + @param error The error that occurred while constructing the request. + + @return An `NSMutableURLRequest` object. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(nullable id)parameters + error:(NSError * __nullable __autoreleasing *)error; + +/** + @deprecated This method has been deprecated. Use -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error: instead. + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block DEPRECATED_ATTRIBUTE; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and URLString, and constructs a `multipart/form-data` HTTP body, using the specified parameters and multipart form data block. See http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 + + Multipart form requests are automatically streamed, reading files directly from disk along with in-memory data in a single HTTP body. The resulting `NSMutableURLRequest` object has an `HTTPBodyStream` property, so refrain from setting `HTTPBodyStream` or `HTTPBody` on this request object, as it will clear out the multipart form body stream. + + @param method The HTTP method for the request. This parameter must not be `GET` or `HEAD`, or `nil`. + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param error The error that occurred while constructing the request. + + @return An `NSMutableURLRequest` object + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + error:(NSError * __nullable __autoreleasing *)error; + +/** + Creates an `NSMutableURLRequest` by removing the `HTTPBodyStream` from a request, and asynchronously writing its contents into the specified file, invoking the completion handler when finished. + + @param request The multipart form request. The `HTTPBodyStream` property of `request` must not be `nil`. + @param fileURL The file URL to write multipart form contents to. + @param handler A handler block to execute. + + @discussion There is a bug in `NSURLSessionTask` that causes requests to not send a `Content-Length` header when streaming contents from an HTTP body, which is notably problematic when interacting with the Amazon S3 webservice. As a workaround, this method takes a request constructed with `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:`, or any other request with an `HTTPBodyStream`, writes the contents to the specified file and returns a copy of the original request with the `HTTPBodyStream` property set to `nil`. From here, the file can either be passed to `AFURLSessionManager -uploadTaskWithRequest:fromFile:progress:completionHandler:`, or have its contents read into an `NSData` that's assigned to the `HTTPBody` property of the request. + + @see https://github.com/AFNetworking/AFNetworking/issues/1398 + */ +- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request + writingStreamContentsToFile:(NSURL *)fileURL + completionHandler:(nullable void (^)(NSError * __nullable error))handler; + +@end + +#pragma mark - + +/** + The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:`. + */ +@protocol AFMultipartFormData + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{generated filename}; name=#{name}"` and `Content-Type: #{generated mimeType}`, followed by the encoded file data and the multipart form boundary. + + The filename and MIME type for this data in the form will be automatically generated, using the last path component of the `fileURL` and system associated MIME type for the `fileURL` extension, respectively. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended, otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __nullable __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The file name to be used in the `Content-Disposition` header. This parameter must not be `nil`. + @param mimeType The declared MIME type of the file data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __nullable __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the data from the input stream and the multipart form boundary. + + @param inputStream The input stream to be appended to the form data + @param name The name to be associated with the specified input stream. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified input stream. This parameter must not be `nil`. + @param length The length of the specified input stream in bytes. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithInputStream:(nullable NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(int64_t)length + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified data. This parameter must not be `nil`. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP headers `Content-Disposition: form-data; name=#{name}"`, followed by the encoded data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + */ + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name; + + +/** + Appends HTTP headers, followed by the encoded data and the multipart form boundary. + + @param headers The HTTP headers to be appended to the form data. + @param body The data to be encoded and appended to the form data. This parameter must not be `nil`. + */ +- (void)appendPartWithHeaders:(nullable NSDictionary *)headers + body:(NSData *)body; + +/** + Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream. + + When uploading over a 3G or EDGE connection, requests may fail with "request body stream exhausted". Setting a maximum packet size and delay according to the recommended values (`kAFUploadStream3GSuggestedPacketSize` and `kAFUploadStream3GSuggestedDelay`) lowers the risk of the input stream exceeding its allocated bandwidth. Unfortunately, there is no definite way to distinguish between a 3G, EDGE, or LTE connection over `NSURLConnection`. As such, it is not recommended that you throttle bandwidth based solely on network reachability. Instead, you should consider checking for the "request body stream exhausted" in a failure block, and then retrying the request with throttled bandwidth. + + @param numberOfBytes Maximum packet size, in number of bytes. The default packet size for an input stream is 16kb. + @param delay Duration of delay each time a packet is read. By default, no delay is set. + */ +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay; + +@end + +#pragma mark - + +/** + `AFJSONRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`. + */ +@interface AFJSONRequestSerializer : AFHTTPRequestSerializer + +/** + Options for writing the request JSON data from Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONWritingOptions". `0` by default. + */ +@property (nonatomic, assign) NSJSONWritingOptions writingOptions; + +/** + Creates and returns a JSON serializer with specified reading and writing options. + + @param writingOptions The specified JSON writing options. + */ ++ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions; + +@end + +#pragma mark - + +/** + `AFPropertyListRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSPropertyListSerializer`, setting the `Content-Type` of the encoded request to `application/x-plist`. + */ +@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer + +/** + The property list format. Possible values are described in "NSPropertyListFormat". + */ +@property (nonatomic, assign) NSPropertyListFormat format; + +/** + @warning The `writeOptions` property is currently unused. + */ +@property (nonatomic, assign) NSPropertyListWriteOptions writeOptions; + +/** + Creates and returns a property list serializer with a specified format, read options, and write options. + + @param format The property list format. + @param writeOptions The property list write options. + + @warning The `writeOptions` property is currently unused. + */ ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + writeOptions:(NSPropertyListWriteOptions)writeOptions; + +@end + +#pragma mark - + +///---------------- +/// @name Constants +///---------------- + +/** + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFURLRequestSerializationErrorDomain` + + ### Constants + + `AFURLRequestSerializationErrorDomain` + AFURLRequestSerializer errors. Error codes for `AFURLRequestSerializationErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +FOUNDATION_EXPORT NSString * const AFURLRequestSerializationErrorDomain; + +/** + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLRequestErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLRequestErrorKey` + The corresponding value is an `NSURLRequest` containing the request of the operation associated with an error. This key is only present in the `AFURLRequestSerializationErrorDomain`. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingOperationFailingURLRequestErrorKey; + +/** + ## Throttling Bandwidth for HTTP Request Input Streams + + @see -throttleBandwidthWithPacketSize:delay: + + ### Constants + + `kAFUploadStream3GSuggestedPacketSize` + Maximum packet size, in number of bytes. Equal to 16kb. + + `kAFUploadStream3GSuggestedDelay` + Duration of delay each time a packet is read. Equal to 0.2 seconds. + */ +FOUNDATION_EXPORT NSUInteger const kAFUploadStream3GSuggestedPacketSize; +FOUNDATION_EXPORT NSTimeInterval const kAFUploadStream3GSuggestedDelay; + +NS_ASSUME_NONNULL_END diff --git a/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m new file mode 100644 index 0000000..e387c24 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m @@ -0,0 +1,1425 @@ +// AFURLRequestSerialization.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFURLRequestSerialization.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +NSString * const AFURLRequestSerializationErrorDomain = @"com.alamofire.error.serialization.request"; +NSString * const AFNetworkingOperationFailingURLRequestErrorKey = @"com.alamofire.serialization.request.error.response"; + +typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, id parameters, NSError *__autoreleasing *error); + +static NSString * AFBase64EncodedStringFromString(NSString *string) { + NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; + NSUInteger length = [data length]; + NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; + + uint8_t *input = (uint8_t *)[data bytes]; + uint8_t *output = (uint8_t *)[mutableData mutableBytes]; + + for (NSUInteger i = 0; i < length; i += 3) { + NSUInteger value = 0; + for (NSUInteger j = i; j < (i + 3); j++) { + value <<= 8; + if (j < length) { + value |= (0xFF & input[j]); + } + } + + static uint8_t const kAFBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + NSUInteger idx = (i / 3) * 4; + output[idx + 0] = kAFBase64EncodingTable[(value >> 18) & 0x3F]; + output[idx + 1] = kAFBase64EncodingTable[(value >> 12) & 0x3F]; + output[idx + 2] = (i + 1) < length ? kAFBase64EncodingTable[(value >> 6) & 0x3F] : '='; + output[idx + 3] = (i + 2) < length ? kAFBase64EncodingTable[(value >> 0) & 0x3F] : '='; + } + + return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding]; +} + +/** + Returns a percent-escaped string following RFC 3986 for a query string key or value. + RFC 3986 states that the following characters are "reserved" characters. + - General Delimiters: ":", "#", "[", "]", "@", "?", "/" + - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" + + In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow + query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/" + should be percent-escaped in the query string. + - parameter string: The string to be percent-escaped. + - returns: The percent-escaped string. + */ +static NSString * AFPercentEscapedStringFromString(NSString *string) { + static NSString * const kAFCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4 + static NSString * const kAFCharactersSubDelimitersToEncode = @"!$&'()*+,;="; + + NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + [allowedCharacterSet removeCharactersInString:[kAFCharactersGeneralDelimitersToEncode stringByAppendingString:kAFCharactersSubDelimitersToEncode]]; + + // FIXME: https://github.com/AFNetworking/AFNetworking/pull/3028 + // return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet]; + + static NSUInteger const batchSize = 50; + + NSInteger index = 0; + NSMutableString *escaped = @"".mutableCopy; + + while (index < string.length) { + NSUInteger length = MIN(string.length - index, batchSize); + NSRange range = NSMakeRange(index, length); + + // To avoid breaking up character sequences such as 👴🏻👮🏽 + range = [string rangeOfComposedCharacterSequencesForRange:range]; + + NSString *substring = [string substringWithRange:range]; + NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet]; + [escaped appendString:encoded]; + + index += range.length; + } + + return escaped; +} + +#pragma mark - + +@interface AFQueryStringPair : NSObject +@property (readwrite, nonatomic, strong) id field; +@property (readwrite, nonatomic, strong) id value; + +- (id)initWithField:(id)field value:(id)value; + +- (NSString *)URLEncodedStringValue; +@end + +@implementation AFQueryStringPair + +- (id)initWithField:(id)field value:(id)value { + self = [super init]; + if (!self) { + return nil; + } + + self.field = field; + self.value = value; + + return self; +} + +- (NSString *)URLEncodedStringValue { + if (!self.value || [self.value isEqual:[NSNull null]]) { + return AFPercentEscapedStringFromString([self.field description]); + } else { + return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])]; + } +} + +@end + +#pragma mark - + +FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary); +FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value); + +static NSString * AFQueryStringFromParameters(NSDictionary *parameters) { + NSMutableArray *mutablePairs = [NSMutableArray array]; + for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { + [mutablePairs addObject:[pair URLEncodedStringValue]]; + } + + return [mutablePairs componentsJoinedByString:@"&"]; +} + +NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary) { + return AFQueryStringPairsFromKeyAndValue(nil, dictionary); +} + +NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) { + NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; + + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)]; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries + for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + id nestedValue = dictionary[nestedKey]; + if (nestedValue) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + for (id nestedValue in array) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; + } + } else if ([value isKindOfClass:[NSSet class]]) { + NSSet *set = value; + for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)]; + } + } else { + [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]]; + } + + return mutableQueryStringComponents; +} + +#pragma mark - + +@interface AFStreamingMultipartFormData : NSObject +- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding; + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData; +@end + +#pragma mark - + +static NSArray * AFHTTPRequestSerializerObservedKeyPaths() { + static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))]; + }); + + return _AFHTTPRequestSerializerObservedKeyPaths; +} + +static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext; + +@interface AFHTTPRequestSerializer () +@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths; +@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders; +@property (readwrite, nonatomic, assign) AFHTTPRequestQueryStringSerializationStyle queryStringSerializationStyle; +@property (readwrite, nonatomic, copy) AFQueryStringSerializationBlock queryStringSerialization; +@end + +@implementation AFHTTPRequestSerializer + ++ (instancetype)serializer { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = NSUTF8StringEncoding; + + self.mutableHTTPRequestHeaders = [NSMutableDictionary dictionary]; + + // Accept-Language HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 + NSMutableArray *acceptLanguagesComponents = [NSMutableArray array]; + [[NSLocale preferredLanguages] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + float q = 1.0f - (idx * 0.1f); + [acceptLanguagesComponents addObject:[NSString stringWithFormat:@"%@;q=%0.1g", obj, q]]; + *stop = q <= 0.5f; + }]; + [self setValue:[acceptLanguagesComponents componentsJoinedByString:@", "] forHTTPHeaderField:@"Accept-Language"]; + + NSString *userAgent = nil; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" +#if TARGET_OS_IOS + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]]; +#elif TARGET_OS_WATCH + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; watchOS %@; Scale/%0.2f)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[WKInterfaceDevice currentDevice] model], [[WKInterfaceDevice currentDevice] systemVersion], [[WKInterfaceDevice currentDevice] screenScale]]; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; +#endif +#pragma clang diagnostic pop + if (userAgent) { + if (![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) { + NSMutableString *mutableUserAgent = [userAgent mutableCopy]; + if (CFStringTransform((__bridge CFMutableStringRef)(mutableUserAgent), NULL, (__bridge CFStringRef)@"Any-Latin; Latin-ASCII; [:^ASCII:] Remove", false)) { + userAgent = mutableUserAgent; + } + } + [self setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + + // HTTP Method Definitions; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil]; + + self.mutableObservedChangedKeyPaths = [NSMutableSet set]; + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext]; + } + } + + return self; +} + +- (void)dealloc { + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext]; + } + } +} + +#pragma mark - + +// Workarounds for crashing behavior using Key-Value Observing with XCTest +// See https://github.com/AFNetworking/AFNetworking/issues/2523 + +- (void)setAllowsCellularAccess:(BOOL)allowsCellularAccess { + [self willChangeValueForKey:NSStringFromSelector(@selector(allowsCellularAccess))]; + _allowsCellularAccess = allowsCellularAccess; + [self didChangeValueForKey:NSStringFromSelector(@selector(allowsCellularAccess))]; +} + +- (void)setCachePolicy:(NSURLRequestCachePolicy)cachePolicy { + [self willChangeValueForKey:NSStringFromSelector(@selector(cachePolicy))]; + _cachePolicy = cachePolicy; + [self didChangeValueForKey:NSStringFromSelector(@selector(cachePolicy))]; +} + +- (void)setHTTPShouldHandleCookies:(BOOL)HTTPShouldHandleCookies { + [self willChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldHandleCookies))]; + _HTTPShouldHandleCookies = HTTPShouldHandleCookies; + [self didChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldHandleCookies))]; +} + +- (void)setHTTPShouldUsePipelining:(BOOL)HTTPShouldUsePipelining { + [self willChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldUsePipelining))]; + _HTTPShouldUsePipelining = HTTPShouldUsePipelining; + [self didChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldUsePipelining))]; +} + +- (void)setNetworkServiceType:(NSURLRequestNetworkServiceType)networkServiceType { + [self willChangeValueForKey:NSStringFromSelector(@selector(networkServiceType))]; + _networkServiceType = networkServiceType; + [self didChangeValueForKey:NSStringFromSelector(@selector(networkServiceType))]; +} + +- (void)setTimeoutInterval:(NSTimeInterval)timeoutInterval { + [self willChangeValueForKey:NSStringFromSelector(@selector(timeoutInterval))]; + _timeoutInterval = timeoutInterval; + [self didChangeValueForKey:NSStringFromSelector(@selector(timeoutInterval))]; +} + +#pragma mark - + +- (NSDictionary *)HTTPRequestHeaders { + return [NSDictionary dictionaryWithDictionary:self.mutableHTTPRequestHeaders]; +} + +- (void)setValue:(NSString *)value +forHTTPHeaderField:(NSString *)field +{ + [self.mutableHTTPRequestHeaders setValue:value forKey:field]; +} + +- (NSString *)valueForHTTPHeaderField:(NSString *)field { + return [self.mutableHTTPRequestHeaders valueForKey:field]; +} + +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password +{ + NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", username, password]; + [self setValue:[NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)] forHTTPHeaderField:@"Authorization"]; +} + +- (void)setAuthorizationHeaderFieldWithToken:(NSString *)token { + [self setValue:[NSString stringWithFormat:@"Token token=\"%@\"", token] forHTTPHeaderField:@"Authorization"]; +} + +- (void)clearAuthorizationHeader { + [self.mutableHTTPRequestHeaders removeObjectForKey:@"Authorization"]; +} + +#pragma mark - + +- (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializationStyle)style { + self.queryStringSerializationStyle = style; + self.queryStringSerialization = nil; +} + +- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, id, NSError *__autoreleasing *))block { + self.queryStringSerialization = block; +} + +#pragma mark - + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters +{ + return [self requestWithMethod:method URLString:URLString parameters:parameters error:nil]; +} + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(method); + NSParameterAssert(URLString); + + NSURL *url = [NSURL URLWithString:URLString]; + + NSParameterAssert(url); + + NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; + mutableRequest.HTTPMethod = method; + + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) { + [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath]; + } + } + + mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy]; + + return mutableRequest; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block +{ + return [self multipartFormRequestWithMethod:method URLString:URLString parameters:parameters constructingBodyWithBlock:block error:nil]; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(method); + NSParameterAssert(![method isEqualToString:@"GET"] && ![method isEqualToString:@"HEAD"]); + + NSMutableURLRequest *mutableRequest = [self requestWithMethod:method URLString:URLString parameters:nil error:error]; + + __block AFStreamingMultipartFormData *formData = [[AFStreamingMultipartFormData alloc] initWithURLRequest:mutableRequest stringEncoding:NSUTF8StringEncoding]; + + if (parameters) { + for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { + NSData *data = nil; + if ([pair.value isKindOfClass:[NSData class]]) { + data = pair.value; + } else if ([pair.value isEqual:[NSNull null]]) { + data = [NSData data]; + } else { + data = [[pair.value description] dataUsingEncoding:self.stringEncoding]; + } + + if (data) { + [formData appendPartWithFormData:data name:[pair.field description]]; + } + } + } + + if (block) { + block(formData); + } + + return [formData requestByFinalizingMultipartFormData]; +} + +- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request + writingStreamContentsToFile:(NSURL *)fileURL + completionHandler:(void (^)(NSError *error))handler +{ + NSParameterAssert(request.HTTPBodyStream); + NSParameterAssert([fileURL isFileURL]); + + NSInputStream *inputStream = request.HTTPBodyStream; + NSOutputStream *outputStream = [[NSOutputStream alloc] initWithURL:fileURL append:NO]; + __block NSError *error = nil; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + + [inputStream open]; + [outputStream open]; + + while ([inputStream hasBytesAvailable] && [outputStream hasSpaceAvailable]) { + uint8_t buffer[1024]; + + NSInteger bytesRead = [inputStream read:buffer maxLength:1024]; + if (inputStream.streamError || bytesRead < 0) { + error = inputStream.streamError; + break; + } + + NSInteger bytesWritten = [outputStream write:buffer maxLength:(NSUInteger)bytesRead]; + if (outputStream.streamError || bytesWritten < 0) { + error = outputStream.streamError; + break; + } + + if (bytesRead == 0 && bytesWritten == 0) { + break; + } + } + + [outputStream close]; + [inputStream close]; + + if (handler) { + dispatch_async(dispatch_get_main_queue(), ^{ + handler(error); + }); + } + }); + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + mutableRequest.HTTPBodyStream = nil; + + return mutableRequest; +} + +#pragma mark - AFURLRequestSerialization + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + NSString *query = nil; + if (parameters) { + if (self.queryStringSerialization) { + NSError *serializationError; + query = self.queryStringSerialization(request, parameters, &serializationError); + + if (serializationError) { + if (error) { + *error = serializationError; + } + + return nil; + } + } else { + switch (self.queryStringSerializationStyle) { + case AFHTTPRequestQueryStringDefaultStyle: + query = AFQueryStringFromParameters(parameters); + break; + } + } + } + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + if (query) { + mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]]; + } + } else { + // #2864: an empty string is a valid x-www-form-urlencoded payload + if (!query) { + query = @""; + } + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + } + [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]]; + } + + return mutableRequest; +} + +#pragma mark - NSKeyValueObserving + ++ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key { + if ([AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) { + return NO; + } + + return [super automaticallyNotifiesObserversForKey:key]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(__unused id)object + change:(NSDictionary *)change + context:(void *)context +{ + if (context == AFHTTPRequestSerializerObserverContext) { + if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { + [self.mutableObservedChangedKeyPaths removeObject:keyPath]; + } else { + [self.mutableObservedChangedKeyPaths addObject:keyPath]; + } + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (!self) { + return nil; + } + + self.mutableHTTPRequestHeaders = [[decoder decodeObjectOfClass:[NSDictionary class] forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))] mutableCopy]; + self.queryStringSerializationStyle = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.mutableHTTPRequestHeaders forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))]; + [coder encodeInteger:self.queryStringSerializationStyle forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone]; + serializer.queryStringSerializationStyle = self.queryStringSerializationStyle; + serializer.queryStringSerialization = self.queryStringSerialization; + + return serializer; +} + +@end + +#pragma mark - + +static NSString * AFCreateMultipartFormBoundary() { + return [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()]; +} + +static NSString * const kAFMultipartFormCRLF = @"\r\n"; + +static inline NSString * AFMultipartFormInitialBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"--%@%@", boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormEncapsulationBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@%@", kAFMultipartFormCRLF, boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormFinalBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@--%@", kAFMultipartFormCRLF, boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFContentTypeForPathExtension(NSString *extension) { +#ifdef __UTTYPE__ + NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL); + NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType); + if (!contentType) { + return @"application/octet-stream"; + } else { + return contentType; + } +#else +#pragma unused (extension) + return @"application/octet-stream"; +#endif +} + +NSUInteger const kAFUploadStream3GSuggestedPacketSize = 1024 * 16; +NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2; + +@interface AFHTTPBodyPart : NSObject +@property (nonatomic, assign) NSStringEncoding stringEncoding; +@property (nonatomic, strong) NSDictionary *headers; +@property (nonatomic, copy) NSString *boundary; +@property (nonatomic, strong) id body; +@property (nonatomic, assign) unsigned long long bodyContentLength; +@property (nonatomic, strong) NSInputStream *inputStream; + +@property (nonatomic, assign) BOOL hasInitialBoundary; +@property (nonatomic, assign) BOOL hasFinalBoundary; + +@property (readonly, nonatomic, assign, getter = hasBytesAvailable) BOOL bytesAvailable; +@property (readonly, nonatomic, assign) unsigned long long contentLength; + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@interface AFMultipartBodyStream : NSInputStream +@property (nonatomic, assign) NSUInteger numberOfBytesInPacket; +@property (nonatomic, assign) NSTimeInterval delay; +@property (nonatomic, strong) NSInputStream *inputStream; +@property (readonly, nonatomic, assign) unsigned long long contentLength; +@property (readonly, nonatomic, assign, getter = isEmpty) BOOL empty; + +- (id)initWithStringEncoding:(NSStringEncoding)encoding; +- (void)setInitialAndFinalBoundaries; +- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart; +@end + +#pragma mark - + +@interface AFStreamingMultipartFormData () +@property (readwrite, nonatomic, copy) NSMutableURLRequest *request; +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@property (readwrite, nonatomic, copy) NSString *boundary; +@property (readwrite, nonatomic, strong) AFMultipartBodyStream *bodyStream; +@end + +@implementation AFStreamingMultipartFormData + +- (id)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding +{ + self = [super init]; + if (!self) { + return nil; + } + + self.request = urlRequest; + self.stringEncoding = encoding; + self.boundary = AFCreateMultipartFormBoundary(); + self.bodyStream = [[AFMultipartBodyStream alloc] initWithStringEncoding:encoding]; + + return self; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + + NSString *fileName = [fileURL lastPathComponent]; + NSString *mimeType = AFContentTypeForPathExtension([fileURL pathExtension]); + + return [self appendPartWithFileURL:fileURL name:name fileName:fileName mimeType:mimeType error:error]; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + if (![fileURL isFileURL]) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"Expected URL to be a file URL", @"AFNetworking", nil)}; + if (error) { + *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } else if ([fileURL checkResourceIsReachableAndReturnError:error] == NO) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"File URL not reachable.", @"AFNetworking", nil)}; + if (error) { + *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } + + NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:error]; + if (!fileAttributes) { + return NO; + } + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = fileURL; + bodyPart.bodyContentLength = [fileAttributes[NSFileSize] unsignedLongLongValue]; + [self.bodyStream appendHTTPBodyPart:bodyPart]; + + return YES; +} + +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(int64_t)length + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = inputStream; + + bodyPart.bodyContentLength = (unsigned long long)length; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name +{ + NSParameterAssert(name); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"", name] forKey:@"Content-Disposition"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body +{ + NSParameterAssert(body); + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = headers; + bodyPart.boundary = self.boundary; + bodyPart.bodyContentLength = [body length]; + bodyPart.body = body; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay +{ + self.bodyStream.numberOfBytesInPacket = numberOfBytes; + self.bodyStream.delay = delay; +} + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData { + if ([self.bodyStream isEmpty]) { + return self.request; + } + + // Reset the initial and final boundaries to ensure correct Content-Length + [self.bodyStream setInitialAndFinalBoundaries]; + [self.request setHTTPBodyStream:self.bodyStream]; + + [self.request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", self.boundary] forHTTPHeaderField:@"Content-Type"]; + [self.request setValue:[NSString stringWithFormat:@"%llu", [self.bodyStream contentLength]] forHTTPHeaderField:@"Content-Length"]; + + return self.request; +} + +@end + +#pragma mark - + +@interface NSStream () +@property (readwrite) NSStreamStatus streamStatus; +@property (readwrite, copy) NSError *streamError; +@end + +@interface AFMultipartBodyStream () +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@property (readwrite, nonatomic, strong) NSMutableArray *HTTPBodyParts; +@property (readwrite, nonatomic, strong) NSEnumerator *HTTPBodyPartEnumerator; +@property (readwrite, nonatomic, strong) AFHTTPBodyPart *currentHTTPBodyPart; +@property (readwrite, nonatomic, strong) NSOutputStream *outputStream; +@property (readwrite, nonatomic, strong) NSMutableData *buffer; +@end + +@implementation AFMultipartBodyStream +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wimplicit-atomic-properties" +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100) +@synthesize delegate; +#endif +@synthesize streamStatus; +@synthesize streamError; +#pragma clang diagnostic pop + +- (id)initWithStringEncoding:(NSStringEncoding)encoding { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = encoding; + self.HTTPBodyParts = [NSMutableArray array]; + self.numberOfBytesInPacket = NSIntegerMax; + + return self; +} + +- (void)setInitialAndFinalBoundaries { + if ([self.HTTPBodyParts count] > 0) { + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + bodyPart.hasInitialBoundary = NO; + bodyPart.hasFinalBoundary = NO; + } + + [[self.HTTPBodyParts firstObject] setHasInitialBoundary:YES]; + [[self.HTTPBodyParts lastObject] setHasFinalBoundary:YES]; + } +} + +- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart { + [self.HTTPBodyParts addObject:bodyPart]; +} + +- (BOOL)isEmpty { + return [self.HTTPBodyParts count] == 0; +} + +#pragma mark - NSInputStream + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + if ([self streamStatus] == NSStreamStatusClosed) { + return 0; + } + + NSInteger totalNumberOfBytesRead = 0; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + while ((NSUInteger)totalNumberOfBytesRead < MIN(length, self.numberOfBytesInPacket)) { + if (!self.currentHTTPBodyPart || ![self.currentHTTPBodyPart hasBytesAvailable]) { + if (!(self.currentHTTPBodyPart = [self.HTTPBodyPartEnumerator nextObject])) { + break; + } + } else { + NSUInteger maxLength = length - (NSUInteger)totalNumberOfBytesRead; + NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:&buffer[totalNumberOfBytesRead] maxLength:maxLength]; + if (numberOfBytesRead == -1) { + self.streamError = self.currentHTTPBodyPart.inputStream.streamError; + break; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if (self.delay > 0.0f) { + [NSThread sleepForTimeInterval:self.delay]; + } + } + } + } +#pragma clang diagnostic pop + + return totalNumberOfBytesRead; +} + +- (BOOL)getBuffer:(__unused uint8_t **)buffer + length:(__unused NSUInteger *)len +{ + return NO; +} + +- (BOOL)hasBytesAvailable { + return [self streamStatus] == NSStreamStatusOpen; +} + +#pragma mark - NSStream + +- (void)open { + if (self.streamStatus == NSStreamStatusOpen) { + return; + } + + self.streamStatus = NSStreamStatusOpen; + + [self setInitialAndFinalBoundaries]; + self.HTTPBodyPartEnumerator = [self.HTTPBodyParts objectEnumerator]; +} + +- (void)close { + self.streamStatus = NSStreamStatusClosed; +} + +- (id)propertyForKey:(__unused NSString *)key { + return nil; +} + +- (BOOL)setProperty:(__unused id)property + forKey:(__unused NSString *)key +{ + return NO; +} + +- (void)scheduleInRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (void)removeFromRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + length += [bodyPart contentLength]; + } + + return length; +} + +#pragma mark - Undocumented CFReadStream Bridged Methods + +- (void)_scheduleInCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (void)_unscheduleFromCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (BOOL)_setCFClientFlags:(__unused CFOptionFlags)inFlags + callback:(__unused CFReadStreamClientCallBack)inCallback + context:(__unused CFStreamClientContext *)inContext { + return NO; +} + +#pragma mark - NSCopying + +-(id)copyWithZone:(NSZone *)zone { + AFMultipartBodyStream *bodyStreamCopy = [[[self class] allocWithZone:zone] initWithStringEncoding:self.stringEncoding]; + + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + [bodyStreamCopy appendHTTPBodyPart:[bodyPart copy]]; + } + + [bodyStreamCopy setInitialAndFinalBoundaries]; + + return bodyStreamCopy; +} + +@end + +#pragma mark - + +typedef enum { + AFEncapsulationBoundaryPhase = 1, + AFHeaderPhase = 2, + AFBodyPhase = 3, + AFFinalBoundaryPhase = 4, +} AFHTTPBodyPartReadPhase; + +@interface AFHTTPBodyPart () { + AFHTTPBodyPartReadPhase _phase; + NSInputStream *_inputStream; + unsigned long long _phaseReadOffset; +} + +- (BOOL)transitionToNextPhase; +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@implementation AFHTTPBodyPart + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [self transitionToNextPhase]; + + return self; +} + +- (void)dealloc { + if (_inputStream) { + [_inputStream close]; + _inputStream = nil; + } +} + +- (NSInputStream *)inputStream { + if (!_inputStream) { + if ([self.body isKindOfClass:[NSData class]]) { + _inputStream = [NSInputStream inputStreamWithData:self.body]; + } else if ([self.body isKindOfClass:[NSURL class]]) { + _inputStream = [NSInputStream inputStreamWithURL:self.body]; + } else if ([self.body isKindOfClass:[NSInputStream class]]) { + _inputStream = self.body; + } else { + _inputStream = [NSInputStream inputStreamWithData:[NSData data]]; + } + } + + return _inputStream; +} + +- (NSString *)stringForHeaders { + NSMutableString *headerString = [NSMutableString string]; + for (NSString *field in [self.headers allKeys]) { + [headerString appendString:[NSString stringWithFormat:@"%@: %@%@", field, [self.headers valueForKey:field], kAFMultipartFormCRLF]]; + } + [headerString appendString:kAFMultipartFormCRLF]; + + return [NSString stringWithString:headerString]; +} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + length += [encapsulationBoundaryData length]; + + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + length += [headersData length]; + + length += _bodyContentLength; + + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + length += [closingBoundaryData length]; + + return length; +} + +- (BOOL)hasBytesAvailable { + // Allows `read:maxLength:` to be called again if `AFMultipartFormFinalBoundary` doesn't fit into the available buffer + if (_phase == AFFinalBoundaryPhase) { + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (self.inputStream.streamStatus) { + case NSStreamStatusNotOpen: + case NSStreamStatusOpening: + case NSStreamStatusOpen: + case NSStreamStatusReading: + case NSStreamStatusWriting: + return YES; + case NSStreamStatusAtEnd: + case NSStreamStatusClosed: + case NSStreamStatusError: + default: + return NO; + } +#pragma clang diagnostic pop +} + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + NSInteger totalNumberOfBytesRead = 0; + + if (_phase == AFEncapsulationBoundaryPhase) { + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:encapsulationBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFHeaderPhase) { + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:headersData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFBodyPhase) { + NSInteger numberOfBytesRead = 0; + + numberOfBytesRead = [self.inputStream read:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + if (numberOfBytesRead == -1) { + return -1; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if ([self.inputStream streamStatus] >= NSStreamStatusAtEnd) { + [self transitionToNextPhase]; + } + } + } + + if (_phase == AFFinalBoundaryPhase) { + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + totalNumberOfBytesRead += [self readData:closingBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + return totalNumberOfBytesRead; +} + +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + NSRange range = NSMakeRange((NSUInteger)_phaseReadOffset, MIN([data length] - ((NSUInteger)_phaseReadOffset), length)); + [data getBytes:buffer range:range]; +#pragma clang diagnostic pop + + _phaseReadOffset += range.length; + + if (((NSUInteger)_phaseReadOffset) >= [data length]) { + [self transitionToNextPhase]; + } + + return (NSInteger)range.length; +} + +- (BOOL)transitionToNextPhase { + if (![[NSThread currentThread] isMainThread]) { + dispatch_sync(dispatch_get_main_queue(), ^{ + [self transitionToNextPhase]; + }); + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (_phase) { + case AFEncapsulationBoundaryPhase: + _phase = AFHeaderPhase; + break; + case AFHeaderPhase: + [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; + [self.inputStream open]; + _phase = AFBodyPhase; + break; + case AFBodyPhase: + [self.inputStream close]; + _phase = AFFinalBoundaryPhase; + break; + case AFFinalBoundaryPhase: + default: + _phase = AFEncapsulationBoundaryPhase; + break; + } + _phaseReadOffset = 0; +#pragma clang diagnostic pop + + return YES; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init]; + + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = self.headers; + bodyPart.bodyContentLength = self.bodyContentLength; + bodyPart.body = self.body; + bodyPart.boundary = self.boundary; + + return bodyPart; +} + +@end + +#pragma mark - + +@implementation AFJSONRequestSerializer + ++ (instancetype)serializer { + return [self serializerWithWritingOptions:(NSJSONWritingOptions)0]; +} + ++ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions +{ + AFJSONRequestSerializer *serializer = [[self alloc] init]; + serializer.writingOptions = writingOptions; + + return serializer; +} + +#pragma mark - AFURLRequestSerialization + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + return [super requestBySerializingRequest:request withParameters:parameters error:error]; + } + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + } + + [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]]; + } + + return mutableRequest; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.writingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(writingOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeInteger:self.writingOptions forKey:NSStringFromSelector(@selector(writingOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFJSONRequestSerializer *serializer = [super copyWithZone:zone]; + serializer.writingOptions = self.writingOptions; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFPropertyListRequestSerializer + ++ (instancetype)serializer { + return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 writeOptions:0]; +} + ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + writeOptions:(NSPropertyListWriteOptions)writeOptions +{ + AFPropertyListRequestSerializer *serializer = [[self alloc] init]; + serializer.format = format; + serializer.writeOptions = writeOptions; + + return serializer; +} + +#pragma mark - AFURLRequestSerializer + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + return [super requestBySerializingRequest:request withParameters:parameters error:error]; + } + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/x-plist" forHTTPHeaderField:@"Content-Type"]; + } + + [mutableRequest setHTTPBody:[NSPropertyListSerialization dataWithPropertyList:parameters format:self.format options:self.writeOptions error:error]]; + } + + return mutableRequest; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.format = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(format))] unsignedIntegerValue]; + self.writeOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(writeOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeInteger:self.format forKey:NSStringFromSelector(@selector(format))]; + [coder encodeObject:@(self.writeOptions) forKey:NSStringFromSelector(@selector(writeOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFPropertyListRequestSerializer *serializer = [super copyWithZone:zone]; + serializer.format = self.format; + serializer.writeOptions = self.writeOptions; + + return serializer; +} + +@end diff --git a/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h new file mode 100644 index 0000000..1396cfb --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1,311 @@ +// AFURLResponseSerialization.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + The `AFURLResponseSerialization` protocol is adopted by an object that decodes data into a more useful object representation, according to details in the server response. Response serializers may additionally perform validation on the incoming response and data. + + For example, a JSON response serializer may check for an acceptable status code (`2XX` range) and content type (`application/json`), decoding a valid JSON response into an object. + */ +@protocol AFURLResponseSerialization + +/** + The response object decoded from the data associated with a specified response. + + @param response The response to be processed. + @param data The response data to be decoded. + @param error The error that occurred while attempting to decode the response data. + + @return The object decoded from the specified response data. + */ +- (nullable id)responseObjectForResponse:(nullable NSURLResponse *)response + data:(nullable NSData *)data + error:(NSError * __nullable __autoreleasing *)error; + +@end + +#pragma mark - + +/** + `AFHTTPResponseSerializer` conforms to the `AFURLRequestSerialization` & `AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation. + + Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPResponseSerializer` in order to ensure consistent default behavior. + */ +@interface AFHTTPResponseSerializer : NSObject + +- (instancetype)init; + +/** + The string encoding used to serialize data received from the server, when no string encoding is specified by the response. `NSUTF8StringEncoding` by default. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + Creates and returns a serializer with default configuration. + */ ++ (instancetype)serializer; + +///----------------------------------------- +/// @name Configuring Response Serialization +///----------------------------------------- + +/** + The acceptable HTTP status codes for responses. When non-`nil`, responses with status codes not contained by the set will result in an error during validation. + + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + */ +@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes; + +/** + The acceptable MIME types for responses. When non-`nil`, responses with a `Content-Type` with MIME types that do not intersect with the set will result in an error during validation. + */ +@property (nonatomic, copy, nullable) NSSet *acceptableContentTypes; + +/** + Validates the specified response and data. + + In its base implementation, this method checks for an acceptable status code and content type. Subclasses may wish to add other domain-specific checks. + + @param response The response to be validated. + @param data The data associated with the response. + @param error The error that occurred while attempting to validate the response. + + @return `YES` if the response is valid, otherwise `NO`. + */ +- (BOOL)validateResponse:(nullable NSHTTPURLResponse *)response + data:(nullable NSData *)data + error:(NSError * __nullable __autoreleasing *)error; + +@end + +#pragma mark - + + +/** + `AFJSONResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes JSON responses. + + By default, `AFJSONResponseSerializer` accepts the following MIME types, which includes the official standard, `application/json`, as well as other commonly-used types: + + - `application/json` + - `text/json` + - `text/javascript` + */ +@interface AFJSONResponseSerializer : AFHTTPResponseSerializer + +- (instancetype)init; + +/** + Options for reading the response JSON data and creating the Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + */ +@property (nonatomic, assign) NSJSONReadingOptions readingOptions; + +/** + Whether to remove keys with `NSNull` values from response JSON. Defaults to `NO`. + */ +@property (nonatomic, assign) BOOL removesKeysWithNullValues; + +/** + Creates and returns a JSON serializer with specified reading and writing options. + + @param readingOptions The specified JSON reading options. + */ ++ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions; + +@end + +#pragma mark - + +/** + `AFXMLParserResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects. + + By default, `AFXMLParserResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + */ +@interface AFXMLParserResponseSerializer : AFHTTPResponseSerializer + +@end + +#pragma mark - + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + +/** + `AFXMLDocumentResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + + By default, `AFXMLDocumentResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + */ +@interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer + +- (instancetype)init; + +/** + Input and output options specifically intended for `NSXMLDocument` objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + */ +@property (nonatomic, assign) NSUInteger options; + +/** + Creates and returns an XML document serializer with the specified options. + + @param mask The XML document options. + */ ++ (instancetype)serializerWithXMLDocumentOptions:(NSUInteger)mask; + +@end + +#endif + +#pragma mark - + +/** + `AFPropertyListResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + + By default, `AFPropertyListResponseSerializer` accepts the following MIME types: + + - `application/x-plist` + */ +@interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer + +- (instancetype)init; + +/** + The property list format. Possible values are described in "NSPropertyListFormat". + */ +@property (nonatomic, assign) NSPropertyListFormat format; + +/** + The property list reading options. Possible values are described in "NSPropertyListMutabilityOptions." + */ +@property (nonatomic, assign) NSPropertyListReadOptions readOptions; + +/** + Creates and returns a property list serializer with a specified format, read options, and write options. + + @param format The property list format. + @param readOptions The property list reading options. + */ ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + readOptions:(NSPropertyListReadOptions)readOptions; + +@end + +#pragma mark - + +/** + `AFImageResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes image responses. + + By default, `AFImageResponseSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage: + + - `image/tiff` + - `image/jpeg` + - `image/gif` + - `image/png` + - `image/ico` + - `image/x-icon` + - `image/bmp` + - `image/x-bmp` + - `image/x-xbitmap` + - `image/x-win-bitmap` + */ +@interface AFImageResponseSerializer : AFHTTPResponseSerializer + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +/** + The scale factor used when interpreting the image data to construct `responseImage`. Specifying a scale factor of 1.0 results in an image whose size matches the pixel-based dimensions of the image. Applying a different scale factor changes the size of the image as reported by the size property. This is set to the value of scale of the main screen by default, which automatically scales images for retina displays, for instance. + */ +@property (nonatomic, assign) CGFloat imageScale; + +/** + Whether to automatically inflate response image data for compressed formats (such as PNG or JPEG). Enabling this can significantly improve drawing performance on iOS when used with `setCompletionBlockWithSuccess:failure:`, as it allows a bitmap representation to be constructed in the background rather than on the main thread. `YES` by default. + */ +@property (nonatomic, assign) BOOL automaticallyInflatesResponseImage; +#endif + +@end + +#pragma mark - + +/** + `AFCompoundSerializer` is a subclass of `AFHTTPResponseSerializer` that delegates the response serialization to the first `AFHTTPResponseSerializer` object that returns an object for `responseObjectForResponse:data:error:`, falling back on the default behavior of `AFHTTPResponseSerializer`. This is useful for supporting multiple potential types and structures of server responses with a single serializer. + */ +@interface AFCompoundResponseSerializer : AFHTTPResponseSerializer + +/** + The component response serializers. + */ +@property (readonly, nonatomic, copy) NSArray *responseSerializers; + +/** + Creates and returns a compound serializer comprised of the specified response serializers. + + @warning Each response serializer specified must be a subclass of `AFHTTPResponseSerializer`, and response to `-validateResponse:data:error:`. + */ ++ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFURLResponseSerializationErrorDomain` + + ### Constants + + `AFURLResponseSerializationErrorDomain` + AFURLResponseSerializer errors. Error codes for `AFURLResponseSerializationErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +FOUNDATION_EXPORT NSString * const AFURLResponseSerializationErrorDomain; + +/** + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLResponseErrorKey` + - `NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLResponseErrorKey` + The corresponding value is an `NSURLResponse` containing the response of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + + `AFNetworkingOperationFailingURLResponseDataErrorKey` + The corresponding value is an `NSData` containing the original data of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingOperationFailingURLResponseErrorKey; + +FOUNDATION_EXPORT NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey; + +NS_ASSUME_NONNULL_END diff --git a/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m new file mode 100644 index 0000000..f95834f --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m @@ -0,0 +1,825 @@ +// AFURLResponseSerialization.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFURLResponseSerialization.h" + +#if TARGET_OS_IOS +#import +#elif TARGET_OS_WATCH +#import +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +#import +#endif + +NSString * const AFURLResponseSerializationErrorDomain = @"com.alamofire.error.serialization.response"; +NSString * const AFNetworkingOperationFailingURLResponseErrorKey = @"com.alamofire.serialization.response.error.response"; +NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey = @"com.alamofire.serialization.response.error.data"; + +static NSError * AFErrorWithUnderlyingError(NSError *error, NSError *underlyingError) { + if (!error) { + return underlyingError; + } + + if (!underlyingError || error.userInfo[NSUnderlyingErrorKey]) { + return error; + } + + NSMutableDictionary *mutableUserInfo = [error.userInfo mutableCopy]; + mutableUserInfo[NSUnderlyingErrorKey] = underlyingError; + + return [[NSError alloc] initWithDomain:error.domain code:error.code userInfo:mutableUserInfo]; +} + +static BOOL AFErrorOrUnderlyingErrorHasCodeInDomain(NSError *error, NSInteger code, NSString *domain) { + if ([error.domain isEqualToString:domain] && error.code == code) { + return YES; + } else if (error.userInfo[NSUnderlyingErrorKey]) { + return AFErrorOrUnderlyingErrorHasCodeInDomain(error.userInfo[NSUnderlyingErrorKey], code, domain); + } + + return NO; +} + +static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) { + if ([JSONObject isKindOfClass:[NSArray class]]) { + NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]]; + for (id value in (NSArray *)JSONObject) { + [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)]; + } + + return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray]; + } else if ([JSONObject isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject]; + for (id key in [(NSDictionary *)JSONObject allKeys]) { + id value = (NSDictionary *)JSONObject[key]; + if (!value || [value isEqual:[NSNull null]]) { + [mutableDictionary removeObjectForKey:key]; + } else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) { + mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions); + } + } + + return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary]; + } + + return JSONObject; +} + +@implementation AFHTTPResponseSerializer + ++ (instancetype)serializer { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = NSUTF8StringEncoding; + + self.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)]; + self.acceptableContentTypes = nil; + + return self; +} + +#pragma mark - + +- (BOOL)validateResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError * __autoreleasing *)error +{ + BOOL responseIsValid = YES; + NSError *validationError = nil; + + if (response && [response isKindOfClass:[NSHTTPURLResponse class]]) { + if (self.acceptableContentTypes && ![self.acceptableContentTypes containsObject:[response MIMEType]]) { + if ([data length] > 0 && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: unacceptable content-type: %@", @"AFNetworking", nil), [response MIMEType]], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } + + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:mutableUserInfo], validationError); + } + + responseIsValid = NO; + } + + if (self.acceptableStatusCodes && ![self.acceptableStatusCodes containsIndex:(NSUInteger)response.statusCode] && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } + + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorBadServerResponse userInfo:mutableUserInfo], validationError); + + responseIsValid = NO; + } + } + + if (error && !responseIsValid) { + *error = validationError; + } + + return responseIsValid; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + [self validateResponse:(NSHTTPURLResponse *)response data:data error:error]; + + return data; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (!self) { + return nil; + } + + self.acceptableStatusCodes = [decoder decodeObjectOfClass:[NSIndexSet class] forKey:NSStringFromSelector(@selector(acceptableStatusCodes))]; + self.acceptableContentTypes = [decoder decodeObjectOfClass:[NSIndexSet class] forKey:NSStringFromSelector(@selector(acceptableContentTypes))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.acceptableStatusCodes forKey:NSStringFromSelector(@selector(acceptableStatusCodes))]; + [coder encodeObject:self.acceptableContentTypes forKey:NSStringFromSelector(@selector(acceptableContentTypes))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.acceptableStatusCodes = [self.acceptableStatusCodes copyWithZone:zone]; + serializer.acceptableContentTypes = [self.acceptableContentTypes copyWithZone:zone]; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFJSONResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithReadingOptions:(NSJSONReadingOptions)0]; +} + ++ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions { + AFJSONResponseSerializer *serializer = [[self alloc] init]; + serializer.readingOptions = readingOptions; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + // Workaround for behavior of Rails to return a single space for `head :ok` (a workaround for a bug in Safari), which is not interpreted as valid input by NSJSONSerialization. + // See https://github.com/rails/rails/issues/1742 + NSStringEncoding stringEncoding = self.stringEncoding; + if (response.textEncodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName); + if (encoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding); + } + } + + id responseObject = nil; + NSError *serializationError = nil; + @autoreleasepool { + NSString *responseString = [[NSString alloc] initWithData:data encoding:stringEncoding]; + if (responseString && ![responseString isEqualToString:@" "]) { + // Workaround for a bug in NSJSONSerialization when Unicode character escape codes are used instead of the actual character + // See http://stackoverflow.com/a/12843465/157142 + data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; + + if (data) { + if ([data length] > 0) { + responseObject = [NSJSONSerialization JSONObjectWithData:data options:self.readingOptions error:&serializationError]; + } else { + return nil; + } + } else { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"Data failed decoding as a UTF-8 string", @"AFNetworking", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Could not decode string: %@", @"AFNetworking", nil), responseString] + }; + + serializationError = [NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; + } + } + } + + if (self.removesKeysWithNullValues && responseObject) { + responseObject = AFJSONObjectByRemovingKeysWithNullValues(responseObject, self.readingOptions); + } + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return responseObject; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.readingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readingOptions))] unsignedIntegerValue]; + self.removesKeysWithNullValues = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))] boolValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.readingOptions) forKey:NSStringFromSelector(@selector(readingOptions))]; + [coder encodeObject:@(self.removesKeysWithNullValues) forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFJSONResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.readingOptions = self.readingOptions; + serializer.removesKeysWithNullValues = self.removesKeysWithNullValues; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFXMLParserResponseSerializer + ++ (instancetype)serializer { + AFXMLParserResponseSerializer *serializer = [[self alloc] init]; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + return [[NSXMLParser alloc] initWithData:data]; +} + +@end + +#pragma mark - + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + +@implementation AFXMLDocumentResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithXMLDocumentOptions:0]; +} + ++ (instancetype)serializerWithXMLDocumentOptions:(NSUInteger)mask { + AFXMLDocumentResponseSerializer *serializer = [[self alloc] init]; + serializer.options = mask; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + NSError *serializationError = nil; + NSXMLDocument *document = [[NSXMLDocument alloc] initWithData:data options:self.options error:&serializationError]; + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return document; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.options = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(options))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.options) forKey:NSStringFromSelector(@selector(options))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFXMLDocumentResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.options = self.options; + + return serializer; +} + +@end + +#endif + +#pragma mark - + +@implementation AFPropertyListResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 readOptions:0]; +} + ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + readOptions:(NSPropertyListReadOptions)readOptions +{ + AFPropertyListResponseSerializer *serializer = [[self alloc] init]; + serializer.format = format; + serializer.readOptions = readOptions; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/x-plist", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + id responseObject; + NSError *serializationError = nil; + + if (data) { + responseObject = [NSPropertyListSerialization propertyListWithData:data options:self.readOptions format:NULL error:&serializationError]; + } + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return responseObject; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.format = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(format))] unsignedIntegerValue]; + self.readOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.format) forKey:NSStringFromSelector(@selector(format))]; + [coder encodeObject:@(self.readOptions) forKey:NSStringFromSelector(@selector(readOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFPropertyListResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.format = self.format; + serializer.readOptions = self.readOptions; + + return serializer; +} + +@end + +#pragma mark - + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import + +@interface UIImage (AFNetworkingSafeImageLoading) ++ (UIImage *)af_safeImageWithData:(NSData *)data; +@end + +static NSLock* imageLock = nil; + +@implementation UIImage (AFNetworkingSafeImageLoading) + ++ (UIImage *)af_safeImageWithData:(NSData *)data { + UIImage* image = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + imageLock = [[NSLock alloc] init]; + }); + + [imageLock lock]; + image = [UIImage imageWithData:data]; + [imageLock unlock]; + return image; +} + +@end + +static UIImage * AFImageWithDataAtScale(NSData *data, CGFloat scale) { + UIImage *image = [UIImage af_safeImageWithData:data]; + if (image.images) { + return image; + } + + return [[UIImage alloc] initWithCGImage:[image CGImage] scale:scale orientation:image.imageOrientation]; +} + +static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *response, NSData *data, CGFloat scale) { + if (!data || [data length] == 0) { + return nil; + } + + CGImageRef imageRef = NULL; + CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); + + if ([response.MIMEType isEqualToString:@"image/png"]) { + imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + } else if ([response.MIMEType isEqualToString:@"image/jpeg"]) { + imageRef = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + + if (imageRef) { + CGColorSpaceRef imageColorSpace = CGImageGetColorSpace(imageRef); + CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(imageColorSpace); + + // CGImageCreateWithJPEGDataProvider does not properly handle CMKY, so fall back to AFImageWithDataAtScale + if (imageColorSpaceModel == kCGColorSpaceModelCMYK) { + CGImageRelease(imageRef); + imageRef = NULL; + } + } + } + + CGDataProviderRelease(dataProvider); + + UIImage *image = AFImageWithDataAtScale(data, scale); + if (!imageRef) { + if (image.images || !image) { + return image; + } + + imageRef = CGImageCreateCopy([image CGImage]); + if (!imageRef) { + return nil; + } + } + + size_t width = CGImageGetWidth(imageRef); + size_t height = CGImageGetHeight(imageRef); + size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef); + + if (width * height > 1024 * 1024 || bitsPerComponent > 8) { + CGImageRelease(imageRef); + + return image; + } + + // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate + size_t bytesPerRow = 0; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); + + if (colorSpaceModel == kCGColorSpaceModelRGB) { + uint32_t alpha = (bitmapInfo & kCGBitmapAlphaInfoMask); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wassign-enum" + if (alpha == kCGImageAlphaNone) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaNoneSkipFirst; + } else if (!(alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast)) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaPremultipliedFirst; + } +#pragma clang diagnostic pop + } + + CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); + + CGColorSpaceRelease(colorSpace); + + if (!context) { + CGImageRelease(imageRef); + + return image; + } + + CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), imageRef); + CGImageRef inflatedImageRef = CGBitmapContextCreateImage(context); + + CGContextRelease(context); + + UIImage *inflatedImage = [[UIImage alloc] initWithCGImage:inflatedImageRef scale:scale orientation:image.imageOrientation]; + + CGImageRelease(inflatedImageRef); + CGImageRelease(imageRef); + + return inflatedImage; +} +#endif + + +@implementation AFImageResponseSerializer + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil]; + +#if TARGET_OS_IOS + self.imageScale = [[UIScreen mainScreen] scale]; + self.automaticallyInflatesResponseImage = YES; +#elif TARGET_OS_WATCH + self.imageScale = [[WKInterfaceDevice currentDevice] screenScale]; + self.automaticallyInflatesResponseImage = YES; +#endif + + return self; +} + +#pragma mark - AFURLResponseSerializer + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + if (self.automaticallyInflatesResponseImage) { + return AFInflatedImageFromResponseWithDataAtScale((NSHTTPURLResponse *)response, data, self.imageScale); + } else { + return AFImageWithDataAtScale(data, self.imageScale); + } +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + // Ensure that the image is set to it's correct pixel width and height + NSBitmapImageRep *bitimage = [[NSBitmapImageRep alloc] initWithData:data]; + NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize([bitimage pixelsWide], [bitimage pixelsHigh])]; + [image addRepresentation:bitimage]; + + return image; +#endif + + return nil; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + NSNumber *imageScale = [decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(imageScale))]; +#if CGFLOAT_IS_DOUBLE + self.imageScale = [imageScale doubleValue]; +#else + self.imageScale = [imageScale floatValue]; +#endif + + self.automaticallyInflatesResponseImage = [decoder decodeBoolForKey:NSStringFromSelector(@selector(automaticallyInflatesResponseImage))]; +#endif + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + [coder encodeObject:@(self.imageScale) forKey:NSStringFromSelector(@selector(imageScale))]; + [coder encodeBool:self.automaticallyInflatesResponseImage forKey:NSStringFromSelector(@selector(automaticallyInflatesResponseImage))]; +#endif +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFImageResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + serializer.imageScale = self.imageScale; + serializer.automaticallyInflatesResponseImage = self.automaticallyInflatesResponseImage; +#endif + + return serializer; +} + +@end + +#pragma mark - + +@interface AFCompoundResponseSerializer () +@property (readwrite, nonatomic, copy) NSArray *responseSerializers; +@end + +@implementation AFCompoundResponseSerializer + ++ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers { + AFCompoundResponseSerializer *serializer = [[self alloc] init]; + serializer.responseSerializers = responseSerializers; + + return serializer; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + for (id serializer in self.responseSerializers) { + if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) { + continue; + } + + NSError *serializerError = nil; + id responseObject = [serializer responseObjectForResponse:response data:data error:&serializerError]; + if (responseObject) { + if (error) { + *error = AFErrorWithUnderlyingError(serializerError, *error); + } + + return responseObject; + } + } + + return [super responseObjectForResponse:response data:data error:error]; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.responseSerializers = [decoder decodeObjectOfClass:[NSArray class] forKey:NSStringFromSelector(@selector(responseSerializers))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.responseSerializers forKey:NSStringFromSelector(@selector(responseSerializers))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFCompoundResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.responseSerializers = self.responseSerializers; + + return serializer; +} + +@end diff --git a/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h new file mode 100644 index 0000000..70e4ec9 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h @@ -0,0 +1,554 @@ +// AFURLSessionManager.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" +#import "AFSecurityPolicy.h" +#if !TARGET_OS_WATCH +#import "AFNetworkReachabilityManager.h" +#endif + +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + +/** + `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + + ## Subclassing Notes + + This is the base class for `AFHTTPSessionManager`, which adds functionality specific to making HTTP requests. If you are looking to extend `AFURLSessionManager` specifically for HTTP, consider subclassing `AFHTTPSessionManager` instead. + + ## NSURLSession & NSURLSessionTask Delegate Methods + + `AFURLSessionManager` implements the following delegate methods: + + ### `NSURLSessionDelegate` + + - `URLSession:didBecomeInvalidWithError:` + - `URLSession:didReceiveChallenge:completionHandler:` + - `URLSessionDidFinishEventsForBackgroundURLSession:` + + ### `NSURLSessionTaskDelegate` + + - `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:` + - `URLSession:task:didReceiveChallenge:completionHandler:` + - `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:` + - `URLSession:task:didCompleteWithError:` + + ### `NSURLSessionDataDelegate` + + - `URLSession:dataTask:didReceiveResponse:completionHandler:` + - `URLSession:dataTask:didBecomeDownloadTask:` + - `URLSession:dataTask:didReceiveData:` + - `URLSession:dataTask:willCacheResponse:completionHandler:` + + ### `NSURLSessionDownloadDelegate` + + - `URLSession:downloadTask:didFinishDownloadingToURL:` + - `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:` + - `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Network Reachability Monitoring + + Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. + + ## NSCoding Caveats + + - Encoded managers do not include any block properties. Be sure to set delegate callback blocks when using `-initWithCoder:` or `NSKeyedUnarchiver`. + + ## NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new manager with a new `NSURLSession` created from the configuration of the original. + - Operation copies do not include any delegate callback blocks, as they often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ session manager when copied. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. + */ + +NS_ASSUME_NONNULL_BEGIN + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_OS_WATCH + +@interface AFURLSessionManager : NSObject + +/** + The managed session. + */ +@property (readonly, nonatomic, strong) NSURLSession *session; + +/** + The operation queue on which delegate callbacks are run. + */ +@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) id responseSerializer; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used by created request operations to evaluate server trust for secure connections. `AFURLSessionManager` uses the `defaultPolicy` unless otherwise specified. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +#if !TARGET_OS_WATCH +///-------------------------------------- +/// @name Monitoring Network Reachability +///-------------------------------------- + +/** + The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default. + */ +@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; +#endif + +///---------------------------- +/// @name Getting Session Tasks +///---------------------------- + +/** + The data, upload, and download tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *tasks; + +/** + The data tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *dataTasks; + +/** + The upload tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *uploadTasks; + +/** + The download tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *downloadTasks; + +///------------------------------- +/// @name Managing Callback Queues +///------------------------------- + +/** + The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. + */ +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; +#else +@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; +#endif + +/** + The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. + */ +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_group_t completionGroup; +#else +@property (nonatomic, assign, nullable) dispatch_group_t completionGroup; +#endif + +///--------------------------------- +/// @name Working Around System Bugs +///--------------------------------- + +/** + Whether to attempt to retry creation of upload tasks for background sessions when initial call returns `nil`. `NO` by default. + + @bug As of iOS 7.0, there is a bug where upload tasks created for background tasks are sometimes `nil`. As a workaround, if this property is `YES`, AFNetworking will follow Apple's recommendation to try creating the task again. + + @see https://github.com/AFNetworking/AFNetworking/issues/1675 + */ +@property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns a manager for a session created with the specified configuration. This is the designated initializer. + + @param configuration The configuration used to create the managed session. + + @return A manager for a newly-created session. + */ +- (instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER; + +/** + Invalidates the managed session, optionally canceling pending tasks. + + @param cancelPendingTasks Whether or not to cancel pending tasks. + */ +- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks; + +///------------------------- +/// @name Running Data Tasks +///------------------------- + +/** + Creates an `NSURLSessionDataTask` with the specified request. + + @param request The HTTP request for the request. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request + completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError * __nullable error))completionHandler; + +///--------------------------- +/// @name Running Upload Tasks +///--------------------------- + +/** + Creates an `NSURLSessionUploadTask` with the specified request for a local file. + + @param request The HTTP request for the request. + @param fileURL A URL to the local file to be uploaded. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + + @see `attemptsToRecreateUploadTasksForBackgroundSessions` + */ +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromFile:(NSURL *)fileURL + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError * __nullable error))completionHandler; + +/** + Creates an `NSURLSessionUploadTask` with the specified request for an HTTP body. + + @param request The HTTP request for the request. + @param bodyData A data object containing the HTTP body to be uploaded. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromData:(nullable NSData *)bodyData + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError * __nullable error))completionHandler; + +/** + Creates an `NSURLSessionUploadTask` with the specified streaming request. + + @param request The HTTP request for the request. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + completionHandler:(nullable void (^)(NSURLResponse *response, id __nullable responseObject, NSError * __nullable error))completionHandler; + +///----------------------------- +/// @name Running Download Tasks +///----------------------------- + +/** + Creates an `NSURLSessionDownloadTask` with the specified request. + + @param request The HTTP request for the request. + @param progress A progress object monitoring the current download progress. + @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. + @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. + + @warning If using a background `NSURLSessionConfiguration` on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to use `-setDownloadTaskDidFinishDownloadingBlock:` to specify the URL for saving the downloaded file, rather than the destination block of this method. + */ +- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * __nullable filePath, NSError * __nullable error))completionHandler; + +/** + Creates an `NSURLSessionDownloadTask` with the specified resume data. + + @param resumeData The data used to resume downloading. + @param progress A progress object monitoring the current download progress. + @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. + @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. + */ +- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * __nullable filePath, NSError * __nullable error))completionHandler; + +///--------------------------------- +/// @name Getting Progress for Tasks +///--------------------------------- + +/** + Returns the upload progress of the specified task. + + @param uploadTask The session upload task. Must not be `nil`. + + @return An `NSProgress` object reporting the upload progress of a task, or `nil` if the progress is unavailable. + */ +- (nullable NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask; + +/** + Returns the download progress of the specified task. + + @param downloadTask The session download task. Must not be `nil`. + + @return An `NSProgress` object reporting the download progress of a task, or `nil` if the progress is unavailable. + */ +- (nullable NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask; + +///----------------------------------------- +/// @name Setting Session Delegate Callbacks +///----------------------------------------- + +/** + Sets a block to be executed when the managed session becomes invalid, as handled by the `NSURLSessionDelegate` method `URLSession:didBecomeInvalidWithError:`. + + @param block A block object to be executed when the managed session becomes invalid. The block has no return value, and takes two arguments: the session, and the error related to the cause of invalidation. + */ +- (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block; + +/** + Sets a block to be executed when a connection level authentication challenge has occurred, as handled by the `NSURLSessionDelegate` method `URLSession:didReceiveChallenge:completionHandler:`. + + @param block A block object to be executed when a connection level authentication challenge has occurred. The block returns the disposition of the authentication challenge, and takes three arguments: the session, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. + */ +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __nullable __autoreleasing * __nullable credential))block; + +///-------------------------------------- +/// @name Setting Task Delegate Callbacks +///-------------------------------------- + +/** + Sets a block to be executed when a task requires a new request body stream to send to the remote server, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:needNewBodyStream:`. + + @param block A block object to be executed when a task requires a new request body stream. + */ +- (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block; + +/** + Sets a block to be executed when an HTTP request is attempting to perform a redirection to a different URL, as handled by the `NSURLSessionTaskDelegate` method `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`. + + @param block A block object to be executed when an HTTP request is attempting to perform a redirection to a different URL. The block returns the request to be made for the redirection, and takes four arguments: the session, the task, the redirection response, and the request corresponding to the redirection response. + */ +- (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; + +/** + Sets a block to be executed when a session task has received a request specific authentication challenge, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didReceiveChallenge:completionHandler:`. + + @param block A block object to be executed when a session task has received a request specific authentication challenge. The block returns the disposition of the authentication challenge, and takes four arguments: the session, the task, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. + */ +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __nullable __autoreleasing * __nullable credential))block; + +/** + Sets a block to be executed periodically to track upload progress, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes five arguments: the session, the task, the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block; + +/** + Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`. + + @param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any error that occurred in the process of executing the task. + */ +- (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * __nullable error))block; + +///------------------------------------------- +/// @name Setting Data Task Delegate Callbacks +///------------------------------------------- + +/** + Sets a block to be executed when a data task has received a response, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveResponse:completionHandler:`. + + @param block A block object to be executed when a data task has received a response. The block returns the disposition of the session response, and takes three arguments: the session, the data task, and the received response. + */ +- (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block; + +/** + Sets a block to be executed when a data task has become a download task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didBecomeDownloadTask:`. + + @param block A block object to be executed when a data task has become a download task. The block has no return value, and takes three arguments: the session, the data task, and the download task it has become. + */ +- (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block; + +/** + Sets a block to be executed when a data task receives data, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveData:`. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the session, the data task, and the data received. This block may be called multiple times, and will execute on the session manager operation queue. + */ +- (void)setDataTaskDidReceiveDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block; + +/** + Sets a block to be executed to determine the caching behavior of a data task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:willCacheResponse:completionHandler:`. + + @param block A block object to be executed to determine the caching behavior of a data task. The block returns the response to cache, and takes three arguments: the session, the data task, and the proposed cached URL response. + */ +- (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block; + +/** + Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`. + + @param block A block object to be executed once all messages enqueued for a session have been delivered. The block has no return value and takes a single argument: the session. + */ +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void (^)(NSURLSession *session))block; + +///----------------------------------------------- +/// @name Setting Download Task Delegate Callbacks +///----------------------------------------------- + +/** + Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`. + + @param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error. + */ +- (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block; + +/** + Sets a block to be executed periodically to track download progress, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:`. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes five arguments: the session, the download task, the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the session manager operation queue. + */ +- (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block; + +/** + Sets a block to be executed when a download task has been resumed, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`. + + @param block A block object to be executed when a download task has been resumed. The block has no return value and takes four arguments: the session, the download task, the file offset of the resumed download, and the total number of bytes expected to be downloaded. + */ +- (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block; + +@end + +#endif + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when a task begins executing. + + @deprecated Use `AFNetworkingTaskDidResumeNotification` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidStartNotification DEPRECATED_ATTRIBUTE; + +/** + Posted when a task resumes. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification; + +/** + Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. + + @deprecated Use `AFNetworkingTaskDidCompleteNotification` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidFinishNotification DEPRECATED_ATTRIBUTE; + +/** + Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteNotification; + +/** + Posted when a task suspends its execution. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidSuspendNotification; + +/** + Posted when a session is invalidated. + */ +FOUNDATION_EXPORT NSString * const AFURLSessionDidInvalidateNotification; + +/** + Posted when a session download task encountered an error when moving the temporary download file to a specified destination. + */ +FOUNDATION_EXPORT NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification; + +/** + The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. + + @deprecated Use `AFNetworkingTaskDidCompleteResponseDataKey` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidFinishResponseDataKey DEPRECATED_ATTRIBUTE; + +/** + The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteResponseDataKey; + +/** + The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. + + @deprecated Use `AFNetworkingTaskDidCompleteSerializedResponseKey` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidFinishSerializedResponseKey DEPRECATED_ATTRIBUTE; + +/** + The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey; + +/** + The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. + + @deprecated Use `AFNetworkingTaskDidCompleteResponseSerializerKey` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidFinishResponseSerializerKey DEPRECATED_ATTRIBUTE; + +/** + The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey; + +/** + The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. + + @deprecated Use `AFNetworkingTaskDidCompleteAssetPathKey` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidFinishAssetPathKey DEPRECATED_ATTRIBUTE; + +/** + The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteAssetPathKey; + +/** + Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. + + @deprecated Use `AFNetworkingTaskDidCompleteErrorKey` instead. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE; + +/** + Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. + */ +FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidCompleteErrorKey; + +NS_ASSUME_NONNULL_END diff --git a/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m new file mode 100644 index 0000000..eb28959 --- /dev/null +++ b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m @@ -0,0 +1,1171 @@ +// AFURLSessionManager.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFURLSessionManager.h" +#import + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +static dispatch_queue_t url_session_manager_creation_queue() { + static dispatch_queue_t af_url_session_manager_creation_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_creation_queue = dispatch_queue_create("com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL); + }); + + return af_url_session_manager_creation_queue; +} + +static dispatch_queue_t url_session_manager_processing_queue() { + static dispatch_queue_t af_url_session_manager_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_processing_queue = dispatch_queue_create("com.alamofire.networking.session.manager.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return af_url_session_manager_processing_queue; +} + +static dispatch_group_t url_session_manager_completion_group() { + static dispatch_group_t af_url_session_manager_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_completion_group = dispatch_group_create(); + }); + + return af_url_session_manager_completion_group; +} + +NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume"; +NSString * const AFNetworkingTaskDidCompleteNotification = @"com.alamofire.networking.task.complete"; +NSString * const AFNetworkingTaskDidSuspendNotification = @"com.alamofire.networking.task.suspend"; +NSString * const AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate"; +NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification = @"com.alamofire.networking.session.download.file-manager-error"; + +NSString * const AFNetworkingTaskDidStartNotification = @"com.alamofire.networking.task.resume"; // Deprecated +NSString * const AFNetworkingTaskDidFinishNotification = @"com.alamofire.networking.task.complete"; // Deprecated + +NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse"; +NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer"; +NSString * const AFNetworkingTaskDidCompleteResponseDataKey = @"com.alamofire.networking.complete.finish.responsedata"; +NSString * const AFNetworkingTaskDidCompleteErrorKey = @"com.alamofire.networking.task.complete.error"; +NSString * const AFNetworkingTaskDidCompleteAssetPathKey = @"com.alamofire.networking.task.complete.assetpath"; + +NSString * const AFNetworkingTaskDidFinishSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse"; // Deprecated +NSString * const AFNetworkingTaskDidFinishResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer"; // Deprecated +NSString * const AFNetworkingTaskDidFinishResponseDataKey = @"com.alamofire.networking.complete.finish.responsedata"; // Deprecated +NSString * const AFNetworkingTaskDidFinishErrorKey = @"com.alamofire.networking.task.complete.error"; // Deprecated +NSString * const AFNetworkingTaskDidFinishAssetPathKey = @"com.alamofire.networking.task.complete.assetpath"; // Deprecated + +static NSString * const AFURLSessionManagerLockName = @"com.alamofire.networking.session.manager.lock"; + +static NSUInteger const AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask = 3; + +static void * AFTaskStateChangedContext = &AFTaskStateChangedContext; + +typedef void (^AFURLSessionDidBecomeInvalidBlock)(NSURLSession *session, NSError *error); +typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); + +typedef NSURLRequest * (^AFURLSessionTaskWillPerformHTTPRedirectionBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request); +typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionTaskDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); +typedef void (^AFURLSessionDidFinishEventsForBackgroundURLSessionBlock)(NSURLSession *session); + +typedef NSInputStream * (^AFURLSessionTaskNeedNewBodyStreamBlock)(NSURLSession *session, NSURLSessionTask *task); +typedef void (^AFURLSessionTaskDidSendBodyDataBlock)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend); +typedef void (^AFURLSessionTaskDidCompleteBlock)(NSURLSession *session, NSURLSessionTask *task, NSError *error); + +typedef NSURLSessionResponseDisposition (^AFURLSessionDataTaskDidReceiveResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response); +typedef void (^AFURLSessionDataTaskDidBecomeDownloadTaskBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask); +typedef void (^AFURLSessionDataTaskDidReceiveDataBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data); +typedef NSCachedURLResponse * (^AFURLSessionDataTaskWillCacheResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse); + +typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location); +typedef void (^AFURLSessionDownloadTaskDidWriteDataBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite); +typedef void (^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes); + +typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error); + +#pragma mark - + +@interface AFURLSessionManagerTaskDelegate : NSObject +@property (nonatomic, weak) AFURLSessionManager *manager; +@property (nonatomic, strong) NSMutableData *mutableData; +@property (nonatomic, strong) NSProgress *progress; +@property (nonatomic, copy) NSURL *downloadFileURL; +@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; +@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler; +@end + +@implementation AFURLSessionManagerTaskDelegate + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.mutableData = [NSMutableData data]; + + self.progress = [NSProgress progressWithTotalUnitCount:0]; + + return self; +} + +#pragma mark - NSURLSessionTaskDelegate + +- (void)URLSession:(__unused NSURLSession *)session + task:(__unused NSURLSessionTask *)task + didSendBodyData:(__unused int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend +{ + self.progress.totalUnitCount = totalBytesExpectedToSend; + self.progress.completedUnitCount = totalBytesSent; +} + +- (void)URLSession:(__unused NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + __strong AFURLSessionManager *manager = self.manager; + + __block id responseObject = nil; + + __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer; + + //Performance Improvement from #2672 + NSData *data = nil; + if (self.mutableData) { + data = [self.mutableData copy]; + //We no longer need the reference, so nil it out to gain back some memory. + self.mutableData = nil; + } + + if (self.downloadFileURL) { + userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL; + } else if (data) { + userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = data; + } + + if (error) { + userInfo[AFNetworkingTaskDidCompleteErrorKey] = error; + + dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{ + if (self.completionHandler) { + self.completionHandler(task.response, responseObject, error); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; + }); + }); + } else { + dispatch_async(url_session_manager_processing_queue(), ^{ + NSError *serializationError = nil; + responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError]; + + if (self.downloadFileURL) { + responseObject = self.downloadFileURL; + } + + if (responseObject) { + userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject; + } + + if (serializationError) { + userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError; + } + + dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{ + if (self.completionHandler) { + self.completionHandler(task.response, responseObject, serializationError); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; + }); + }); + }); + } +#pragma clang diagnostic pop +} + +#pragma mark - NSURLSessionDataTaskDelegate + +- (void)URLSession:(__unused NSURLSession *)session + dataTask:(__unused NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data +{ + [self.mutableData appendData:data]; +} + +#pragma mark - NSURLSessionDownloadTaskDelegate + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location +{ + NSError *fileManagerError = nil; + self.downloadFileURL = nil; + + if (self.downloadTaskDidFinishDownloading) { + self.downloadFileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); + if (self.downloadFileURL) { + [[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError]; + + if (fileManagerError) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo]; + } + } + } +} + +- (void)URLSession:(__unused NSURLSession *)session + downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask + didWriteData:(__unused int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite +{ + self.progress.totalUnitCount = totalBytesExpectedToWrite; + self.progress.completedUnitCount = totalBytesWritten; +} + +- (void)URLSession:(__unused NSURLSession *)session + downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + self.progress.totalUnitCount = expectedTotalBytes; + self.progress.completedUnitCount = fileOffset; +} + +@end + +#pragma mark - + +/** + * A workaround for issues related to key-value observing the `state` of an `NSURLSessionTask`. + * + * See: + * - https://github.com/AFNetworking/AFNetworking/issues/1477 + * - https://github.com/AFNetworking/AFNetworking/issues/2638 + * - https://github.com/AFNetworking/AFNetworking/pull/2702 + */ + +static inline void af_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) { + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + method_exchangeImplementations(originalMethod, swizzledMethod); +} + +static inline BOOL af_addMethod(Class class, SEL selector, Method method) { + return class_addMethod(class, selector, method_getImplementation(method), method_getTypeEncoding(method)); +} + +static NSString * const AFNSURLSessionTaskDidResumeNotification = @"com.alamofire.networking.nsurlsessiontask.resume"; +static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofire.networking.nsurlsessiontask.suspend"; + +@interface _AFURLSessionTaskSwizzling : NSObject + +@end + +@implementation _AFURLSessionTaskSwizzling + ++ (void)load { + /** + WARNING: Trouble Ahead + https://github.com/AFNetworking/AFNetworking/pull/2702 + */ + + if (NSClassFromString(@"NSURLSessionTask")) { + /** + iOS 7 and iOS 8 differ in NSURLSessionTask implementation, which makes the next bit of code a bit tricky. + Many Unit Tests have been built to validate as much of this behavior has possible. + Here is what we know: + - NSURLSessionTasks are implemented with class clusters, meaning the class you request from the API isn't actually the type of class you will get back. + - Simply referencing `[NSURLSessionTask class]` will not work. You need to ask an `NSURLSession` to actually create an object, and grab the class from there. + - On iOS 7, `localDataTask` is a `__NSCFLocalDataTask`, which inherits from `__NSCFLocalSessionTask`, which inherits from `__NSCFURLSessionTask`. + - On iOS 8, `localDataTask` is a `__NSCFLocalDataTask`, which inherits from `__NSCFLocalSessionTask`, which inherits from `NSURLSessionTask`. + - On iOS 7, `__NSCFLocalSessionTask` and `__NSCFURLSessionTask` are the only two classes that have their own implementations of `resume` and `suspend`, and `__NSCFLocalSessionTask` DOES NOT CALL SUPER. This means both classes need to be swizzled. + - On iOS 8, `NSURLSessionTask` is the only class that implements `resume` and `suspend`. This means this is the only class that needs to be swizzled. + - Because `NSURLSessionTask` is not involved in the class hierarchy for every version of iOS, its easier to add the swizzled methods to a dummy class and manage them there. + + Some Assumptions: + - No implementations of `resume` or `suspend` call super. If this were to change in a future version of iOS, we'd need to handle it. + - No background task classes override `resume` or `suspend` + + The current solution: + 1) Grab an instance of `__NSCFLocalDataTask` by asking an instance of `NSURLSession` for a data task. + 2) Grab a pointer to the original implementation of `af_resume` + 3) Check to see if the current class has an implementation of resume. If so, continue to step 4. + 4) Grab the super class of the current class. + 5) Grab a pointer for the current class to the current implementation of `resume`. + 6) Grab a pointer for the super class to the current implementation of `resume`. + 7) If the current class implementation of `resume` is not equal to the super class implementation of `resume` AND the current implementation of `resume` is not equal to the original implementation of `af_resume`, THEN swizzle the methods + 8) Set the current class to the super class, and repeat steps 3-8 + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnonnull" + NSURLSessionDataTask *localDataTask = [[NSURLSession sessionWithConfiguration:nil] dataTaskWithURL:nil]; +#pragma clang diagnostic pop + IMP originalAFResumeIMP = method_getImplementation(class_getInstanceMethod([self class], @selector(af_resume))); + Class currentClass = [localDataTask class]; + + while (class_getInstanceMethod(currentClass, @selector(resume))) { + Class superClass = [currentClass superclass]; + IMP classResumeIMP = method_getImplementation(class_getInstanceMethod(currentClass, @selector(resume))); + IMP superclassResumeIMP = method_getImplementation(class_getInstanceMethod(superClass, @selector(resume))); + if (classResumeIMP != superclassResumeIMP && + originalAFResumeIMP != classResumeIMP) { + [self swizzleResumeAndSuspendMethodForClass:currentClass]; + } + currentClass = [currentClass superclass]; + } + + [localDataTask cancel]; + } +} + ++ (void)swizzleResumeAndSuspendMethodForClass:(Class)class { + Method afResumeMethod = class_getInstanceMethod(self, @selector(af_resume)); + Method afSuspendMethod = class_getInstanceMethod(self, @selector(af_suspend)); + + if (af_addMethod(class, @selector(af_resume), afResumeMethod)) { + af_swizzleSelector(class, @selector(resume), @selector(af_resume)); + } + + if (af_addMethod(class, @selector(af_suspend), afSuspendMethod)) { + af_swizzleSelector(class, @selector(suspend), @selector(af_suspend)); + } +} + +- (NSURLSessionTaskState)state { + NSAssert(NO, @"State method should never be called in the actual dummy class"); + return NSURLSessionTaskStateCanceling; +} + +- (void)af_resume { + NSAssert([self respondsToSelector:@selector(state)], @"Does not respond to state"); + NSURLSessionTaskState state = [self state]; + [self af_resume]; + + if (state != NSURLSessionTaskStateRunning) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidResumeNotification object:self]; + } +} + +- (void)af_suspend { + NSAssert([self respondsToSelector:@selector(state)], @"Does not respond to state"); + NSURLSessionTaskState state = [self state]; + [self af_suspend]; + + if (state != NSURLSessionTaskStateSuspended) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidSuspendNotification object:self]; + } +} +@end + +#pragma mark - + +@interface AFURLSessionManager () +@property (readwrite, nonatomic, strong) NSURLSessionConfiguration *sessionConfiguration; +@property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; +@property (readwrite, nonatomic, strong) NSURLSession *session; +@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier; +@property (readonly, nonatomic, copy) NSString *taskDescriptionForSessionTasks; +@property (readwrite, nonatomic, strong) NSLock *lock; +@property (readwrite, nonatomic, copy) AFURLSessionDidBecomeInvalidBlock sessionDidBecomeInvalid; +@property (readwrite, nonatomic, copy) AFURLSessionDidReceiveAuthenticationChallengeBlock sessionDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionDidFinishEventsForBackgroundURLSessionBlock didFinishEventsForBackgroundURLSession; +@property (readwrite, nonatomic, copy) AFURLSessionTaskWillPerformHTTPRedirectionBlock taskWillPerformHTTPRedirection; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidReceiveAuthenticationChallengeBlock taskDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionTaskNeedNewBodyStreamBlock taskNeedNewBodyStream; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidSendBodyDataBlock taskDidSendBodyData; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidCompleteBlock taskDidComplete; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveResponseBlock dataTaskDidReceiveResponse; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidBecomeDownloadTaskBlock dataTaskDidBecomeDownloadTask; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveDataBlock dataTaskDidReceiveData; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskWillCacheResponseBlock dataTaskWillCacheResponse; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidWriteDataBlock downloadTaskDidWriteData; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidResumeBlock downloadTaskDidResume; +@end + +@implementation AFURLSessionManager + +- (instancetype)init { + return [self initWithSessionConfiguration:nil]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + self = [super init]; + if (!self) { + return nil; + } + + if (!configuration) { + configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + } + + self.sessionConfiguration = configuration; + + self.operationQueue = [[NSOperationQueue alloc] init]; + self.operationQueue.maxConcurrentOperationCount = 1; + + self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; + + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + +#if !TARGET_OS_WATCH + self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; +#endif + + self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init]; + + self.lock = [[NSLock alloc] init]; + self.lock.name = AFURLSessionManagerLockName; + + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + for (NSURLSessionDataTask *task in dataTasks) { + [self addDelegateForDataTask:task completionHandler:nil]; + } + + for (NSURLSessionUploadTask *uploadTask in uploadTasks) { + [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; + } + + for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { + [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; + } + }]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidResume:) name:AFNSURLSessionTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidSuspend:) name:AFNSURLSessionTaskDidSuspendNotification object:nil]; + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - + +- (NSString *)taskDescriptionForSessionTasks { + return [NSString stringWithFormat:@"%p", self]; +} + +- (void)taskDidResume:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task respondsToSelector:@selector(taskDescription)]) { + if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidResumeNotification object:task]; + }); + } + } +} + +- (void)taskDidSuspend:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task respondsToSelector:@selector(taskDescription)]) { + if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidSuspendNotification object:task]; + }); + } + } +} + +#pragma mark - + +- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task { + NSParameterAssert(task); + + AFURLSessionManagerTaskDelegate *delegate = nil; + [self.lock lock]; + delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)]; + [self.lock unlock]; + + return delegate; +} + +- (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate + forTask:(NSURLSessionTask *)task +{ + NSParameterAssert(task); + NSParameterAssert(delegate); + + [self.lock lock]; + self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate; + [self.lock unlock]; +} + +- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + dataTask.taskDescription = self.taskDescriptionForSessionTasks; + [self setDelegate:delegate forTask:dataTask]; +} + +- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + int64_t totalUnitCount = uploadTask.countOfBytesExpectedToSend; + if(totalUnitCount == NSURLSessionTransferSizeUnknown) { + NSString *contentLength = [uploadTask.originalRequest valueForHTTPHeaderField:@"Content-Length"]; + if(contentLength) { + totalUnitCount = (int64_t)[contentLength longLongValue]; + } + } + + if (delegate.progress) { + delegate.progress.totalUnitCount = totalUnitCount; + } else { + delegate.progress = [NSProgress progressWithTotalUnitCount:totalUnitCount]; + } + + delegate.progress.pausingHandler = ^{ + [uploadTask suspend]; + }; + delegate.progress.cancellationHandler = ^{ + [uploadTask cancel]; + }; + + if (progress) { + *progress = delegate.progress; + } + + uploadTask.taskDescription = self.taskDescriptionForSessionTasks; + + [self setDelegate:delegate forTask:uploadTask]; +} + +- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + if (destination) { + delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) { + return destination(location, task.response); + }; + } + + if (progress) { + *progress = delegate.progress; + } + + downloadTask.taskDescription = self.taskDescriptionForSessionTasks; + + [self setDelegate:delegate forTask:downloadTask]; +} + +- (void)removeDelegateForTask:(NSURLSessionTask *)task { + NSParameterAssert(task); + + [self.lock lock]; + [self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)]; + [self.lock unlock]; +} + +- (void)removeAllDelegates { + [self.lock lock]; + [self.mutableTaskDelegatesKeyedByTaskIdentifier removeAllObjects]; + [self.lock unlock]; +} + +#pragma mark - + +- (NSArray *)tasksForKeyPath:(NSString *)keyPath { + __block NSArray *tasks = nil; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))]) { + tasks = dataTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(uploadTasks))]) { + tasks = uploadTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(downloadTasks))]) { + tasks = downloadTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(tasks))]) { + tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"]; + } + + dispatch_semaphore_signal(semaphore); + }]; + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + + return tasks; +} + +- (NSArray *)tasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)dataTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)uploadTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)downloadTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +#pragma mark - + +- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks { + dispatch_async(dispatch_get_main_queue(), ^{ + if (cancelPendingTasks) { + [self.session invalidateAndCancel]; + } else { + [self.session finishTasksAndInvalidate]; + } + }); +} + +#pragma mark - + +- (void)setResponseSerializer:(id )responseSerializer { + NSParameterAssert(responseSerializer); + + _responseSerializer = responseSerializer; +} + +#pragma mark - + +- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionDataTask *dataTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + dataTask = [self.session dataTaskWithRequest:request]; + }); + + [self addDelegateForDataTask:dataTask completionHandler:completionHandler]; + + return dataTask; +} + +#pragma mark - + +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromFile:(NSURL *)fileURL + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + }); + + if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) { + for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) { + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + } + } + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromData:(NSData *)bodyData + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData]; + }); + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithStreamedRequest:request]; + }); + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +#pragma mark - + +- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithRequest:request]; + }); + + [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; + + return downloadTask; +} + +- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithResumeData:resumeData]; + }); + + [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; + + return downloadTask; +} + +#pragma mark - + +- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask { + return [[self delegateForTask:uploadTask] progress]; +} + +- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask { + return [[self delegateForTask:downloadTask] progress]; +} + +#pragma mark - + +- (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block { + self.sessionDidBecomeInvalid = block; +} + +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block { + self.sessionDidReceiveAuthenticationChallenge = block; +} + +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block { + self.didFinishEventsForBackgroundURLSession = block; +} + +#pragma mark - + +- (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block { + self.taskNeedNewBodyStream = block; +} + +- (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block { + self.taskWillPerformHTTPRedirection = block; +} + +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block { + self.taskDidReceiveAuthenticationChallenge = block; +} + +- (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block { + self.taskDidSendBodyData = block; +} + +- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block { + self.taskDidComplete = block; +} + +#pragma mark - + +- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block { + self.dataTaskDidReceiveResponse = block; +} + +- (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block { + self.dataTaskDidBecomeDownloadTask = block; +} + +- (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block { + self.dataTaskDidReceiveData = block; +} + +- (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block { + self.dataTaskWillCacheResponse = block; +} + +#pragma mark - + +- (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block { + self.downloadTaskDidFinishDownloading = block; +} + +- (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block { + self.downloadTaskDidWriteData = block; +} + +- (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block { + self.downloadTaskDidResume = block; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, self.session, self.operationQueue]; +} + +- (BOOL)respondsToSelector:(SEL)selector { + if (selector == @selector(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)) { + return self.taskWillPerformHTTPRedirection != nil; + } else if (selector == @selector(URLSession:dataTask:didReceiveResponse:completionHandler:)) { + return self.dataTaskDidReceiveResponse != nil; + } else if (selector == @selector(URLSession:dataTask:willCacheResponse:completionHandler:)) { + return self.dataTaskWillCacheResponse != nil; + } else if (selector == @selector(URLSessionDidFinishEventsForBackgroundURLSession:)) { + return self.didFinishEventsForBackgroundURLSession != nil; + } + + return [[self class] instancesRespondToSelector:selector]; +} + +#pragma mark - NSURLSessionDelegate + +- (void)URLSession:(NSURLSession *)session +didBecomeInvalidWithError:(NSError *)error +{ + if (self.sessionDidBecomeInvalid) { + self.sessionDidBecomeInvalid(session, error); + } + + [self removeAllDelegates]; + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session]; +} + +- (void)URLSession:(NSURLSession *)session +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler +{ + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if (self.sessionDidReceiveAuthenticationChallenge) { + disposition = self.sessionDidReceiveAuthenticationChallenge(session, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + if (credential) { + disposition = NSURLSessionAuthChallengeUseCredential; + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +#pragma mark - NSURLSessionTaskDelegate + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *))completionHandler +{ + NSURLRequest *redirectRequest = request; + + if (self.taskWillPerformHTTPRedirection) { + redirectRequest = self.taskWillPerformHTTPRedirection(session, task, response, request); + } + + if (completionHandler) { + completionHandler(redirectRequest); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler +{ + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if (self.taskDidReceiveAuthenticationChallenge) { + disposition = self.taskDidReceiveAuthenticationChallenge(session, task, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + disposition = NSURLSessionAuthChallengeUseCredential; + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler +{ + NSInputStream *inputStream = nil; + + if (self.taskNeedNewBodyStream) { + inputStream = self.taskNeedNewBodyStream(session, task); + } else if (task.originalRequest.HTTPBodyStream && [task.originalRequest.HTTPBodyStream conformsToProtocol:@protocol(NSCopying)]) { + inputStream = [task.originalRequest.HTTPBodyStream copy]; + } + + if (completionHandler) { + completionHandler(inputStream); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend +{ + + int64_t totalUnitCount = totalBytesExpectedToSend; + if(totalUnitCount == NSURLSessionTransferSizeUnknown) { + NSString *contentLength = [task.originalRequest valueForHTTPHeaderField:@"Content-Length"]; + if(contentLength) { + totalUnitCount = (int64_t) [contentLength longLongValue]; + } + } + + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; + [delegate URLSession:session task:task didSendBodyData:bytesSent totalBytesSent:totalBytesSent totalBytesExpectedToSend:totalUnitCount]; + + if (self.taskDidSendBodyData) { + self.taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalUnitCount); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; + + // delegate may be nil when completing a task in the background + if (delegate) { + [delegate URLSession:session task:task didCompleteWithError:error]; + + [self removeDelegateForTask:task]; + } + + if (self.taskDidComplete) { + self.taskDidComplete(session, task, error); + } + +} + +#pragma mark - NSURLSessionDataDelegate + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler +{ + NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow; + + if (self.dataTaskDidReceiveResponse) { + disposition = self.dataTaskDidReceiveResponse(session, dataTask, response); + } + + if (completionHandler) { + completionHandler(disposition); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask]; + if (delegate) { + [self removeDelegateForTask:dataTask]; + [self setDelegate:delegate forTask:downloadTask]; + } + + if (self.dataTaskDidBecomeDownloadTask) { + self.dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask]; + [delegate URLSession:session dataTask:dataTask didReceiveData:data]; + + if (self.dataTaskDidReceiveData) { + self.dataTaskDidReceiveData(session, dataTask, data); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler +{ + NSCachedURLResponse *cachedResponse = proposedResponse; + + if (self.dataTaskWillCacheResponse) { + cachedResponse = self.dataTaskWillCacheResponse(session, dataTask, proposedResponse); + } + + if (completionHandler) { + completionHandler(cachedResponse); + } +} + +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { + if (self.didFinishEventsForBackgroundURLSession) { + dispatch_async(dispatch_get_main_queue(), ^{ + self.didFinishEventsForBackgroundURLSession(session); + }); + } +} + +#pragma mark - NSURLSessionDownloadDelegate + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + if (self.downloadTaskDidFinishDownloading) { + NSURL *fileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); + if (fileURL) { + delegate.downloadFileURL = fileURL; + NSError *error = nil; + [[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error]; + if (error) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo]; + } + + return; + } + } + + if (delegate) { + [delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location]; + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + [delegate URLSession:session downloadTask:downloadTask didWriteData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; + + if (self.downloadTaskDidWriteData) { + self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + [delegate URLSession:session downloadTask:downloadTask didResumeAtOffset:fileOffset expectedTotalBytes:expectedTotalBytes]; + + if (self.downloadTaskDidResume) { + self.downloadTaskDidResume(session, downloadTask, fileOffset, expectedTotalBytes); + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURLSessionConfiguration *configuration = [decoder decodeObjectOfClass:[NSURLSessionConfiguration class] forKey:@"sessionConfiguration"]; + + self = [self initWithSessionConfiguration:configuration]; + if (!self) { + return nil; + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.session.configuration forKey:@"sessionConfiguration"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return [[[self class] allocWithZone:zone] initWithSessionConfiguration:self.session.configuration]; +} + +@end + +#endif diff --git a/Pods/AFNetworking/LICENSE b/Pods/AFNetworking/LICENSE new file mode 100644 index 0000000..91f125b --- /dev/null +++ b/Pods/AFNetworking/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +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. diff --git a/Pods/AFNetworking/README.md b/Pods/AFNetworking/README.md new file mode 100644 index 0000000..f25efe0 --- /dev/null +++ b/Pods/AFNetworking/README.md @@ -0,0 +1,394 @@ +

+ AFNetworking +

+ +[![Build Status](https://travis-ci.org/AFNetworking/AFNetworking.svg)](https://travis-ci.org/AFNetworking/AFNetworking) + +AFNetworking is a delightful networking library for iOS and Mac OS X. It's built on top of the [Foundation URL Loading System](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html), extending the powerful high-level networking abstractions built into Cocoa. It has a modular architecture with well-designed, feature-rich APIs that are a joy to use. + +Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac. + +Choose AFNetworking for your next project, or migrate over your existing projects—you'll be happy you did! + +## How To Get Started + +- [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps +- Read the ["Getting Started" guide](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking), [FAQ](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ), or [other articles on the Wiki](https://github.com/AFNetworking/AFNetworking/wiki) +- Check out the [documentation](http://cocoadocs.org/docsets/AFNetworking/) for a comprehensive look at all of the APIs available in AFNetworking +- Read the [AFNetworking 2.0 Migration Guide](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide) for an overview of the architectural changes from 1.0. + +## Communication + +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). (Tag 'afnetworking') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). +- If you **found a bug**, _and can provide steps to reliably reproduce it_, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. + +### Installation with CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like AFNetworking in your projects. See the ["Getting Started" guide for more information](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking). + +#### Podfile + +```ruby +platform :ios, '7.0' +pod "AFNetworking", "~> 2.0" +``` + +## Requirements + +| AFNetworking Version | Minimum iOS Target | Minimum OS X Target | Notes | +|:--------------------:|:---------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| +| 2.x | iOS 6 | OS X 10.8 | Xcode 5 is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | +| [1.x](https://github.com/AFNetworking/AFNetworking/tree/1.x) | iOS 5 | Mac OS X 10.7 | | +| [0.10.x](https://github.com/AFNetworking/AFNetworking/tree/0.10.x) | iOS 4 | Mac OS X 10.6 | | + +(OS X projects must support [64-bit with modern Cocoa runtime](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html)). + +> Programming in Swift? Try [Alamofire](https://github.com/Alamofire/Alamofire) for a more conventional set of APIs. + +## Architecture + +### NSURLConnection + +- `AFURLConnectionOperation` +- `AFHTTPRequestOperation` +- `AFHTTPRequestOperationManager` + +### NSURLSession _(iOS 7 / Mac OS X 10.9)_ + +- `AFURLSessionManager` +- `AFHTTPSessionManager` + +### Serialization + +* `` + - `AFHTTPRequestSerializer` + - `AFJSONRequestSerializer` + - `AFPropertyListRequestSerializer` +* `` + - `AFHTTPResponseSerializer` + - `AFJSONResponseSerializer` + - `AFXMLParserResponseSerializer` + - `AFXMLDocumentResponseSerializer` _(Mac OS X)_ + - `AFPropertyListResponseSerializer` + - `AFImageResponseSerializer` + - `AFCompoundResponseSerializer` + +### Additional Functionality + +- `AFSecurityPolicy` +- `AFNetworkReachabilityManager` + +## Usage + +### HTTP Request Operation Manager + +`AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + +#### `GET` Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` URL-Form-Encoded Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` Multi-Part Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:filePath name:@"image" error:nil]; +} success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"Success: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +--- + +### AFURLSessionManager + +`AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + +#### Creating a Download Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { + NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; + return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; +} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { + NSLog(@"File downloaded to: %@", filePath); +}]; +[downloadTask resume]; +``` + +#### Creating an Upload Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"Success: %@ %@", response, responseObject); + } +}]; +[uploadTask resume]; +``` + +#### Creating an Upload Task for a Multi-Part Request, with Progress + +```objective-c +NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil]; + } error:nil]; + +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +NSProgress *progress = nil; + +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; + +[uploadTask resume]; +``` + +#### Creating a Data Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; +[dataTask resume]; +``` + +--- + +### Request Serialization + +Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body. + +```objective-c +NSString *URLString = @"http://example.com"; +NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]}; +``` + +#### Query String Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil]; +``` + + GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### URL Form Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/x-www-form-urlencoded + + foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### JSON Parameter Encoding + +```objective-c +[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/json + + {"foo": "bar", "baz": [1,2,3]} + +--- + +### Network Reachability Manager + +`AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + +* Do not use Reachability to determine if the original request should be sent. + * You should try to send it. +* You can use Reachability to determine when a request should be automatically retried. + * Although it may still fail, a Reachability notification that the connectivity is available is a good time to retry something. +* Network reachability is a useful tool for determining why a request might have failed. + * After a network request has failed, telling the user they're offline is better than giving them a more technical but accurate error, such as "request timed out." + +See also [WWDC 2012 session 706, "Networking Best Practices."](https://developer.apple.com/videos/wwdc/2012/#706). + +#### Shared Network Reachability + +```objective-c +[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); +}]; + +[[AFNetworkReachabilityManager sharedManager] startMonitoring]; +``` + +#### HTTP Manager Reachability + +```objective-c +NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"]; +AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL]; + +NSOperationQueue *operationQueue = manager.operationQueue; +[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusReachableViaWWAN: + case AFNetworkReachabilityStatusReachableViaWiFi: + [operationQueue setSuspended:NO]; + break; + case AFNetworkReachabilityStatusNotReachable: + default: + [operationQueue setSuspended:YES]; + break; + } +}]; + +[manager.reachabilityManager startMonitoring]; +``` + +--- + +### Security Policy + +`AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + +Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + +#### Allowing Invalid SSL Certificates + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production +``` + +--- + +### AFHTTPRequestOperation + +`AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + +Although `AFHTTPRequestOperationManager` is usually the best way to go about making requests, `AFHTTPRequestOperation` can be used by itself. + +#### `GET` with `AFHTTPRequestOperation` + +```objective-c +NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; +AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; +op.responseSerializer = [AFJSONResponseSerializer serializer]; +[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +[[NSOperationQueue mainQueue] addOperation:op]; +``` + +#### Batch of Operations + +```objective-c +NSMutableArray *mutableOperations = [NSMutableArray array]; +for (NSURL *fileURL in filesToUpload) { + NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil]; + }]; + + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + + [mutableOperations addObject:operation]; +} + +NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { + NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations); +} completionBlock:^(NSArray *operations) { + NSLog(@"All operations in batch complete"); +}]; +[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; +``` + +## Unit Tests + +AFNetworking includes a suite of unit tests within the Tests subdirectory. In order to run the unit tests, you must install the testing dependencies via [CocoaPods](http://cocoapods.org/): + + $ cd Tests + $ pod install + +Once testing dependencies are installed, you can execute the test suite via the 'iOS Tests' and 'OS X Tests' schemes within Xcode. + +### Running Tests from the Command Line + +Tests can also be run from the command line or within a continuous integration environment. The [`xcpretty`](https://github.com/mneorr/xcpretty) utility needs to be installed before running the tests from the command line: + + $ gem install xcpretty + +Once `xcpretty` is installed, you can execute the suite via `rake test`. + +## Credits + +AFNetworking is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). + +AFNetworking was originally created by [Scott Raymond](https://github.com/sco/) and [Mattt Thompson](https://github.com/mattt/) in the development of [Gowalla for iPhone](http://en.wikipedia.org/wiki/Gowalla). + +AFNetworking's logo was designed by [Alan Defibaugh](http://www.alandefibaugh.com/). + +And most of all, thanks to AFNetworking's [growing list of contributors](https://github.com/AFNetworking/AFNetworking/contributors). + +### Security Disclosure + +If you believe you have identified a security vulnerability with AFNetworking, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker. + +## License + +AFNetworking is released under the MIT license. See LICENSE for details. diff --git a/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 100644 index 0000000..3c7649b --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1,80 @@ +// AFNetworkActivityIndicatorManager.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + `AFNetworkActivityIndicatorManager` manages the state of the network activity indicator in the status bar. When enabled, it will listen for notifications indicating that a network request operation has started or finished, and start or stop animating the indicator accordingly. The number of active requests is incremented and decremented much like a stack or a semaphore, and the activity indicator will animate so long as that number is greater than zero. + + You should enable the shared instance of `AFNetworkActivityIndicatorManager` when your application finishes launching. In `AppDelegate application:didFinishLaunchingWithOptions:` you can do so with the following code: + + [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; + + By setting `enabled` to `YES` for `sharedManager`, the network activity indicator will show and hide automatically as requests start and finish. You should not ever need to call `incrementActivityCount` or `decrementActivityCount` yourself. + + See the Apple Human Interface Guidelines section about the Network Activity Indicator for more information: + http://developer.apple.com/library/iOS/#documentation/UserExperience/Conceptual/MobileHIG/UIElementGuidelines/UIElementGuidelines.html#//apple_ref/doc/uid/TP40006556-CH13-SW44 + */ +NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.") +@interface AFNetworkActivityIndicatorManager : NSObject + +/** + A Boolean value indicating whether the manager is enabled. + + If YES, the manager will change status bar network activity indicator according to network operation notifications it receives. The default value is NO. + */ +@property (nonatomic, assign, getter = isEnabled) BOOL enabled; + +/** + A Boolean value indicating whether the network activity indicator is currently displayed in the status bar. + */ +@property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible; + +/** + Returns the shared network activity indicator manager object for the system. + + @return The systemwide network activity indicator manager. + */ ++ (instancetype)sharedManager; + +/** + Increments the number of active network requests. If this number was zero before incrementing, this will start animating the status bar network activity indicator. + */ +- (void)incrementActivityCount; + +/** + Decrements the number of active network requests. If this number becomes zero after decrementing, this will stop animating the status bar network activity indicator. + */ +- (void)decrementActivityCount; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m new file mode 100644 index 0000000..cf13180 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m @@ -0,0 +1,170 @@ +// AFNetworkActivityIndicatorManager.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "AFNetworkActivityIndicatorManager.h" + +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.17; + +static NSURLRequest * AFNetworkRequestFromNotification(NSNotification *notification) { + if ([[notification object] isKindOfClass:[AFURLConnectionOperation class]]) { + return [(AFURLConnectionOperation *)[notification object] request]; + } + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + if ([[notification object] respondsToSelector:@selector(originalRequest)]) { + return [(NSURLSessionTask *)[notification object] originalRequest]; + } +#endif + + return nil; +} + +@interface AFNetworkActivityIndicatorManager () +@property (readwrite, nonatomic, assign) NSInteger activityCount; +@property (readwrite, nonatomic, strong) NSTimer *activityIndicatorVisibilityTimer; +@property (readonly, nonatomic, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; + +- (void)updateNetworkActivityIndicatorVisibility; +- (void)updateNetworkActivityIndicatorVisibilityDelayed; +@end + +@implementation AFNetworkActivityIndicatorManager +@dynamic networkActivityIndicatorVisible; + ++ (instancetype)sharedManager { + static AFNetworkActivityIndicatorManager *_sharedManager = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _sharedManager = [[self alloc] init]; + }); + + return _sharedManager; +} + ++ (NSSet *)keyPathsForValuesAffectingIsNetworkActivityIndicatorVisible { + return [NSSet setWithObject:@"activityCount"]; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingOperationDidStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingOperationDidFinishNotification object:nil]; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidSuspendNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidCompleteNotification object:nil]; +#endif + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_activityIndicatorVisibilityTimer invalidate]; +} + +- (void)updateNetworkActivityIndicatorVisibilityDelayed { + if (self.enabled) { + // Delay hiding of activity indicator for a short interval, to avoid flickering + if (![self isNetworkActivityIndicatorVisible]) { + [self.activityIndicatorVisibilityTimer invalidate]; + self.activityIndicatorVisibilityTimer = [NSTimer timerWithTimeInterval:kAFNetworkActivityIndicatorInvisibilityDelay target:self selector:@selector(updateNetworkActivityIndicatorVisibility) userInfo:nil repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:self.activityIndicatorVisibilityTimer forMode:NSRunLoopCommonModes]; + } else { + [self performSelectorOnMainThread:@selector(updateNetworkActivityIndicatorVisibility) withObject:nil waitUntilDone:NO modes:@[NSRunLoopCommonModes]]; + } + } +} + +- (BOOL)isNetworkActivityIndicatorVisible { + return self.activityCount > 0; +} + +- (void)updateNetworkActivityIndicatorVisibility { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:[self isNetworkActivityIndicatorVisible]]; +} + +- (void)setActivityCount:(NSInteger)activityCount { + @synchronized(self) { + _activityCount = activityCount; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)incrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { + _activityCount++; + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)decrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + _activityCount = MAX(_activityCount - 1, 0); +#pragma clang diagnostic pop + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)networkRequestDidStart:(NSNotification *)notification { + if ([AFNetworkRequestFromNotification(notification) URL]) { + [self incrementActivityCount]; + } +} + +- (void)networkRequestDidFinish:(NSNotification *)notification { + if ([AFNetworkRequestFromNotification(notification) URL]) { + [self decrementActivityCount]; + } +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 100644 index 0000000..0c8f9b5 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1,63 @@ +// UIActivityIndicatorView+AFNetworking.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIActivityIndicatorView` class. The methods in this category provide support for automatically starting and stopping animation depending on the loading state of a request operation or session task. + */ +@interface UIActivityIndicatorView (AFNetworking) + +///---------------------------------- +/// @name Animating for Session Tasks +///---------------------------------- + +/** + Binds the animating state to the state of the specified task. + + @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(nullable NSURLSessionTask *)task; +#endif + +///--------------------------------------- +/// @name Animating for Request Operations +///--------------------------------------- + +/** + Binds the animating state to the execution state of the specified operation. + + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +- (void)setAnimatingWithStateOfOperation:(nullable AFURLConnectionOperation *)operation; + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m new file mode 100644 index 0000000..dd362b0 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m @@ -0,0 +1,171 @@ +// UIActivityIndicatorView+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "UIActivityIndicatorView+AFNetworking.h" +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +@interface AFActivityIndicatorViewNotificationObserver : NSObject +@property (readonly, nonatomic, weak) UIActivityIndicatorView *activityIndicatorView; +- (instancetype)initWithActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task; +#endif +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +@implementation UIActivityIndicatorView (AFNetworking) + +- (AFActivityIndicatorViewNotificationObserver *)af_notificationObserver { + AFActivityIndicatorViewNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver)); + if (notificationObserver == nil) { + notificationObserver = [[AFActivityIndicatorViewNotificationObserver alloc] initWithActivityIndicatorView:self]; + objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return notificationObserver; +} + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { + [[self af_notificationObserver] setAnimatingWithStateOfTask:task]; +} +#endif + +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { + [[self af_notificationObserver] setAnimatingWithStateOfOperation:operation]; +} + +@end + +@implementation AFActivityIndicatorViewNotificationObserver + +- (instancetype)initWithActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView +{ + self = [super init]; + if (self) { + _activityIndicatorView = activityIndicatorView; + } + return self; +} + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + + if (task) { + if (task.state != NSURLSessionTaskStateCompleted) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" + if (task.state == NSURLSessionTaskStateRunning) { + [self.activityIndicatorView startAnimating]; + } else { + [self.activityIndicatorView stopAnimating]; + } +#pragma clang diagnostic pop + + [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidCompleteNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidSuspendNotification object:task]; + } + } +} +#endif + +#pragma mark - + +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; + + if (operation) { + if (![operation isFinished]) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" + if ([operation isExecuting]) { + [self.activityIndicatorView startAnimating]; + } else { + [self.activityIndicatorView stopAnimating]; + } +#pragma clang diagnostic pop + + [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingOperationDidStartNotification object:operation]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingOperationDidFinishNotification object:operation]; + } + } +} + +#pragma mark - + +- (void)af_startAnimating { + dispatch_async(dispatch_get_main_queue(), ^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.activityIndicatorView startAnimating]; +#pragma clang diagnostic pop + }); +} + +- (void)af_stopAnimating { + dispatch_async(dispatch_get_main_queue(), ^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.activityIndicatorView stopAnimating]; +#pragma clang diagnostic pop + }); +} + +#pragma mark - + +- (void)dealloc { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; +#endif + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h new file mode 100644 index 0000000..97f5622 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1,99 @@ +// UIAlertView+AFNetworking.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIAlertView` class. The methods in this category provide support for automatically showing an alert if a session task or request operation finishes with an error. Alert title and message are filled from the corresponding `localizedDescription` & `localizedRecoverySuggestion` or `localizedFailureReason` of the error. + */ +@interface UIAlertView (AFNetworking) + +///------------------------------------- +/// @name Showing Alert for Session Task +///------------------------------------- + +/** + Shows an alert view with the error of the specified session task, if any. + + @param task The session task. + @param delegate The alert view delegate. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(nullable id)delegate NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); +#endif + +/** + Shows an alert view with the error of the specified session task, if any, with a custom cancel button title and other button titles. + + @param task The session task. + @param delegate The alert view delegate. + @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. + @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(nullable id)delegate + cancelButtonTitle:(nullable NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); +#endif + +///------------------------------------------ +/// @name Showing Alert for Request Operation +///------------------------------------------ + +/** + Shows an alert view with the error of the specified request operation, if any. + + @param operation The request operation. + @param delegate The alert view delegate. + */ ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(nullable id)delegate NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); + +/** + Shows an alert view with the error of the specified request operation, if any, with a custom cancel button title and other button titles. + + @param operation The request operation. + @param delegate The alert view delegate. + @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. + @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. + */ ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(nullable id)delegate + cancelButtonTitle:(nullable NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m new file mode 100644 index 0000000..0d1e9e7 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m @@ -0,0 +1,141 @@ +// UIAlertView+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "UIAlertView+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLConnectionOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static void AFGetAlertViewTitleAndMessageFromError(NSError *error, NSString * __autoreleasing *title, NSString * __autoreleasing *message) { + if (error.localizedDescription && (error.localizedRecoverySuggestion || error.localizedFailureReason)) { + *title = error.localizedDescription; + + if (error.localizedRecoverySuggestion) { + *message = error.localizedRecoverySuggestion; + } else { + *message = error.localizedFailureReason; + } + } else if (error.localizedDescription) { + *title = NSLocalizedStringFromTable(@"Error", @"AFNetworking", @"Fallback Error Description"); + *message = error.localizedDescription; + } else { + *title = NSLocalizedStringFromTable(@"Error", @"AFNetworking", @"Fallback Error Description"); + *message = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@ Error: %ld", @"AFNetworking", @"Fallback Error Failure Reason Format"), error.domain, (long)error.code]; + } +} + +@implementation UIAlertView (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate +{ + [self showAlertViewForTaskWithErrorOnCompletion:task delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; +} + ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION +{ + NSMutableArray *mutableOtherTitles = [NSMutableArray array]; + va_list otherButtonTitleList; + va_start(otherButtonTitleList, otherButtonTitles); + { + for (NSString *otherButtonTitle = otherButtonTitles; otherButtonTitle != nil; otherButtonTitle = va_arg(otherButtonTitleList, NSString *)) { + [mutableOtherTitles addObject:otherButtonTitle]; + } + } + va_end(otherButtonTitleList); + + __block __weak id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingTaskDidCompleteNotification object:task queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + NSError *error = notification.userInfo[AFNetworkingTaskDidCompleteErrorKey]; + if (error) { + NSString *title, *message; + AFGetAlertViewTitleAndMessageFromError(error, &title, &message); + + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil, nil]; + for (NSString *otherButtonTitle in mutableOtherTitles) { + [alertView addButtonWithTitle:otherButtonTitle]; + } + [alertView setTitle:title]; + [alertView setMessage:message]; + [alertView show]; + } + + [[NSNotificationCenter defaultCenter] removeObserver:observer]; + }]; +} +#endif + +#pragma mark - + ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate +{ + [self showAlertViewForRequestOperationWithErrorOnCompletion:operation delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; +} + ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION +{ + NSMutableArray *mutableOtherTitles = [NSMutableArray array]; + va_list otherButtonTitleList; + va_start(otherButtonTitleList, otherButtonTitles); + { + for (NSString *otherButtonTitle = otherButtonTitles; otherButtonTitle != nil; otherButtonTitle = va_arg(otherButtonTitleList, NSString *)) { + [mutableOtherTitles addObject:otherButtonTitle]; + } + } + va_end(otherButtonTitleList); + + __block __weak id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingOperationDidFinishNotification object:operation queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + + if (notification.object && [notification.object isKindOfClass:[AFURLConnectionOperation class]]) { + NSError *error = [(AFURLConnectionOperation *)notification.object error]; + if (error) { + NSString *title, *message; + AFGetAlertViewTitleAndMessageFromError(error, &title, &message); + + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil, nil]; + for (NSString *otherButtonTitle in mutableOtherTitles) { + [alertView addButtonWithTitle:otherButtonTitle]; + } + [alertView setTitle:title]; + [alertView setMessage:message]; + [alertView show]; + } + } + + [[NSNotificationCenter defaultCenter] removeObserver:observer]; + }]; +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h new file mode 100644 index 0000000..7289bdb --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1,186 @@ +// UIButton+AFNetworking.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol AFURLResponseSerialization, AFImageCache; + +/** + This category adds methods to the UIKit framework's `UIButton` class. The methods in this category provide support for loading remote images and background images asynchronously from a URL. + + @warning Compound values for control `state` (such as `UIControlStateHighlighted | UIControlStateDisabled`) are unsupported. + */ +@interface UIButton (AFNetworking) + +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loading performance on scroll views. By default, `UIButton` will use the `sharedImageCache` of `UIImageView`. + */ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(__nullable id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + +///-------------------- +/// @name Setting Image +///-------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the image request. + */ +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. + */ +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(nullable UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setImage:forState:` is applied. + + @param state The control state. + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes two arguments: the server response and the image. If the image was returned from cache, the response parameter will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(nullable UIImage *)placeholderImage + success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, UIImage *image))success + failure:(nullable void (^)(NSError *error))failure; + + +///------------------------------- +/// @name Setting Background Image +///------------------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it as the background image for the specified state once the request is finished. Any previous background image request for the receiver will be cancelled. + + If the background image is cached locally, the background image is set immediately, otherwise the specified placeholder background image will be set immediately, and then the remote background image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the background image request. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it as the background image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the background image request. + @param placeholderImage The background image to be set initially, until the background image request finishes. If `nil`, the button will not change its background image until the background image request finishes. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(nullable UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setBackgroundImage:forState:` is applied. + + @param state The control state. + @param urlRequest The URL request used for the image request. + @param placeholderImage The background image to be set initially, until the background image request finishes. If `nil`, the button will not change its background image until the background image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes two arguments: the server response and the image. If the image was returned from cache, the response parameter will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(nullable UIImage *)placeholderImage + success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, UIImage *image))success + failure:(nullable void (^)(NSError *error))failure; + + +///------------------------------ +/// @name Canceling Image Loading +///------------------------------ + +/** + Cancels any executing image operation for the specified control state of the receiver, if one exists. + + @param state The control state. + */ +- (void)cancelImageRequestOperationForState:(UIControlState)state; + +/** + Cancels any executing background image operation for the specified control state of the receiver, if one exists. + + @param state The control state. + */ +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m new file mode 100644 index 0000000..e5c36a5 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m @@ -0,0 +1,293 @@ +// UIButton+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "UIButton+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLResponseSerialization.h" +#import "AFHTTPRequestOperation.h" + +#import "UIImageView+AFNetworking.h" + +@interface UIButton (_AFNetworking) +@end + +@implementation UIButton (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +#pragma mark - + +static char AFImageRequestOperationNormal; +static char AFImageRequestOperationHighlighted; +static char AFImageRequestOperationSelected; +static char AFImageRequestOperationDisabled; + +static const char * af_imageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_imageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_imageRequestOperationKeyForState(state)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_imageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +static char AFBackgroundImageRequestOperationNormal; +static char AFBackgroundImageRequestOperationHighlighted; +static char AFBackgroundImageRequestOperationSelected; +static char AFBackgroundImageRequestOperationDisabled; + +static const char * af_backgroundImageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFBackgroundImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFBackgroundImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFBackgroundImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFBackgroundImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_backgroundImageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state)); +} + +- (void)af_setBackgroundImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIButton (AFNetworking) + ++ (id )sharedImageCache { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: [UIImageView sharedImageCache]; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(__nullable id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(urlRequest, nil, cachedImage); + } else { + [self setImage:cachedImage forState:state]; + } + + [self af_setImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setImageRequestOperation:imageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:imageRequestOperation]; + } +} + +#pragma mark - + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setBackgroundImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setBackgroundImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelBackgroundImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(urlRequest, nil, cachedImage); + } else { + [self setBackgroundImage:cachedImage forState:state]; + } + + [self af_setBackgroundImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setBackgroundImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *backgroundImageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + backgroundImageRequestOperation.responseSerializer = self.imageResponseSerializer; + [backgroundImageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setBackgroundImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setBackgroundImageRequestOperation:backgroundImageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:backgroundImageRequestOperation]; + } +} + +#pragma mark - + +- (void)cancelImageRequestOperationForState:(UIControlState)state { + [[self af_imageRequestOperationForState:state] cancel]; + [self af_setImageRequestOperation:nil forState:state]; +} + +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state { + [[self af_backgroundImageRequestOperationForState:state] cancel]; + [self af_setBackgroundImageRequestOperation:nil forState:state]; +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h new file mode 100644 index 0000000..3292920 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h @@ -0,0 +1,35 @@ +// +// UIImage+AFNetworking.h +// +// +// Created by Paulo Ferreira on 08/07/15. +// +// 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 defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@interface UIImage (AFNetworking) + ++ (UIImage*) safeImageWithData:(NSData*)data; + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h new file mode 100644 index 0000000..bf61915 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1,146 @@ +// UIImageView+AFNetworking.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol AFURLResponseSerialization, AFImageCache; + +/** + This category adds methods to the UIKit framework's `UIImageView` class. The methods in this category provide support for loading remote images asynchronously from a URL. + */ +@interface UIImageView (AFNetworking) + +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loading performance on scroll views. By default, this is an `NSCache` subclass conforming to the `AFImageCache` protocol, which listens for notification warnings and evicts objects accordingly. +*/ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(__nullable id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + +///-------------------- +/// @name Setting Image +///-------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + */ +- (void)setImageWithURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + */ +- (void)setImageWithURL:(NSURL *)url + placeholderImage:(nullable UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the image view before returning. If no success block is specified, the default behavior of setting the image with `self.image = image` is applied. + + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the image created from the response data of request. If the image was returned from cache, the response parameter will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error object describing the network or parsing error that occurred. + */ +- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(nullable UIImage *)placeholderImage + success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, UIImage *image))success + failure:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, NSError *error))failure; + +/** + Cancels any executing image operation for the receiver, if one exists. + */ +- (void)cancelImageRequestOperation; + +@end + +#pragma mark - + +/** + The `AFImageCache` protocol is adopted by an object used to cache images loaded by the AFNetworking category on `UIImageView`. + */ +@protocol AFImageCache + +/** + Returns a cached image for the specified request, if available. + + @param request The image request. + + @return The cached image. + */ +- (nullable UIImage *)cachedImageForRequest:(NSURLRequest *)request; + +/** + Caches a particular image for the specified request. + + @param image The image to cache. + @param request The request to be used as a cache key. + */ +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request; +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m new file mode 100644 index 0000000..2efc160 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m @@ -0,0 +1,215 @@ +// UIImageView+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "UIImageView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +@interface AFImageCache : NSCache +@end + +#pragma mark - + +@interface UIImageView (_AFNetworking) +@property (readwrite, nonatomic, strong, setter = af_setImageRequestOperation:) AFHTTPRequestOperation *af_imageRequestOperation; +@end + +@implementation UIImageView (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +- (AFHTTPRequestOperation *)af_imageRequestOperation { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_imageRequestOperation)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation { + objc_setAssociatedObject(self, @selector(af_imageRequestOperation), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIImageView (AFNetworking) +@dynamic imageResponseSerializer; + ++ (id )sharedImageCache { + static AFImageCache *_af_defaultImageCache = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _af_defaultImageCache = [[AFImageCache alloc] init]; + + [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) { + [_af_defaultImageCache removeAllObjects]; + }]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: _af_defaultImageCache; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(__nullable id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageWithURL:(NSURL *)url { + [self setImageWithURL:url placeholderImage:nil]; +} + +- (void)setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse * __nullable response, NSError *error))failure +{ + [self cancelImageRequestOperation]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(urlRequest, nil, cachedImage); + } else { + self.image = cachedImage; + } + + self.af_imageRequestOperation = nil; + } else { + if (placeholderImage) { + self.image = placeholderImage; + } + + __weak __typeof(self)weakSelf = self; + self.af_imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + self.af_imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [self.af_imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[strongSelf.af_imageRequestOperation.request URL]]) { + if (success) { + success(urlRequest, operation.response, responseObject); + } else if (responseObject) { + strongSelf.image = responseObject; + } + + if (operation == strongSelf.af_imageRequestOperation){ + strongSelf.af_imageRequestOperation = nil; + } + } + + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[strongSelf.af_imageRequestOperation.request URL]]) { + if (failure) { + failure(urlRequest, operation.response, error); + } + + if (operation == strongSelf.af_imageRequestOperation){ + strongSelf.af_imageRequestOperation = nil; + } + } + }]; + + [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation]; + } +} + +- (void)cancelImageRequestOperation { + [self.af_imageRequestOperation cancel]; + self.af_imageRequestOperation = nil; +} + +@end + +#pragma mark - + +static inline NSString * AFImageCacheKeyFromURLRequest(NSURLRequest *request) { + return [[request URL] absoluteString]; +} + +@implementation AFImageCache + +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request { + switch ([request cachePolicy]) { + case NSURLRequestReloadIgnoringCacheData: + case NSURLRequestReloadIgnoringLocalAndRemoteCacheData: + return nil; + default: + break; + } + + return [self objectForKey:AFImageCacheKeyFromURLRequest(request)]; +} + +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request +{ + if (image && request) { + [self setObject:image forKey:AFImageCacheKeyFromURLRequest(request)]; + } +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h new file mode 100644 index 0000000..49850ed --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1,39 @@ +// UIKit+AFNetworking.h +// +// Copyright (c) 2013 AFNetworking (http://afnetworking.com/) +// +// 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 TARGET_OS_IOS +#import + +#ifndef _UIKIT_AFNETWORKING_ + #define _UIKIT_AFNETWORKING_ + + #import "AFNetworkActivityIndicatorManager.h" + + #import "UIActivityIndicatorView+AFNetworking.h" + #import "UIAlertView+AFNetworking.h" + #import "UIButton+AFNetworking.h" + #import "UIImageView+AFNetworking.h" + #import "UIProgressView+AFNetworking.h" + #import "UIRefreshControl+AFNetworking.h" + #import "UIWebView+AFNetworking.h" +#endif /* _UIKIT_AFNETWORKING_ */ +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h new file mode 100644 index 0000000..5c00d6d --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1,91 @@ +// UIProgressView+AFNetworking.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIProgressView` class. The methods in this category provide support for binding the progress to the upload and download progress of a session task or request operation. + */ +@interface UIProgressView (AFNetworking) + +///------------------------------------ +/// @name Setting Session Task Progress +///------------------------------------ + +/** + Binds the progress to the upload progress of the specified session task. + + @param task The session task. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task + animated:(BOOL)animated; +#endif + +/** + Binds the progress to the download progress of the specified session task. + + @param task The session task. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task + animated:(BOOL)animated; +#endif + +///------------------------------------ +/// @name Setting Session Task Progress +///------------------------------------ + +/** + Binds the progress to the upload progress of the specified request operation. + + @param operation The request operation. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +- (void)setProgressWithUploadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated; + +/** + Binds the progress to the download progress of the specified request operation. + + @param operation The request operation. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +- (void)setProgressWithDownloadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m new file mode 100644 index 0000000..ad2c280 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m @@ -0,0 +1,182 @@ +// UIProgressView+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "UIProgressView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLConnectionOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static void * AFTaskCountOfBytesSentContext = &AFTaskCountOfBytesSentContext; +static void * AFTaskCountOfBytesReceivedContext = &AFTaskCountOfBytesReceivedContext; + +@interface AFURLConnectionOperation (_UIProgressView) +@property (readwrite, nonatomic, copy) void (^uploadProgress)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +@property (readwrite, nonatomic, assign, setter = af_setUploadProgressAnimated:) BOOL af_uploadProgressAnimated; + +@property (readwrite, nonatomic, copy) void (^downloadProgress)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +@property (readwrite, nonatomic, assign, setter = af_setDownloadProgressAnimated:) BOOL af_downloadProgressAnimated; +@end + +@implementation AFURLConnectionOperation (_UIProgressView) +@dynamic uploadProgress; // Implemented in AFURLConnectionOperation +@dynamic af_uploadProgressAnimated; + +@dynamic downloadProgress; // Implemented in AFURLConnectionOperation +@dynamic af_downloadProgressAnimated; +@end + +#pragma mark - + +@implementation UIProgressView (AFNetworking) + +- (BOOL)af_uploadProgressAnimated { + return [(NSNumber *)objc_getAssociatedObject(self, @selector(af_uploadProgressAnimated)) boolValue]; +} + +- (void)af_setUploadProgressAnimated:(BOOL)animated { + objc_setAssociatedObject(self, @selector(af_uploadProgressAnimated), @(animated), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)af_downloadProgressAnimated { + return [(NSNumber *)objc_getAssociatedObject(self, @selector(af_downloadProgressAnimated)) boolValue]; +} + +- (void)af_setDownloadProgressAnimated:(BOOL)animated { + objc_setAssociatedObject(self, @selector(af_downloadProgressAnimated), @(animated), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task + animated:(BOOL)animated +{ + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + [task addObserver:self forKeyPath:@"countOfBytesSent" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + + [self af_setUploadProgressAnimated:animated]; +} + +- (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task + animated:(BOOL)animated +{ + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + [task addObserver:self forKeyPath:@"countOfBytesReceived" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + + [self af_setDownloadProgressAnimated:animated]; +} +#endif + +#pragma mark - + +- (void)setProgressWithUploadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated +{ + __weak __typeof(self)weakSelf = self; + void (^original)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) = [operation.uploadProgress copy]; + [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { + if (original) { + original(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (totalBytesExpectedToWrite > 0) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf setProgress:(totalBytesWritten / (totalBytesExpectedToWrite * 1.0f)) animated:animated]; + } + }); + }]; +} + +- (void)setProgressWithDownloadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated +{ + __weak __typeof(self)weakSelf = self; + void (^original)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) = [operation.downloadProgress copy]; + [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { + if (original) { + original(bytesRead, totalBytesRead, totalBytesExpectedToRead); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (totalBytesExpectedToRead > 0) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf setProgress:(totalBytesRead / (totalBytesExpectedToRead * 1.0f)) animated:animated]; + } + }); + }]; +} + +#pragma mark - NSKeyValueObserving + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(__unused NSDictionary *)change + context:(void *)context +{ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + if (context == AFTaskCountOfBytesSentContext || context == AFTaskCountOfBytesReceivedContext) { + if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesSent))]) { + if ([object countOfBytesExpectedToSend] > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setProgress:[object countOfBytesSent] / ([object countOfBytesExpectedToSend] * 1.0f) animated:self.af_uploadProgressAnimated]; + }); + } + } + + if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesReceived))]) { + if ([object countOfBytesExpectedToReceive] > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setProgress:[object countOfBytesReceived] / ([object countOfBytesExpectedToReceive] * 1.0f) animated:self.af_downloadProgressAnimated]; + }); + } + } + + if ([keyPath isEqualToString:NSStringFromSelector(@selector(state))]) { + if ([(NSURLSessionTask *)object state] == NSURLSessionTaskStateCompleted) { + @try { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(state))]; + + if (context == AFTaskCountOfBytesSentContext) { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesSent))]; + } + + if (context == AFTaskCountOfBytesReceivedContext) { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesReceived))]; + } + } + @catch (NSException * __unused exception) {} + } + } + } +#endif +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h new file mode 100644 index 0000000..a65e390 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1,68 @@ +// UIRefreshControl+AFNetworking.m +// +// Copyright (c) 2014 AFNetworking (http://afnetworking.com) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically beginning and ending refreshing depending on the loading state of a request operation or session task. + */ +@interface UIRefreshControl (AFNetworking) + +///----------------------------------- +/// @name Refreshing for Session Tasks +///----------------------------------- + +/** + Binds the refreshing state to the state of the specified task. + + @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task; +#endif + +///---------------------------------------- +/// @name Refreshing for Request Operations +///---------------------------------------- + +/** + Binds the refreshing state to the execution state of the specified operation. + + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m new file mode 100644 index 0000000..4c19245 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m @@ -0,0 +1,166 @@ +// UIRefreshControl+AFNetworking.m +// +// Copyright (c) 2014 AFNetworking (http://afnetworking.com) +// +// 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. + +#import "UIRefreshControl+AFNetworking.h" +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +@interface AFRefreshControlNotificationObserver : NSObject +@property (readonly, nonatomic, weak) UIRefreshControl *refreshControl; +- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task; +#endif +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +@implementation UIRefreshControl (AFNetworking) + +- (AFRefreshControlNotificationObserver *)af_notificationObserver { + AFRefreshControlNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver)); + if (notificationObserver == nil) { + notificationObserver = [[AFRefreshControlNotificationObserver alloc] initWithActivityRefreshControl:self]; + objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return notificationObserver; +} + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { + [[self af_notificationObserver] setRefreshingWithStateOfTask:task]; +} +#endif + +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation { + [[self af_notificationObserver] setRefreshingWithStateOfOperation:operation]; +} + +@end + +@implementation AFRefreshControlNotificationObserver + +- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl +{ + self = [super init]; + if (self) { + _refreshControl = refreshControl; + } + return self; +} + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + + if (task) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" + if (task.state == NSURLSessionTaskStateRunning) { + [self.refreshControl beginRefreshing]; + + [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingTaskDidResumeNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidCompleteNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidSuspendNotification object:task]; + } else { + [self.refreshControl endRefreshing]; + } +#pragma clang diagnostic pop + } +} +#endif + +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; + + if (operation) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" + if (![operation isFinished]) { + if ([operation isExecuting]) { + [self.refreshControl beginRefreshing]; + } else { + [self.refreshControl endRefreshing]; + } + + [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingOperationDidStartNotification object:operation]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingOperationDidFinishNotification object:operation]; + } +#pragma clang diagnostic pop + } +} + +#pragma mark - + +- (void)af_beginRefreshing { + dispatch_async(dispatch_get_main_queue(), ^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.refreshControl beginRefreshing]; +#pragma clang diagnostic pop + }); +} + +- (void)af_endRefreshing { + dispatch_async(dispatch_get_main_queue(), ^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.refreshControl endRefreshing]; +#pragma clang diagnostic pop + }); +} + +#pragma mark - + +- (void)dealloc { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; +#endif + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h new file mode 100644 index 0000000..5d61d6a --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1,86 @@ +// UIWebView+AFNetworking.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class AFHTTPRequestSerializer, AFHTTPResponseSerializer; +@protocol AFURLRequestSerialization, AFURLResponseSerialization; + +/** + This category adds methods to the UIKit framework's `UIWebView` class. The methods in this category provide increased control over the request cycle, including progress monitoring and success / failure handling. + + @discussion When using these category methods, make sure to assign `delegate` for the web view, which implements `–webView:shouldStartLoadWithRequest:navigationType:` appropriately. This allows for tapped links to be loaded through AFNetworking, and can ensure that `canGoBack` & `canGoForward` update their values correctly. + */ +@interface UIWebView (AFNetworking) + +/** + The request serializer used to serialize requests made with the `-loadRequest:...` category methods. By default, this is an instance of `AFHTTPRequestSerializer`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + The response serializer used to serialize responses made with the `-loadRequest:...` category methods. By default, this is an instance of `AFHTTPResponseSerializer`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + Asynchronously loads the specified request. + + @param request A URL request identifying the location of the content to load. This must not be `nil`. + @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + @param success A block object to be executed when the request finishes loading successfully. This block returns the HTML string to be loaded by the web view, and takes two arguments: the response, and the response string. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)loadRequest:(NSURLRequest *)request + progress:(nullable void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(nullable NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(nullable void (^)(NSError *error))failure; + +/** + Asynchronously loads the data associated with a particular request with a specified MIME type and text encoding. + + @param request A URL request identifying the location of the content to load. This must not be `nil`. + @param MIMEType The MIME type of the content. Defaults to the content type of the response if not specified. + @param textEncodingName The IANA encoding name, as in `utf-8` or `utf-16`. Defaults to the response text encoding if not specified. + @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + @param success A block object to be executed when the request finishes loading successfully. This block returns the data to be loaded by the web view and takes two arguments: the response, and the downloaded data. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)loadRequest:(NSURLRequest *)request + MIMEType:(nullable NSString *)MIMEType + textEncodingName:(nullable NSString *)textEncodingName + progress:(nullable void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(nullable NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(nullable void (^)(NSError *error))failure; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m new file mode 100644 index 0000000..93eacaa --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m @@ -0,0 +1,159 @@ +// UIWebView+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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. + +#import "UIWebView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" + +@interface UIWebView (_AFNetworking) +@property (readwrite, nonatomic, strong, setter = af_setHTTPRequestOperation:) AFHTTPRequestOperation *af_HTTPRequestOperation; +@end + +@implementation UIWebView (_AFNetworking) + +- (AFHTTPRequestOperation *)af_HTTPRequestOperation { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_HTTPRequestOperation)); +} + +- (void)af_setHTTPRequestOperation:(AFHTTPRequestOperation *)operation { + objc_setAssociatedObject(self, @selector(af_HTTPRequestOperation), operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIWebView (AFNetworking) + +- (AFHTTPRequestSerializer *)requestSerializer { + static AFHTTPRequestSerializer *_af_defaultRequestSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultRequestSerializer = [AFHTTPRequestSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(requestSerializer)) ?: _af_defaultRequestSerializer; +#pragma clang diagnostic pop +} + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + objc_setAssociatedObject(self, @selector(requestSerializer), requestSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (AFHTTPResponseSerializer *)responseSerializer { + static AFHTTPResponseSerializer *_af_defaultResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultResponseSerializer = [AFHTTPResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(responseSerializer)) ?: _af_defaultResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + objc_setAssociatedObject(self, @selector(responseSerializer), responseSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)loadRequest:(NSURLRequest *)request + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(void (^)(NSError *error))failure +{ + [self loadRequest:request MIMEType:nil textEncodingName:nil progress:progress success:^NSData *(NSHTTPURLResponse *response, NSData *data) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (response.textEncodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName); + if (encoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding); + } + } + + NSString *string = [[NSString alloc] initWithData:data encoding:stringEncoding]; + if (success) { + string = success(response, string); + } + + return [string dataUsingEncoding:stringEncoding]; + } failure:failure]; +} + +- (void)loadRequest:(NSURLRequest *)request + MIMEType:(NSString *)MIMEType + textEncodingName:(NSString *)textEncodingName + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(void (^)(NSError *error))failure +{ + NSParameterAssert(request); + + if (self.af_HTTPRequestOperation) { + [self.af_HTTPRequestOperation cancel]; + } + + request = [self.requestSerializer requestBySerializingRequest:request withParameters:nil error:nil]; + + self.af_HTTPRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + self.af_HTTPRequestOperation.responseSerializer = self.responseSerializer; + + __weak __typeof(self)weakSelf = self; + [self.af_HTTPRequestOperation setDownloadProgressBlock:progress]; + [self.af_HTTPRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id __unused responseObject) { + NSData *data = success ? success(operation.response, operation.responseData) : operation.responseData; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + __strong __typeof(weakSelf) strongSelf = weakSelf; + [strongSelf loadData:data MIMEType:(MIMEType ?: [operation.response MIMEType]) textEncodingName:(textEncodingName ?: [operation.response textEncodingName]) baseURL:[operation.response URL]]; + + if ([strongSelf.delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) { + [strongSelf.delegate webViewDidFinishLoad:strongSelf]; + } + +#pragma clang diagnostic pop + } failure:^(AFHTTPRequestOperation * __unused operation, NSError *error) { + if (failure) { + failure(error); + } + }]; + + [self.af_HTTPRequestOperation start]; + + if ([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) { + [self.delegate webViewDidStartLoad:self]; + } +} + +@end + +#endif diff --git a/Pods/Bolts/Bolts/Common/BFCancellationToken.h b/Pods/Bolts/Bolts/Common/BFCancellationToken.h new file mode 100644 index 0000000..90a20d7 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFCancellationToken.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import + +/*! + A block that will be called when a token is cancelled. + */ +typedef void(^BFCancellationBlock)(); + +/*! + The consumer view of a CancellationToken. + Propagates notification that operations should be canceled. + A BFCancellationToken has methods to inspect whether the token has been cancelled. + */ +@interface BFCancellationToken : NSObject + +/*! + Whether cancellation has been requested for this token source. + */ +@property (nonatomic, assign, readonly, getter=isCancellationRequested) BOOL cancellationRequested; + +/*! + Register a block to be notified when the token is cancelled. + If the token is already cancelled the delegate will be notified immediately. + */ +- (BFCancellationTokenRegistration *)registerCancellationObserverWithBlock:(BFCancellationBlock)block; + +@end diff --git a/Pods/Bolts/Bolts/Common/BFCancellationToken.m b/Pods/Bolts/Bolts/Common/BFCancellationToken.m new file mode 100644 index 0000000..b5006d0 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFCancellationToken.m @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFCancellationToken.h" +#import "BFCancellationTokenRegistration.h" + +@interface BFCancellationToken () + +@property (atomic, assign, getter=isCancellationRequested) BOOL cancellationRequested; +@property (nonatomic, strong) NSMutableArray *registrations; +@property (nonatomic, strong) NSObject *lock; +@property (nonatomic) BOOL disposed; + +@end + +@interface BFCancellationTokenRegistration (BFCancellationToken) + ++ (instancetype)registrationWithToken:(BFCancellationToken *)token delegate:(BFCancellationBlock)delegate; + +- (void)notifyDelegate; + +@end + +@implementation BFCancellationToken + +#pragma mark - Initializer + +- (instancetype)init { + if (self = [super init]) { + _registrations = [NSMutableArray array]; + _lock = [NSObject new]; + } + return self; +} + +#pragma mark - Custom Setters/Getters + +- (BOOL)isCancellationRequested { + @synchronized(self.lock) { + [self throwIfDisposed]; + return _cancellationRequested; + } +} + +- (void)cancel { + NSArray *registrations; + @synchronized(self.lock) { + [self throwIfDisposed]; + if (_cancellationRequested) { + return; + } + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(cancelPrivate) object:nil]; + _cancellationRequested = YES; + registrations = [self.registrations copy]; + } + + [self notifyCancellation:registrations]; +} + +- (void)notifyCancellation:(NSArray *)registrations { + for (BFCancellationTokenRegistration *registration in registrations) { + [registration notifyDelegate]; + } +} + +- (BFCancellationTokenRegistration *)registerCancellationObserverWithBlock:(BFCancellationBlock)block { + @synchronized(self.lock) { + BFCancellationTokenRegistration *registration = [BFCancellationTokenRegistration registrationWithToken:self delegate:[block copy]]; + [self.registrations addObject:registration]; + + return registration; + } +} + +- (void)unregisterRegistration:(BFCancellationTokenRegistration *)registration { + @synchronized(self.lock) { + [self throwIfDisposed]; + [self.registrations removeObject:registration]; + } +} + +// Delay on a non-public method to prevent interference with a user calling performSelector or +// cancelPreviousPerformRequestsWithTarget on the public method +- (void)cancelPrivate { + [self cancel]; +} + +- (void)cancelAfterDelay:(int)millis { + [self throwIfDisposed]; + if (millis < -1) { + [NSException raise:NSInvalidArgumentException format:@"Delay must be >= -1"]; + } + + if (millis == 0) { + [self cancel]; + return; + } + + @synchronized(self.lock) { + [self throwIfDisposed]; + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(cancelPrivate) object:nil]; + if (self.cancellationRequested) { + return; + } + + if (millis != -1) { + double delay = (double)millis / 1000; + [self performSelector:@selector(cancelPrivate) withObject:nil afterDelay:delay]; + } + } +} + +- (void)dispose { + @synchronized(self.lock) { + if (self.disposed) { + return; + } + self.disposed = YES; + for (BFCancellationTokenRegistration *registration in self.registrations) { + [registration dispose]; + } + [self.registrations removeAllObjects]; + } +} + +- (void)throwIfDisposed { + if (self.disposed) { + [NSException raise:NSInternalInconsistencyException format:@"Object already disposed"]; + } +} + +@end diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h b/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h new file mode 100644 index 0000000..3e7b711 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +/*! + Represents the registration of a cancellation observer with a cancellation token. + Can be used to unregister the observer at a later time. + */ +@interface BFCancellationTokenRegistration : NSObject + +/*! + Removes the cancellation observer registered with the token + and releases all resources associated with this registration. + */ +- (void)dispose; + +@end diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m b/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m new file mode 100644 index 0000000..9c8a7ae --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFCancellationTokenRegistration.h" + +#import "BFCancellationToken.h" + +@interface BFCancellationTokenRegistration () + +@property (nonatomic, weak) BFCancellationToken *token; +@property (nonatomic, strong) BFCancellationBlock cancellationObserverBlock; +@property (nonatomic, strong) NSObject *lock; +@property (nonatomic) BOOL disposed; + +@end + +@interface BFCancellationToken (BFCancellationTokenRegistration) + +- (void)unregisterRegistration:(BFCancellationTokenRegistration *)registration; + +@end + +@implementation BFCancellationTokenRegistration + ++ (instancetype)registrationWithToken:(BFCancellationToken *)token delegate:(BFCancellationBlock)delegate { + BFCancellationTokenRegistration *registration = [BFCancellationTokenRegistration new]; + registration.token = token; + registration.cancellationObserverBlock = delegate; + return registration; +} + +- (instancetype)init { + if (self = [super init]) { + _lock = [NSObject new]; + } + return self; +} + +- (void)dispose { + @synchronized(self.lock) { + if (self.disposed) { + return; + } + self.disposed = YES; + } + + BFCancellationToken *token = self.token; + if (token != nil) { + [token unregisterRegistration:self]; + self.token = nil; + } + self.cancellationObserverBlock = nil; +} + +- (void)notifyDelegate { + @synchronized(self.lock) { + [self throwIfDisposed]; + self.cancellationObserverBlock(); + } +} + +- (void)throwIfDisposed { + NSAssert(!self.disposed, @"Object already disposed"); +} + +@end diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h b/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h new file mode 100644 index 0000000..bd6e7a1 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@class BFCancellationToken; + +/*! + BFCancellationTokenSource represents the producer side of a CancellationToken. + Signals to a CancellationToken that it should be canceled. + It is a cancellation token that also has methods + for changing the state of a token by cancelling it. + */ +@interface BFCancellationTokenSource : NSObject + +/*! + Creates a new cancellation token source. + */ ++ (instancetype)cancellationTokenSource; + +/*! + The cancellation token associated with this CancellationTokenSource. + */ +@property (nonatomic, strong, readonly) BFCancellationToken *token; + +/*! + Whether cancellation has been requested for this token source. + */ +@property (nonatomic, assign, readonly, getter=isCancellationRequested) BOOL cancellationRequested; + +/*! + Cancels the token if it has not already been cancelled. + */ +- (void)cancel; + +/*! + Schedules a cancel operation on this CancellationTokenSource after the specified number of milliseconds. + @param millis The number of milliseconds to wait before completing the returned task. + If delay is `0` the cancel is executed immediately. If delay is `-1` any scheduled cancellation is stopped. + */ +- (void)cancelAfterDelay:(int)millis; + +/*! + Releases all resources associated with this token source, + including disposing of all registrations. + */ +- (void)dispose; + +@end diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m b/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m new file mode 100644 index 0000000..947f725 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFCancellationTokenSource.h" + +#import "BFCancellationToken.h" + +@interface BFCancellationToken (BFCancellationTokenSource) + +- (void)cancel; +- (void)cancelAfterDelay:(int)millis; + +- (void)dispose; +- (void)throwIfDisposed; + +@end + +@implementation BFCancellationTokenSource + +#pragma mark - Initializer + +- (instancetype)init { + self = [super init]; + if (!self) return nil; + + _token = [BFCancellationToken new]; + + return self; +} + ++ (instancetype)cancellationTokenSource { + return [BFCancellationTokenSource new]; +} + +#pragma mark - Custom Setters/Getters + +- (BOOL)isCancellationRequested { + return _token.isCancellationRequested; +} + +- (void)cancel { + [_token cancel]; +} + +- (void)cancelAfterDelay:(int)millis { + [_token cancelAfterDelay:millis]; +} + +- (void)dispose { + [_token dispose]; +} + +@end diff --git a/Pods/Bolts/Bolts/Common/BFDefines.h b/Pods/Bolts/Bolts/Common/BFDefines.h new file mode 100644 index 0000000..cf7dcdf --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFDefines.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#if __has_feature(objc_generics) || __has_extension(objc_generics) +# define BF_GENERIC(type) +#else +# define BF_GENERIC(type) +# define BFGenericType id +#endif diff --git a/Pods/Bolts/Bolts/Common/BFExecutor.h b/Pods/Bolts/Bolts/Common/BFExecutor.h new file mode 100644 index 0000000..02af9ba --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFExecutor.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +/*! + An object that can run a given block. + */ +@interface BFExecutor : NSObject + +/*! + Returns a default executor, which runs continuations immediately until the call stack gets too + deep, then dispatches to a new GCD queue. + */ ++ (instancetype)defaultExecutor; + +/*! + Returns an executor that runs continuations on the thread where the previous task was completed. + */ ++ (instancetype)immediateExecutor; + +/*! + Returns an executor that runs continuations on the main thread. + */ ++ (instancetype)mainThreadExecutor; + +/*! + Returns a new executor that uses the given block to execute continuations. + @param block The block to use. + */ ++ (instancetype)executorWithBlock:(void(^)(void(^block)()))block; + +/*! + Returns a new executor that runs continuations on the given queue. + @param queue The instance of `dispatch_queue_t` to dispatch all continuations onto. + */ ++ (instancetype)executorWithDispatchQueue:(dispatch_queue_t)queue; + +/*! + Returns a new executor that runs continuations on the given queue. + @param queue The instance of `NSOperationQueue` to run all continuations on. + */ ++ (instancetype)executorWithOperationQueue:(NSOperationQueue *)queue; + +/*! + Runs the given block using this executor's particular strategy. + @param block The block to execute. + */ +- (void)execute:(void(^)())block; + +@end diff --git a/Pods/Bolts/Bolts/Common/BFExecutor.m b/Pods/Bolts/Bolts/Common/BFExecutor.m new file mode 100644 index 0000000..292e27c --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFExecutor.m @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFExecutor.h" + +@interface BFExecutor () + +@property (nonatomic, copy) void(^block)(void(^block)()); + +@end + +@implementation BFExecutor + +#pragma mark - Executor methods + ++ (instancetype)defaultExecutor { + static BFExecutor *defaultExecutor = NULL; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + defaultExecutor = [self executorWithBlock:^void(void(^block)()) { + static const NSString *BFTaskDepthKey = @"BFTaskDepth"; + static const int BFTaskDefaultExecutorMaxDepth = 20; + + // We prefer to run everything possible immediately, so that there is callstack information + // when debugging. However, we don't want the stack to get too deep, so if the number of + // recursive calls to this method exceeds a certain depth, we dispatch to another GCD queue. + NSMutableDictionary *threadLocal = [[NSThread currentThread] threadDictionary]; + NSNumber *depth = threadLocal[BFTaskDepthKey]; + if (!depth) { + depth = @0; + } + if (depth.intValue > BFTaskDefaultExecutorMaxDepth) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block); + } else { + NSNumber *previousDepth = depth; + threadLocal[BFTaskDepthKey] = @(previousDepth.intValue + 1); + @try { + block(); + } @finally { + threadLocal[BFTaskDepthKey] = previousDepth; + } + } + }]; + }); + return defaultExecutor; +} + ++ (instancetype)immediateExecutor { + static BFExecutor *immediateExecutor = NULL; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + immediateExecutor = [self executorWithBlock:^void(void(^block)()) { + block(); + }]; + }); + return immediateExecutor; +} + ++ (instancetype)mainThreadExecutor { + static BFExecutor *mainThreadExecutor = NULL; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + mainThreadExecutor = [self executorWithBlock:^void(void(^block)()) { + if (![NSThread isMainThread]) { + dispatch_async(dispatch_get_main_queue(), block); + } else { + block(); + } + }]; + }); + return mainThreadExecutor; +} + ++ (instancetype)executorWithBlock:(void(^)(void(^block)()))block { + return [[self alloc] initWithBlock:block]; +} + ++ (instancetype)executorWithDispatchQueue:(dispatch_queue_t)queue { + return [self executorWithBlock:^void(void(^block)()) { + dispatch_async(queue, block); + }]; +} + ++ (instancetype)executorWithOperationQueue:(NSOperationQueue *)queue { + return [self executorWithBlock:^void(void(^block)()) { + [queue addOperation:[NSBlockOperation blockOperationWithBlock:block]]; + }]; +} + +#pragma mark - Initializer + +- (instancetype)initWithBlock:(void(^)(void(^block)()))block { + if (self = [super init]) { + _block = block; + } + return self; +} + +#pragma mark - Execution + +- (void)execute:(void(^)())block { + self.block(block); +} + +@end diff --git a/Pods/Bolts/Bolts/Common/BFTask.h b/Pods/Bolts/Bolts/Common/BFTask.h new file mode 100644 index 0000000..827071d --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFTask.h @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import +#import + +/*! + Error domain used if there was multiple errors on . + */ +extern NSString *const BFTaskErrorDomain; + +/*! + An exception that is thrown if there was multiple exceptions on . + */ +extern NSString *const BFTaskMultipleExceptionsException; + +@class BFExecutor; +@class BFTask; + +/*! + The consumer view of a Task. A BFTask has methods to + inspect the state of the task, and to add continuations to + be run once the task is complete. + */ +@interface BFTask BF_GENERIC(__covariant BFGenericType) : NSObject + +/*! + A block that can act as a continuation for a task. + */ +typedef id(^BFContinuationBlock)(BFTask BF_GENERIC(BFGenericType) *task); + +/*! + Creates a task that is already completed with the given result. + @param result The result for the task. + */ ++ (instancetype)taskWithResult:(BFGenericType)result; + +/*! + Creates a task that is already completed with the given error. + @param error The error for the task. + */ ++ (instancetype)taskWithError:(NSError *)error; + +/*! + Creates a task that is already completed with the given exception. + @param exception The exception for the task. + */ ++ (instancetype)taskWithException:(NSException *)exception; + +/*! + Creates a task that is already cancelled. + */ ++ (instancetype)cancelledTask; + +/*! + Returns a task that will be completed (with result == nil) once + all of the input tasks have completed. + @param tasks An `NSArray` of the tasks to use as an input. + */ ++ (instancetype)taskForCompletionOfAllTasks:(NSArray *)tasks; + +/*! + Returns a task that will be completed once all of the input tasks have completed. + If all tasks complete successfully without being faulted or cancelled the result will be + an `NSArray` of all task results in the order they were provided. + @param tasks An `NSArray` of the tasks to use as an input. + */ ++ (instancetype)taskForCompletionOfAllTasksWithResults:(NSArray *)tasks; + +/*! + Returns a task that will be completed a certain amount of time in the future. + @param millis The approximate number of milliseconds to wait before the + task will be finished (with result == nil). + */ ++ (instancetype)taskWithDelay:(int)millis; + +/*! + Returns a task that will be completed a certain amount of time in the future. + @param millis The approximate number of milliseconds to wait before the + task will be finished (with result == nil). + @param token The cancellation token (optional). + */ ++ (instancetype)taskWithDelay:(int)millis + cancellationToken:(BFCancellationToken *)token; + +/*! + Returns a task that will be completed after the given block completes with + the specified executor. + @param executor A BFExecutor responsible for determining how the + continuation block will be run. + @param block The block to immediately schedule to run with the given executor. + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ ++ (instancetype)taskFromExecutor:(BFExecutor *)executor + withBlock:(id (^)())block; + +// Properties that will be set on the task once it is completed. + +/*! + The result of a successful task. + */ +@property (nonatomic, strong, readonly) BFGenericType result; + +/*! + The error of a failed task. + */ +@property (nonatomic, strong, readonly) NSError *error; + +/*! + The exception of a failed task. + */ +@property (nonatomic, strong, readonly) NSException *exception; + +/*! + Whether this task has been cancelled. + */ +@property (nonatomic, assign, readonly, getter=isCancelled) BOOL cancelled; + +/*! + Whether this task has completed due to an error or exception. + */ +@property (nonatomic, assign, readonly, getter=isFaulted) BOOL faulted; + +/*! + Whether this task has completed. + */ +@property (nonatomic, assign, readonly, getter=isCompleted) BOOL completed; + +/*! + Enqueues the given block to be run once this task is complete. + This method uses a default execution strategy. The block will be + run on the thread where the previous task completes, unless the + the stack depth is too deep, in which case it will be run on a + dispatch queue with default priority. + @param block The block to be run once this task is complete. + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithBlock:(BFContinuationBlock)block; + +/*! + Enqueues the given block to be run once this task is complete. + This method uses a default execution strategy. The block will be + run on the thread where the previous task completes, unless the + the stack depth is too deep, in which case it will be run on a + dispatch queue with default priority. + @param block The block to be run once this task is complete. + @param cancellationToken The cancellation token (optional). + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithBlock:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken; + +/*! + Enqueues the given block to be run once this task is complete. + @param executor A BFExecutor responsible for determining how the + continuation block will be run. + @param block The block to be run once this task is complete. + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithExecutor:(BFExecutor *)executor + withBlock:(BFContinuationBlock)block; +/*! + Enqueues the given block to be run once this task is complete. + @param executor A BFExecutor responsible for determining how the + continuation block will be run. + @param block The block to be run once this task is complete. + @param cancellationToken The cancellation token (optional). + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + his method will not be completed until that task is completed. + */ +- (instancetype)continueWithExecutor:(BFExecutor *)executor + block:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken; + +/*! + Identical to continueWithBlock:, except that the block is only run + if this task did not produce a cancellation, error, or exception. + If it did, then the failure will be propagated to the returned + task. + @param block The block to be run once this task is complete. + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithSuccessBlock:(BFContinuationBlock)block; + +/*! + Identical to continueWithBlock:, except that the block is only run + if this task did not produce a cancellation, error, or exception. + If it did, then the failure will be propagated to the returned + task. + @param block The block to be run once this task is complete. + @param cancellationToken The cancellation token (optional). + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithSuccessBlock:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken; + +/*! + Identical to continueWithExecutor:withBlock:, except that the block + is only run if this task did not produce a cancellation, error, or + exception. If it did, then the failure will be propagated to the + returned task. + @param executor A BFExecutor responsible for determining how the + continuation block will be run. + @param block The block to be run once this task is complete. + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithExecutor:(BFExecutor *)executor + withSuccessBlock:(BFContinuationBlock)block; + +/*! + Identical to continueWithExecutor:withBlock:, except that the block + is only run if this task did not produce a cancellation, error, or + exception. If it did, then the failure will be propagated to the + returned task. + @param executor A BFExecutor responsible for determining how the + continuation block will be run. + @param block The block to be run once this task is complete. + @param cancellationToken The cancellation token (optional). + @returns A task that will be completed after block has run. + If block returns a BFTask, then the task returned from + this method will not be completed until that task is completed. + */ +- (instancetype)continueWithExecutor:(BFExecutor *)executor + successBlock:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken; + +/*! + Waits until this operation is completed. + This method is inefficient and consumes a thread resource while + it's running. It should be avoided. This method logs a warning + message if it is used on the main thread. + */ +- (void)waitUntilFinished; + +@end diff --git a/Pods/Bolts/Bolts/Common/BFTask.m b/Pods/Bolts/Bolts/Common/BFTask.m new file mode 100644 index 0000000..4985cfa --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFTask.m @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFTask.h" + +#import + +#import "Bolts.h" + +__attribute__ ((noinline)) void warnBlockingOperationOnMainThread() { + NSLog(@"Warning: A long-running operation is being executed on the main thread. \n" + " Break on warnBlockingOperationOnMainThread() to debug."); +} + +NSString *const BFTaskErrorDomain = @"bolts"; +NSString *const BFTaskMultipleExceptionsException = @"BFMultipleExceptionsException"; + +@interface BFTask () { + id _result; + NSError *_error; + NSException *_exception; +} + +@property (atomic, assign, readwrite, getter=isCancelled) BOOL cancelled; +@property (atomic, assign, readwrite, getter=isFaulted) BOOL faulted; +@property (atomic, assign, readwrite, getter=isCompleted) BOOL completed; + +@property (nonatomic, strong) NSObject *lock; +@property (nonatomic, strong) NSCondition *condition; +@property (nonatomic, strong) NSMutableArray *callbacks; + +@end + +@implementation BFTask + +#pragma mark - Initializer + +- (instancetype)init { + if (self = [super init]) { + _lock = [[NSObject alloc] init]; + _condition = [[NSCondition alloc] init]; + _callbacks = [NSMutableArray array]; + } + return self; +} + +#pragma mark - Task Class methods + ++ (instancetype)taskWithResult:(id)result { + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + tcs.result = result; + return tcs.task; +} + ++ (instancetype)taskWithError:(NSError *)error { + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + tcs.error = error; + return tcs.task; +} + ++ (instancetype)taskWithException:(NSException *)exception { + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + tcs.exception = exception; + return tcs.task; +} + ++ (instancetype)cancelledTask { + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + [tcs cancel]; + return tcs.task; +} + ++ (instancetype)taskForCompletionOfAllTasks:(NSArray *)tasks { + __block int32_t total = (int32_t)tasks.count; + if (total == 0) { + return [self taskWithResult:nil]; + } + + __block int32_t cancelled = 0; + NSObject *lock = [[NSObject alloc] init]; + NSMutableArray *errors = [NSMutableArray array]; + NSMutableArray *exceptions = [NSMutableArray array]; + + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + for (BFTask *task in tasks) { + [task continueWithBlock:^id(BFTask *task) { + if (task.exception) { + @synchronized (lock) { + [exceptions addObject:task.exception]; + } + } else if (task.error) { + @synchronized (lock) { + [errors addObject:task.error]; + } + } else if (task.cancelled) { + OSAtomicIncrement32(&cancelled); + } + + if (OSAtomicDecrement32(&total) == 0) { + if (exceptions.count > 0) { + if (exceptions.count == 1) { + tcs.exception = [exceptions firstObject]; + } else { + NSException *exception = + [NSException exceptionWithName:BFTaskMultipleExceptionsException + reason:@"There were multiple exceptions." + userInfo:@{ @"exceptions": exceptions }]; + tcs.exception = exception; + } + } else if (errors.count > 0) { + if (errors.count == 1) { + tcs.error = [errors firstObject]; + } else { + NSError *error = [NSError errorWithDomain:BFTaskErrorDomain + code:kBFMultipleErrorsError + userInfo:@{ @"errors": errors }]; + tcs.error = error; + } + } else if (cancelled > 0) { + [tcs cancel]; + } else { + tcs.result = nil; + } + } + return nil; + }]; + } + return tcs.task; +} + ++ (instancetype)taskForCompletionOfAllTasksWithResults:(NSArray *)tasks { + return [[self taskForCompletionOfAllTasks:tasks] continueWithSuccessBlock:^id(BFTask *task) { + return [tasks valueForKey:@"result"]; + }]; +} + ++ (instancetype)taskWithDelay:(int)millis { + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, millis * NSEC_PER_MSEC); + dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ + tcs.result = nil; + }); + return tcs.task; +} + ++ (instancetype)taskWithDelay:(int)millis + cancellationToken:(BFCancellationToken *)token { + if (token.cancellationRequested) { + return [BFTask cancelledTask]; + } + + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, millis * NSEC_PER_MSEC); + dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ + if (token.cancellationRequested) { + [tcs cancel]; + return; + } + tcs.result = nil; + }); + return tcs.task; +} + ++ (instancetype)taskFromExecutor:(BFExecutor *)executor + withBlock:(id (^)())block { + return [[self taskWithResult:nil] continueWithExecutor:executor withBlock:^id(BFTask *task) { + return block(); + }]; +} + +#pragma mark - Custom Setters/Getters + +- (id)result { + @synchronized(self.lock) { + return _result; + } +} + +- (void)setResult:(id)result { + if (![self trySetResult:result]) { + [NSException raise:NSInternalInconsistencyException + format:@"Cannot set the result on a completed task."]; + } +} + +- (BOOL)trySetResult:(id)result { + @synchronized(self.lock) { + if (self.completed) { + return NO; + } + self.completed = YES; + _result = result; + [self runContinuations]; + return YES; + } +} + +- (NSError *)error { + @synchronized(self.lock) { + return _error; + } +} + +- (void)setError:(NSError *)error { + if (![self trySetError:error]) { + [NSException raise:NSInternalInconsistencyException + format:@"Cannot set the error on a completed task."]; + } +} + +- (BOOL)trySetError:(NSError *)error { + @synchronized(self.lock) { + if (self.completed) { + return NO; + } + self.completed = YES; + self.faulted = YES; + _error = error; + [self runContinuations]; + return YES; + } +} + +- (NSException *)exception { + @synchronized(self.lock) { + return _exception; + } +} + +- (void)setException:(NSException *)exception { + if (![self trySetException:exception]) { + [NSException raise:NSInternalInconsistencyException + format:@"Cannot set the exception on a completed task."]; + } +} + +- (BOOL)trySetException:(NSException *)exception { + @synchronized(self.lock) { + if (self.completed) { + return NO; + } + self.completed = YES; + self.faulted = YES; + _exception = exception; + [self runContinuations]; + return YES; + } +} + +- (BOOL)isCancelled { + @synchronized(self.lock) { + return _cancelled; + } +} + +- (BOOL)isFaulted { + @synchronized(self.lock) { + return _faulted; + } +} + +- (void)cancel { + @synchronized(self.lock) { + if (![self trySetCancelled]) { + [NSException raise:NSInternalInconsistencyException + format:@"Cannot cancel a completed task."]; + } + } +} + +- (BOOL)trySetCancelled { + @synchronized(self.lock) { + if (self.completed) { + return NO; + } + self.completed = YES; + self.cancelled = YES; + [self runContinuations]; + return YES; + } +} + +- (BOOL)isCompleted { + @synchronized(self.lock) { + return _completed; + } +} + +- (void)setCompleted { + @synchronized(self.lock) { + _completed = YES; + } +} + +- (void)runContinuations { + @synchronized(self.lock) { + [self.condition lock]; + [self.condition broadcast]; + [self.condition unlock]; + for (void (^callback)() in self.callbacks) { + callback(); + } + [self.callbacks removeAllObjects]; + } +} + +#pragma mark - Chaining methods + +- (instancetype)continueWithExecutor:(BFExecutor *)executor + withBlock:(BFContinuationBlock)block { + return [self continueWithExecutor:executor block:block cancellationToken:nil]; +} + +- (instancetype)continueWithExecutor:(BFExecutor *)executor + block:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken { + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + + // Capture all of the state that needs to used when the continuation is complete. + void (^wrappedBlock)() = ^() { + [executor execute:^{ + if (cancellationToken.cancellationRequested) { + [tcs cancel]; + return; + } + + id result = nil; + @try { + result = block(self); + } @catch (NSException *exception) { + tcs.exception = exception; + return; + } + + if ([result isKindOfClass:[BFTask class]]) { + + id (^setupWithTask) (BFTask *) = ^id(BFTask *task) { + if (cancellationToken.cancellationRequested || task.cancelled) { + [tcs cancel]; + } else if (task.exception) { + tcs.exception = task.exception; + } else if (task.error) { + tcs.error = task.error; + } else { + tcs.result = task.result; + } + return nil; + }; + + BFTask *resultTask = (BFTask *)result; + + if (resultTask.completed) { + setupWithTask(resultTask); + } else { + [resultTask continueWithBlock:setupWithTask]; + } + + } else { + tcs.result = result; + } + }]; + }; + + BOOL completed; + @synchronized(self.lock) { + completed = self.completed; + if (!completed) { + [self.callbacks addObject:[wrappedBlock copy]]; + } + } + if (completed) { + wrappedBlock(); + } + + return tcs.task; +} + +- (instancetype)continueWithBlock:(BFContinuationBlock)block { + return [self continueWithExecutor:[BFExecutor defaultExecutor] block:block cancellationToken:nil]; +} + +- (instancetype)continueWithBlock:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken { + return [self continueWithExecutor:[BFExecutor defaultExecutor] block:block cancellationToken:cancellationToken]; +} + +- (instancetype)continueWithExecutor:(BFExecutor *)executor + withSuccessBlock:(BFContinuationBlock)block { + return [self continueWithExecutor:executor successBlock:block cancellationToken:nil]; +} + +- (instancetype)continueWithExecutor:(BFExecutor *)executor + successBlock:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken { + if (cancellationToken.cancellationRequested) { + return [BFTask cancelledTask]; + } + + return [self continueWithExecutor:executor block:^id(BFTask *task) { + if (task.faulted || task.cancelled) { + return task; + } else { + return block(task); + } + } cancellationToken:cancellationToken]; +} + +- (instancetype)continueWithSuccessBlock:(BFContinuationBlock)block { + return [self continueWithExecutor:[BFExecutor defaultExecutor] successBlock:block cancellationToken:nil]; +} + +- (instancetype)continueWithSuccessBlock:(BFContinuationBlock)block + cancellationToken:(BFCancellationToken *)cancellationToken { + return [self continueWithExecutor:[BFExecutor defaultExecutor] successBlock:block cancellationToken:cancellationToken]; +} + +#pragma mark - Syncing Task (Avoid it) + +- (void)warnOperationOnMainThread { + warnBlockingOperationOnMainThread(); +} + +- (void)waitUntilFinished { + if ([NSThread isMainThread]) { + [self warnOperationOnMainThread]; + } + + @synchronized(self.lock) { + if (self.completed) { + return; + } + [self.condition lock]; + } + [self.condition wait]; + [self.condition unlock]; +} + +#pragma mark - NSObject + +- (NSString *)description { + // Acquire the data from the locked properties + BOOL completed; + BOOL cancelled; + BOOL faulted; + + @synchronized(self.lock) { + completed = self.completed; + cancelled = self.cancelled; + faulted = self.faulted; + } + + // Description string includes status information and, if available, the + // result since in some ways this is what a promise actually "is". + return [NSString stringWithFormat:@"<%@: %p; completed = %@; cancelled = %@; faulted = %@;%@>", + NSStringFromClass([self class]), + self, + completed ? @"YES" : @"NO", + cancelled ? @"YES" : @"NO", + faulted ? @"YES" : @"NO", + completed ? [NSString stringWithFormat:@" result:%@", _result] : @""]; +} + +@end diff --git a/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h b/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h new file mode 100644 index 0000000..23366c1 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import + +@class BFTask BF_GENERIC(BFGenericType); + +/*! + A BFTaskCompletionSource represents the producer side of tasks. + It is a task that also has methods for changing the state of the + task by settings its completion values. + */ +@interface BFTaskCompletionSource BF_GENERIC(__covariant BFGenericType) : NSObject + +/*! + Creates a new unfinished task. + */ ++ (instancetype)taskCompletionSource; + +/*! + The task associated with this TaskCompletionSource. + */ +@property (nonatomic, strong, readonly) BFTask BF_GENERIC(BFGenericType) *task; + +/*! + Completes the task by setting the result. + Attempting to set this for a completed task will raise an exception. + @param result The result of the task. + */ +- (void)setResult:(BFGenericType)result; + +/*! + Completes the task by setting the error. + Attempting to set this for a completed task will raise an exception. + @param error The error for the task. + */ +- (void)setError:(NSError *)error; + +/*! + Completes the task by setting an exception. + Attempting to set this for a completed task will raise an exception. + @param exception The exception for the task. + */ +- (void)setException:(NSException *)exception; + +/*! + Completes the task by marking it as cancelled. + Attempting to set this for a completed task will raise an exception. + */ +- (void)cancel; + +/*! + Sets the result of the task if it wasn't already completed. + @returns whether the new value was set. + */ +- (BOOL)trySetResult:(BFGenericType)result; + +/*! + Sets the error of the task if it wasn't already completed. + @param error The error for the task. + @returns whether the new value was set. + */ +- (BOOL)trySetError:(NSError *)error; + +/*! + Sets the exception of the task if it wasn't already completed. + @param exception The exception for the task. + @returns whether the new value was set. + */ +- (BOOL)trySetException:(NSException *)exception; + +/*! + Sets the cancellation state of the task if it wasn't already completed. + @returns whether the new value was set. + */ +- (BOOL)trySetCancelled; + +@end diff --git a/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m b/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m new file mode 100644 index 0000000..bd66835 --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFTaskCompletionSource.h" + +#import "BFTask.h" + +@interface BFTaskCompletionSource () + +@property (nonatomic, strong, readwrite) BFTask *task; + +@end + +@interface BFTask (BFTaskCompletionSource) + +- (void)setResult:(id)result; +- (void)setError:(NSError *)error; +- (void)setException:(NSException *)exception; +- (void)cancel; +- (BOOL)trySetResult:(id)result; +- (BOOL)trySetError:(NSError *)error; +- (BOOL)trySetException:(NSException *)exception; +- (BOOL)trySetCancelled; + +@end + +@implementation BFTaskCompletionSource + +#pragma mark - Initializer + ++ (instancetype)taskCompletionSource { + return [[self alloc] init]; +} + +- (instancetype)init { + if (self = [super init]) { + _task = [[BFTask alloc] init]; + } + return self; +} + +#pragma mark - Custom Setters/Getters + +- (void)setResult:(id)result { + [self.task setResult:result]; +} + +- (void)setError:(NSError *)error { + [self.task setError:error]; +} + +- (void)setException:(NSException *)exception { + [self.task setException:exception]; +} + +- (void)cancel { + [self.task cancel]; +} + +- (BOOL)trySetResult:(id)result { + return [self.task trySetResult:result]; +} + +- (BOOL)trySetError:(NSError *)error { + return [self.task trySetError:error]; +} + +- (BOOL)trySetException:(NSException *)exception { + return [self.task trySetException:exception]; +} + +- (BOOL)trySetCancelled { + return [self.task trySetCancelled]; +} + +@end diff --git a/Pods/Bolts/Bolts/Common/Bolts.h b/Pods/Bolts/Bolts/Common/Bolts.h new file mode 100644 index 0000000..35d6c7c --- /dev/null +++ b/Pods/Bolts/Bolts/Common/Bolts.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import +#import +#import +#import +#import +#import +#import + +#if __has_include() && TARGET_OS_IPHONE && !TARGET_OS_WATCH && !TARGET_OS_TV +#import +#import +#import +#import +#import +#import +#import +#import +#import +#endif + +/*! @abstract 80175001: There were multiple errors. */ +extern NSInteger const kBFMultipleErrorsError; + +@interface Bolts : NSObject + +/*! + Returns the version of the Bolts Framework as an NSString. + @returns The NSString representation of the current version. + */ ++ (NSString *)version; + +@end diff --git a/Pods/Bolts/Bolts/Common/Bolts.m b/Pods/Bolts/Bolts/Common/Bolts.m new file mode 100644 index 0000000..9a3e75c --- /dev/null +++ b/Pods/Bolts/Bolts/Common/Bolts.m @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "Bolts.h" + +NSInteger const kBFMultipleErrorsError = 80175001; + +@implementation Bolts + ++ (NSString *)version { + return BOLTS_VERSION; +} + +@end diff --git a/Pods/Bolts/Bolts/Common/BoltsVersion.h b/Pods/Bolts/Bolts/Common/BoltsVersion.h new file mode 100644 index 0000000..afb6fcb --- /dev/null +++ b/Pods/Bolts/Bolts/Common/BoltsVersion.h @@ -0,0 +1 @@ +#define BOLTS_VERSION @"1.3.0" diff --git a/Pods/Bolts/Bolts/iOS/BFAppLink.h b/Pods/Bolts/Bolts/iOS/BFAppLink.h new file mode 100644 index 0000000..aa89efc --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLink.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +/*! The version of the App Link protocol that this library supports */ +FOUNDATION_EXPORT NSString *const BFAppLinkVersion; + +/*! + Contains App Link metadata relevant for navigation on this device + derived from the HTML at a given URL. + */ +@interface BFAppLink : NSObject + +/*! + Creates a BFAppLink with the given list of BFAppLinkTargets and target URL. + + Generally, this will only be used by implementers of the BFAppLinkResolving protocol, + as these implementers will produce App Link metadata for a given URL. + + @param sourceURL the URL from which this App Link is derived + @param targets an ordered list of BFAppLinkTargets for this platform derived + from App Link metadata. + @param webURL the fallback web URL, if any, for the app link. + */ ++ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL + targets:(NSArray *)targets + webURL:(NSURL *)webURL; + +/*! The URL from which this BFAppLink was derived */ +@property (nonatomic, strong, readonly) NSURL *sourceURL; + +/*! + The ordered list of targets applicable to this platform that will be used + for navigation. + */ +@property (nonatomic, copy, readonly) NSArray *targets; + +/*! The fallback web URL to use if no targets are installed on this device. */ +@property (nonatomic, strong, readonly) NSURL *webURL; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLink.m b/Pods/Bolts/Bolts/iOS/BFAppLink.m new file mode 100644 index 0000000..77fd311 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLink.m @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFAppLink_Internal.h" + +NSString *const BFAppLinkDataParameterName = @"al_applink_data"; +NSString *const BFAppLinkTargetKeyName = @"target_url"; +NSString *const BFAppLinkUserAgentKeyName = @"user_agent"; +NSString *const BFAppLinkExtrasKeyName = @"extras"; +NSString *const BFAppLinkRefererAppLink = @"referer_app_link"; +NSString *const BFAppLinkRefererAppName = @"app_name"; +NSString *const BFAppLinkRefererUrl = @"url"; +NSString *const BFAppLinkVersionKeyName = @"version"; +NSString *const BFAppLinkVersion = @"1.0"; + +@interface BFAppLink () + +@property (nonatomic, strong, readwrite) NSURL *sourceURL; +@property (nonatomic, copy, readwrite) NSArray *targets; +@property (nonatomic, strong, readwrite) NSURL *webURL; + +@property (nonatomic, assign, readwrite, getter=isBackToReferrer) BOOL backToReferrer; + +@end + +@implementation BFAppLink + ++ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL + targets:(NSArray *)targets + webURL:(NSURL *)webURL + isBackToReferrer:(BOOL)isBackToReferrer { + BFAppLink *link = [[self alloc] initWithIsBackToReferrer:isBackToReferrer]; + link.sourceURL = sourceURL; + link.targets = [targets copy]; + link.webURL = webURL; + return link; +} + ++ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL + targets:(NSArray *)targets + webURL:(NSURL *)webURL { + return [self appLinkWithSourceURL:sourceURL + targets:targets + webURL:webURL + isBackToReferrer:NO]; +} + +- (BFAppLink *)initWithIsBackToReferrer:(BOOL)backToReferrer { + if ((self = [super init])) { + _backToReferrer = backToReferrer; + } + return self; +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h b/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h new file mode 100644 index 0000000..d459f72 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import + +/*! + The result of calling navigate on a BFAppLinkNavigation + */ +typedef NS_ENUM(NSInteger, BFAppLinkNavigationType) { + /*! Indicates that the navigation failed and no app was opened */ + BFAppLinkNavigationTypeFailure, + /*! Indicates that the navigation succeeded by opening the URL in the browser */ + BFAppLinkNavigationTypeBrowser, + /*! Indicates that the navigation succeeded by opening the URL in an app on the device */ + BFAppLinkNavigationTypeApp +}; + +@protocol BFAppLinkResolving; +@class BFTask; + +/*! + Represents a pending request to navigate to an App Link. Most developers will + simply use navigateToURLInBackground: to open a URL, but developers can build + custom requests with additional navigation and app data attached to them by + creating BFAppLinkNavigations themselves. + */ +@interface BFAppLinkNavigation : NSObject + +/*! + The extras for the AppLinkNavigation. This will generally contain application-specific + data that should be passed along with the request, such as advertiser or affiliate IDs or + other such metadata relevant on this device. + */ +@property (nonatomic, copy, readonly) NSDictionary *extras; + +/*! + The al_applink_data for the AppLinkNavigation. This will generally contain data common to + navigation attempts such as back-links, user agents, and other information that may be used + in routing and handling an App Link request. + */ +@property (nonatomic, copy, readonly) NSDictionary *appLinkData; + +/*! The AppLink to navigate to */ +@property (nonatomic, strong, readonly) BFAppLink *appLink; + +/*! Creates an AppLinkNavigation with the given link, extras, and App Link data */ ++ (instancetype)navigationWithAppLink:(BFAppLink *)appLink + extras:(NSDictionary *)extras + appLinkData:(NSDictionary *)appLinkData; + +/*! Performs the navigation */ +- (BFAppLinkNavigationType)navigate:(NSError **)error; + +/*! Returns a BFAppLink for the given URL */ ++ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination; + +/*! Returns a BFAppLink for the given URL using the given App Link resolution strategy */ ++ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination resolver:(id)resolver; + +/*! Navigates to a BFAppLink and returns whether it opened in-app or in-browser */ ++ (BFAppLinkNavigationType)navigateToAppLink:(BFAppLink *)link error:(NSError **)error; + +/*! Navigates to a URL (an asynchronous action) and returns a BFNavigationType */ ++ (BFTask *)navigateToURLInBackground:(NSURL *)destination; + +/*! + Navigates to a URL (an asynchronous action) using the given App Link resolution + strategy and returns a BFNavigationType + */ ++ (BFTask *)navigateToURLInBackground:(NSURL *)destination resolver:(id)resolver; + +/*! + Gets the default resolver to be used for App Link resolution. If the developer has not set one explicitly, + a basic, built-in resolver will be used. + */ ++ (id)defaultResolver; + +/*! + Sets the default resolver to be used for App Link resolution. Setting this to nil will revert the + default resolver to the basic, built-in resolver provided by Bolts. + */ ++ (void)setDefaultResolver:(id)resolver; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m b/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m new file mode 100644 index 0000000..5d287be --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import "BFAppLinkNavigation.h" +#import "BFTaskCompletionSource.h" +#import "BFAppLinkTarget.h" +#import "BoltsVersion.h" +#import "BFWebViewAppLinkResolver.h" +#import "BFExecutor.h" +#import "BFTask.h" +#import "BFMeasurementEvent_Internal.h" +#import "BFAppLink_Internal.h" + +FOUNDATION_EXPORT NSString *const BFAppLinkDataParameterName; +FOUNDATION_EXPORT NSString *const BFAppLinkTargetKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkUserAgentKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkExtrasKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkVersionKeyName; + +static id defaultResolver; + +@interface BFAppLinkNavigation () + +@property (nonatomic, copy, readwrite) NSDictionary *extras; +@property (nonatomic, copy, readwrite) NSDictionary *appLinkData; +@property (nonatomic, strong, readwrite) BFAppLink *appLink; + +@end + +@implementation BFAppLinkNavigation + ++ (instancetype)navigationWithAppLink:(BFAppLink *)appLink + extras:(NSDictionary *)extras + appLinkData:(NSDictionary *)appLinkData { + BFAppLinkNavigation *navigation = [[self alloc] init]; + navigation.appLink = appLink; + navigation.extras = extras; + navigation.appLinkData = appLinkData; + return navigation; +} + +- (NSString *)stringByEscapingQueryString:(NSString *)string { +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; +#else + return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, + (CFStringRef)string, + NULL, + (CFStringRef) @":/?#[]@!$&'()*+,;=", + kCFStringEncodingUTF8)); +#endif +} + +- (NSURL *)appLinkURLWithTargetURL:(NSURL *)targetUrl error:(NSError **)error { + NSMutableDictionary *appLinkData = [NSMutableDictionary dictionaryWithDictionary:self.appLinkData ?: @{}]; + + // Add applink protocol data + if (!appLinkData[BFAppLinkUserAgentKeyName]) { + appLinkData[BFAppLinkUserAgentKeyName] = [NSString stringWithFormat:@"Bolts iOS %@", BOLTS_VERSION]; + } + if (!appLinkData[BFAppLinkVersionKeyName]) { + appLinkData[BFAppLinkVersionKeyName] = BFAppLinkVersion; + } + appLinkData[BFAppLinkTargetKeyName] = [self.appLink.sourceURL absoluteString]; + appLinkData[BFAppLinkExtrasKeyName] = self.extras ?: @{}; + + // JSON-ify the applink data + NSError *jsonError = nil; + NSData *jsonBlob = [NSJSONSerialization dataWithJSONObject:appLinkData options:0 error:&jsonError]; + if (!jsonError) { + NSString *jsonString = [[NSString alloc] initWithData:jsonBlob encoding:NSUTF8StringEncoding]; + NSString *encoded = [self stringByEscapingQueryString:jsonString]; + + NSString *endUrlString = [NSString stringWithFormat:@"%@%@%@=%@", + [targetUrl absoluteString], + targetUrl.query ? @"&" : @"?", + BFAppLinkDataParameterName, + encoded]; + + return [NSURL URLWithString:endUrlString]; + } else { + if (error) { + *error = jsonError; + } + + // If there was an error encoding the app link data, fail hard. + return nil; + } +} + +- (BFAppLinkNavigationType)navigate:(NSError **)error { + NSURL *openedURL = nil; + NSError *encodingError = nil; + BFAppLinkNavigationType retType = BFAppLinkNavigationTypeFailure; + + // Find the first eligible/launchable target in the BFAppLink. + for (BFAppLinkTarget *target in self.appLink.targets) { + NSURL *appLinkAppURL = [self appLinkURLWithTargetURL:target.URL error:&encodingError]; + if (encodingError || !appLinkAppURL) { + if (error) { + *error = encodingError; + } + } else if ([[UIApplication sharedApplication] openURL:appLinkAppURL]) { + retType = BFAppLinkNavigationTypeApp; + openedURL = appLinkAppURL; + break; + } + } + + if (!openedURL && self.appLink.webURL) { + // Fall back to opening the url in the browser if available. + NSURL *appLinkBrowserURL = [self appLinkURLWithTargetURL:self.appLink.webURL error:&encodingError]; + if (encodingError || !appLinkBrowserURL) { + // If there was an error encoding the app link data, fail hard. + if (error) { + *error = encodingError; + } + } else if ([[UIApplication sharedApplication] openURL:appLinkBrowserURL]) { + // This was a browser navigation. + retType = BFAppLinkNavigationTypeBrowser; + openedURL = appLinkBrowserURL; + } + } + + [self postAppLinkNavigateEventNotificationWithTargetURL:openedURL + error:error ? *error : nil + type:retType]; + return retType; +} + +- (void)postAppLinkNavigateEventNotificationWithTargetURL:(NSURL *)outputURL error:(NSError *)error type:(BFAppLinkNavigationType)type { + NSString *const EVENT_YES_VAL = @"1"; + NSString *const EVENT_NO_VAL = @"0"; + NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; + + NSString *outputURLScheme = [outputURL scheme]; + NSString *outputURLString = [outputURL absoluteString]; + if (outputURLScheme) { + logData[@"outputURLScheme"] = outputURLScheme; + } + if (outputURLString) { + logData[@"outputURL"] = outputURLString; + } + + NSString *sourceURLString = [self.appLink.sourceURL absoluteString]; + NSString *sourceURLHost = [self.appLink.sourceURL host]; + NSString *sourceURLScheme = [self.appLink.sourceURL scheme]; + if (sourceURLString) { + logData[@"sourceURL"] = sourceURLString; + } + if (sourceURLHost) { + logData[@"sourceHost"] = sourceURLHost; + } + if (sourceURLScheme) { + logData[@"sourceScheme"] = sourceURLScheme; + } + if ([error localizedDescription]) { + logData[@"error"] = [error localizedDescription]; + } + NSString *success = nil; //no + NSString *linkType = nil; // unknown; + switch (type) { + case BFAppLinkNavigationTypeFailure: + success = EVENT_NO_VAL; + linkType = @"fail"; + break; + case BFAppLinkNavigationTypeBrowser: + success = EVENT_YES_VAL; + linkType = @"web"; + break; + case BFAppLinkNavigationTypeApp: + success = EVENT_YES_VAL; + linkType = @"app"; + break; + default: + break; + } + if (success) { + logData[@"success"] = success; + } + if (linkType) { + logData[@"type"] = linkType; + } + + if ([self.appLink isBackToReferrer]) { + [BFMeasurementEvent postNotificationForEventName:BFAppLinkNavigateBackToReferrerEventName args:logData]; + } else { + [BFMeasurementEvent postNotificationForEventName:BFAppLinkNavigateOutEventName args:logData]; + } +} + ++ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination resolver:(id)resolver { + return [resolver appLinkFromURLInBackground:destination]; +} + ++ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination { + return [self resolveAppLinkInBackground:destination resolver:[self defaultResolver]]; +} + ++ (BFTask *)navigateToURLInBackground:(NSURL *)destination { + return [self navigateToURLInBackground:destination + resolver:[self defaultResolver]]; +} + ++ (BFTask *)navigateToURLInBackground:(NSURL *)destination + resolver:(id)resolver { + BFTask *resolutionTask = [self resolveAppLinkInBackground:destination + resolver:resolver]; + return [resolutionTask continueWithExecutor:[BFExecutor mainThreadExecutor] + withSuccessBlock:^id(BFTask *task) { + NSError *error = nil; + BFAppLinkNavigationType result = [self navigateToAppLink:task.result + error:&error]; + if (error) { + return [BFTask taskWithError:error]; + } else { + return @(result); + } + }]; +} + ++ (BFAppLinkNavigationType)navigateToAppLink:(BFAppLink *)link error:(NSError **)error { + return [[BFAppLinkNavigation navigationWithAppLink:link + extras:nil + appLinkData:nil] navigate:error]; +} + ++ (id)defaultResolver { + if (defaultResolver) { + return defaultResolver; + } + return [BFWebViewAppLinkResolver sharedInstance]; +} + ++ (void)setDefaultResolver:(id)resolver { + defaultResolver = resolver; +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h b/Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h new file mode 100644 index 0000000..b67bdba --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@class BFTask; + +/*! + Implement this protocol to provide an alternate strategy for resolving + App Links that may include pre-fetching, caching, or querying for App Link + data from an index provided by a service provider. + */ +@protocol BFAppLinkResolving + +/*! + Asynchronously resolves App Link data for a given URL. + + @param url The URL to resolve into an App Link. + @returns A BFTask that will return a BFAppLink for the given URL. + */ +- (BFTask *)appLinkFromURLInBackground:(NSURL *)url; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h new file mode 100644 index 0000000..d19465e --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +#import + +@class BFAppLink; +@class BFAppLinkReturnToRefererController; + +/*! + Protocol that a class can implement in order to be notified when the user has navigated back + to the referer of an App Link. + */ +@protocol BFAppLinkReturnToRefererControllerDelegate + +@optional + +/*! Called when the user has tapped to navigate, but before the navigation has been performed. */ +- (void)returnToRefererController:(BFAppLinkReturnToRefererController *)controller + willNavigateToAppLink:(BFAppLink *)appLink; + +/*! Called after the navigation has been attempted, with an indication of whether the referer + app link was successfully opened. */ +- (void)returnToRefererController:(BFAppLinkReturnToRefererController *)controller + didNavigateToAppLink:(BFAppLink *)url + type:(BFAppLinkNavigationType)type; + +@end + +/*! + A controller class that implements default behavior for a BFAppLinkReturnToRefererView, including + the ability to display the view above the navigation bar for navigation-based apps. + */ +@interface BFAppLinkReturnToRefererController : NSObject + +/*! + The delegate that will be notified when the user navigates back to the referer. + */ +@property (nonatomic, weak) id delegate; + +/*! + The BFAppLinkReturnToRefererView this controller is controlling. + */ +@property (nonatomic, strong) BFAppLinkReturnToRefererView *view; + +/*! + Initializes a controller suitable for controlling a BFAppLinkReturnToRefererView that is to be displayed + contained within another UIView (i.e., not displayed above the navigation bar). + */ +- (instancetype)init; + +/*! + Initializes a controller suitable for controlling a BFAppLinkReturnToRefererView that is to be displayed + displayed above the navigation bar. + */ +- (instancetype)initForDisplayAboveNavController:(UINavigationController *)navController; + +/*! + Removes the view entirely from the navigation controller it is currently displayed in. + */ +- (void)removeFromNavController; + +/*! + Shows the BFAppLinkReturnToRefererView with the specified referer information. If nil or missing data, + the view will not be displayed. */ +- (void)showViewForRefererAppLink:(BFAppLink *)refererAppLink; + +/*! + Shows the BFAppLinkReturnToRefererView with referer information extracted from the specified URL. + If nil or missing referer App Link data, the view will not be displayed. */ +- (void)showViewForRefererURL:(NSURL *)url; + +/*! + Closes the view, possibly animating it. + */ +- (void)closeViewAnimated:(BOOL)animated; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m new file mode 100644 index 0000000..d380635 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFAppLinkReturnToRefererController.h" + +#import "BFAppLink.h" +#import "BFAppLinkReturnToRefererView_Internal.h" +#import "BFURL_Internal.h" + +static const CFTimeInterval kBFViewAnimationDuration = 0.25f; + +@implementation BFAppLinkReturnToRefererController { + UINavigationController *_navigationController; + BFAppLinkReturnToRefererView *_view; +} + +#pragma mark - Object lifecycle + +- (instancetype)init { + return [self initForDisplayAboveNavController:nil]; +} + +- (instancetype)initForDisplayAboveNavController:(UINavigationController *)navController { + self = [super init]; + if (self) { + _navigationController = navController; + + if (_navigationController != nil) { + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(statusBarFrameWillChange:) + name:UIApplicationWillChangeStatusBarFrameNotification + object:nil]; + [nc addObserver:self + selector:@selector(statusBarFrameDidChange:) + name:UIApplicationDidChangeStatusBarFrameNotification + object:nil]; + [nc addObserver:self + selector:@selector(orientationDidChange:) + name:UIDeviceOrientationDidChangeNotification + object:nil]; + } + } + return self; +} + +- (void)dealloc { + _view.delegate = nil; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Public API + +- (BFAppLinkReturnToRefererView *)view { + if (!_view) { + self.view = [[BFAppLinkReturnToRefererView alloc] initWithFrame:CGRectZero]; + if (_navigationController) { + [_navigationController.view addSubview:_view]; + } + } + return _view; +} + +- (void)setView:(BFAppLinkReturnToRefererView *)view { + if (_view != view) { + _view.delegate = nil; + } + + _view = view; + _view.delegate = self; + + if (_navigationController) { + _view.includeStatusBarInSize = BFIncludeStatusBarInSizeAlways; + } +} + +- (void)showViewForRefererAppLink:(BFAppLink *)refererAppLink { + self.view.refererAppLink = refererAppLink; + + [_view sizeToFit]; + + if (_navigationController) { + if (!_view.closed) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self moveNavigationBar]; + }); + } + } +} + +- (void)showViewForRefererURL:(NSURL *)url { + BFAppLink *appLink = [BFURL URLForRenderBackToReferrerBarURL:url].appLinkReferer; + [self showViewForRefererAppLink:appLink]; +} + +- (void)removeFromNavController { + if (_navigationController) { + [_view removeFromSuperview]; + _navigationController = nil; + } +} + +#pragma mark - BFAppLinkReturnToRefererViewDelegate + +- (void)returnToRefererViewDidTapInsideCloseButton:(BFAppLinkReturnToRefererView *)view { + [self closeViewAnimated:YES explicitlyClosed:YES]; +} + +- (void)returnToRefererViewDidTapInsideLink:(BFAppLinkReturnToRefererView *)view + link:(BFAppLink *)link { + [self openRefererAppLink:link]; + [self closeViewAnimated:NO explicitlyClosed:NO]; +} + +#pragma mark - Private + +- (void)statusBarFrameWillChange:(NSNotification *)notification { + NSValue *rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey]; + CGRect newFrame; + [rectValue getValue:&newFrame]; + + if (_navigationController && !_view.closed) { + if (CGRectGetHeight(newFrame) == 40) { + UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; + [UIView animateWithDuration:kBFViewAnimationDuration delay:0.0 options:options animations:^{ + _view.frame = CGRectMake(0.0, 0.0, CGRectGetWidth(_view.bounds), 0.0); + } completion:nil]; + } + } +} + +- (void)statusBarFrameDidChange:(NSNotification *)notification { + NSValue *rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey]; + CGRect newFrame; + [rectValue getValue:&newFrame]; + + if (_navigationController && !_view.closed) { + if (CGRectGetHeight(newFrame) == 40) { + UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; + [UIView animateWithDuration:kBFViewAnimationDuration delay:0.0 options:options animations:^{ + [_view sizeToFit]; + [self moveNavigationBar]; + } completion:nil]; + } + } +} + +- (void)orientationDidChange:(NSNotificationCenter *)notification { + if (_navigationController && !_view.closed && CGRectGetHeight(_view.bounds) > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self moveNavigationBar]; + }); + } +} + +- (void)moveNavigationBar { + if (_view.closed || !_view.refererAppLink) { + return; + } + + [self updateNavigationBarY:CGRectGetHeight(_view.bounds)]; +} + +- (void)updateNavigationBarY:(CGFloat)y { + UINavigationBar *navigationBar = _navigationController.navigationBar; + CGRect navigationBarFrame = navigationBar.frame; + CGFloat oldContainerViewY = CGRectGetMaxY(navigationBarFrame); + navigationBarFrame.origin.y = y; + navigationBar.frame = navigationBarFrame; + + CGFloat dy = CGRectGetMaxY(navigationBarFrame) - oldContainerViewY; + UIView *containerView = _navigationController.visibleViewController.view.superview; + containerView.frame = UIEdgeInsetsInsetRect(containerView.frame, UIEdgeInsetsMake(dy, 0.0, 0.0, 0.0)); +} + +- (void)closeViewAnimated:(BOOL)animated { + [self closeViewAnimated:animated explicitlyClosed:YES]; +} + +- (void)closeViewAnimated:(BOOL)animated explicitlyClosed:(BOOL)explicitlyClosed { + void (^closer)(void) = ^{ + if (_navigationController) { + [self updateNavigationBarY:_view.statusBarHeight]; + } + + CGRect frame = _view.frame; + frame.size.height = 0.0; + _view.frame = frame; + }; + + if (animated) { + [UIView animateWithDuration:kBFViewAnimationDuration animations:^{ + closer(); + } completion:^(BOOL finished) { + if (explicitlyClosed) { + _view.closed = YES; + } + }]; + } else { + closer(); + if (explicitlyClosed) { + _view.closed = YES; + } + } +} + +- (void)openRefererAppLink:(BFAppLink *)refererAppLink { + if (refererAppLink) { + id delegate = _delegate; + if ([delegate respondsToSelector:@selector(returnToRefererController:willNavigateToAppLink:)]) { + [delegate returnToRefererController:self willNavigateToAppLink:refererAppLink]; + } + + NSError *error = nil; + BFAppLinkNavigationType type = [BFAppLinkNavigation navigateToAppLink:refererAppLink error:&error]; + + if ([delegate respondsToSelector:@selector(returnToRefererController:didNavigateToAppLink:type:)]) { + [delegate returnToRefererController:self didNavigateToAppLink:refererAppLink type:type]; + } + } +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h new file mode 100644 index 0000000..d20f73a --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +#import + +@class BFAppLinkReturnToRefererView; +@class BFURL; + +typedef NS_ENUM(NSUInteger, BFIncludeStatusBarInSize) { + BFIncludeStatusBarInSizeNever, + BFIncludeStatusBarInSizeIOS7AndLater, + BFIncludeStatusBarInSizeAlways, +}; + +/*! + Protocol that a class can implement in order to be notified when the user has navigated back + to the referer of an App Link. + */ +@protocol BFAppLinkReturnToRefererViewDelegate + +/*! + Called when the user has tapped inside the close button. + */ +- (void)returnToRefererViewDidTapInsideCloseButton:(BFAppLinkReturnToRefererView *)view; + +/*! + Called when the user has tapped inside the App Link portion of the view. + */ +- (void)returnToRefererViewDidTapInsideLink:(BFAppLinkReturnToRefererView *)view + link:(BFAppLink *)link; + +@end + +/*! + Provides a UIView that displays a button allowing users to navigate back to the + application that launched the App Link currently being handled, if the App Link + contained referer data. The user can also close the view by clicking a close button + rather than navigating away. If the view is provided an App Link that does not contain + referer data, it will have zero size and no UI will be displayed. + */ +@interface BFAppLinkReturnToRefererView : UIView + +/*! + The delegate that will be notified when the user navigates back to the referer. + */ +@property (nonatomic, weak) id delegate; + +/*! + The color of the text label and close button. + */ +@property (nonatomic, strong) UIColor *textColor; + +@property (nonatomic, strong) BFAppLink *refererAppLink; + +/*! + Indicates whether to extend the size of the view to include the current status bar + size, for use in scenarios where the view might extend under the status bar on iOS 7 and + above; this property has no effect on earlier versions of iOS. + */ +@property (nonatomic, assign) BFIncludeStatusBarInSize includeStatusBarInSize; + +/*! + Indicates whether the user has closed the view by clicking the close button. + */ +@property (nonatomic, assign) BOOL closed; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m new file mode 100644 index 0000000..2a1021d --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFAppLinkReturnToRefererView.h" + +#import "BFAppLink.h" +#import "BFAppLinkTarget.h" + +static const CGFloat BFMarginX = 8.5f; +static const CGFloat BFMarginY = 8.5f; + +static NSString *const BFRefererAppLink = @"referer_app_link"; +static NSString *const BFRefererAppName = @"app_name"; +static NSString *const BFRefererUrl = @"url"; +static const CGFloat BFCloseButtonWidth = 12.0; +static const CGFloat BFCloseButtonHeight = 12.0; + +@interface BFAppLinkReturnToRefererView () + +@property (nonatomic, strong) UILabel *labelView; +@property (nonatomic, strong) UIButton *closeButton; +@property (nonatomic, strong) UITapGestureRecognizer *insideTapGestureRecognizer; +@property (nonatomic, strong) UIView *viewToMoveWithNavController; + +@end + +@implementation BFAppLinkReturnToRefererView { + BOOL _explicitlyHidden; +} + +#pragma mark - Initialization + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self commonInit]; + [self sizeToFit]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self commonInit]; + } + return self; +} + +- (void)commonInit { + // Initialization code + _includeStatusBarInSize = BFIncludeStatusBarInSizeIOS7AndLater; + + // iOS 7 system blue color + self.backgroundColor = [UIColor colorWithRed:0.0f green:122.0f / 255.0f blue:1.0f alpha:1.0f]; + self.textColor = [UIColor whiteColor]; + self.clipsToBounds = YES; + + [self initViews]; +} + +- (void)initViews { + if (!_labelView && !_closeButton) { + _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _closeButton.backgroundColor = [UIColor clearColor]; + _closeButton.userInteractionEnabled = YES; + _closeButton.clipsToBounds = YES; + _closeButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; + _closeButton.contentMode = UIViewContentModeCenter; + [_closeButton addTarget:self action:@selector(closeButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; + + [self addSubview:_closeButton]; + + _labelView = [[UILabel alloc] initWithFrame:CGRectZero]; + _labelView.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]]; + _labelView.textColor = [UIColor whiteColor]; + _labelView.backgroundColor = [UIColor clearColor]; +#ifdef __IPHONE_6_0 + _labelView.textAlignment = NSTextAlignmentCenter; +#else + _labelView.textAlignment = UITextAlignmentCenter; +#endif + _labelView.clipsToBounds = YES; + [self updateLabelText]; + [self addSubview:_labelView]; + + _insideTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapInside:)]; + _labelView.userInteractionEnabled = YES; + [_labelView addGestureRecognizer:_insideTapGestureRecognizer]; + + [self updateColors]; + } +} + +#pragma mark - Layout + +- (CGSize)intrinsicContentSize { + CGSize size = self.bounds.size; + if (_closed || !self.hasRefererData) { + size.height = 0.0; + } else { + CGSize labelSize = [_labelView sizeThatFits:size]; + size = CGSizeMake(size.width, labelSize.height + 2 * BFMarginY + self.statusBarHeight); + } + return size; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + CGRect bounds = self.bounds; + + _labelView.preferredMaxLayoutWidth = _labelView.bounds.size.width; + CGSize labelSize = [_labelView sizeThatFits:bounds.size]; + _labelView.frame = CGRectMake(BFMarginX, + CGRectGetMaxY(bounds) - labelSize.height - 1.5f * BFMarginY, + CGRectGetMaxX(bounds) - BFCloseButtonWidth - 3 * BFMarginX, + labelSize.height + BFMarginY); + + _closeButton.frame = CGRectMake(CGRectGetMaxX(bounds) - BFCloseButtonWidth - 2 * BFMarginX, + _labelView.center.y - BFCloseButtonHeight / 2.0f - BFMarginY, + BFCloseButtonWidth + 2 * BFMarginX, + BFCloseButtonHeight + 2 * BFMarginY); +} + +- (CGSize)sizeThatFits:(CGSize)size { + if (_closed || !self.hasRefererData) { + size = CGSizeMake(size.width, 0.0); + } else { + CGSize labelSize = [_labelView sizeThatFits:size]; + size = CGSizeMake(size.width, labelSize.height + 2 * BFMarginY + self.statusBarHeight); + } + return size; +} + +- (CGFloat)statusBarHeight { + UIApplication *application = [UIApplication sharedApplication]; + + BOOL include; + switch (_includeStatusBarInSize) { + case BFIncludeStatusBarInSizeAlways: + include = YES; + break; + case BFIncludeStatusBarInSizeIOS7AndLater: { + float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; + include = (systemVersion >= 7.0); + break; + } + case BFIncludeStatusBarInSizeNever: + include = NO; + break; + } + if (include && !application.statusBarHidden) { + BOOL landscape = UIInterfaceOrientationIsLandscape(application.statusBarOrientation); + CGRect statusBarFrame = application.statusBarFrame; + return landscape ? CGRectGetWidth(statusBarFrame) : CGRectGetHeight(statusBarFrame); + } + + return 0; +} + +#pragma mark - Public API + +- (void)setIncludeStatusBarInSize:(BFIncludeStatusBarInSize)includeStatusBarInSize { + _includeStatusBarInSize = includeStatusBarInSize; + [self setNeedsLayout]; + [self invalidateIntrinsicContentSize]; +} + +- (void)setTextColor:(UIColor *)textColor { + _textColor = textColor; + [self updateColors]; +} + +- (void)setRefererAppLink:(BFAppLink *)refererAppLink { + _refererAppLink = refererAppLink; + [self updateLabelText]; + [self updateHidden]; + [self invalidateIntrinsicContentSize]; +} + +- (void)setClosed:(BOOL)closed { + if (_closed != closed) { + _closed = closed; + [self updateHidden]; + [self invalidateIntrinsicContentSize]; + } +} + +- (void)setHidden:(BOOL)hidden { + _explicitlyHidden = hidden; + [self updateHidden]; +} + +#pragma mark - Private + +- (void)updateLabelText { + NSString *appName = (_refererAppLink && _refererAppLink.targets[0]) ? [_refererAppLink.targets[0] appName] : nil; + _labelView.text = [self localizedLabelForReferer:appName]; +} + +- (void)updateColors { + UIImage *closeButtonImage = [self drawCloseButtonImageWithColor:_textColor]; + + _labelView.textColor = _textColor; + [_closeButton setImage:closeButtonImage forState:UIControlStateNormal]; +} + +- (UIImage *)drawCloseButtonImageWithColor:(UIColor *)color { + + UIGraphicsBeginImageContextWithOptions(CGSizeMake(BFCloseButtonWidth, BFCloseButtonHeight), NO, 0.0f); + + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGContextSetStrokeColorWithColor(context, [color CGColor]); + CGContextSetFillColorWithColor(context, [color CGColor]); + + CGContextSetLineWidth(context, 1.25f); + + CGFloat inset = 0.5f; + + CGContextMoveToPoint(context, inset, inset); + CGContextAddLineToPoint(context, BFCloseButtonWidth - inset, BFCloseButtonHeight - inset); + CGContextStrokePath(context); + + CGContextMoveToPoint(context, BFCloseButtonWidth - inset, inset); + CGContextAddLineToPoint(context, inset, BFCloseButtonHeight - inset); + CGContextStrokePath(context); + + UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return result; +} + +- (NSString *)localizedLabelForReferer:(NSString *)refererName { + if (!refererName) { + return nil; + } + + NSString *format = NSLocalizedString(@"Touch to return to %1$@", @"Format for the string to return to a calling app."); + + return [NSString stringWithFormat:format, refererName]; +} + +- (BOOL)hasRefererData { + return _refererAppLink && _refererAppLink.targets[0]; +} + +- (void)closeButtonTapped:(id)sender { + [_delegate returnToRefererViewDidTapInsideCloseButton:self]; +} + +- (void)onTapInside:(UIGestureRecognizer *)sender { + [_delegate returnToRefererViewDidTapInsideLink:self link:_refererAppLink]; +} + +- (void)updateHidden { + [super setHidden:_explicitlyHidden || _closed || !self.hasRefererData]; +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h new file mode 100644 index 0000000..8b85823 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@interface BFAppLinkReturnToRefererView (Internal) + +- (CGFloat)statusBarHeight; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h b/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h new file mode 100644 index 0000000..6172126 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +/*! + Represents a target defined in App Link metadata, consisting of at least + a URL, and optionally an App Store ID and name. + */ +@interface BFAppLinkTarget : NSObject + +/*! Creates a BFAppLinkTarget with the given app site and target URL. */ ++ (instancetype)appLinkTargetWithURL:(NSURL *)url + appStoreId:(NSString *)appStoreId + appName:(NSString *)appName; + +/*! The URL prefix for this app link target */ +@property (nonatomic, strong, readonly) NSURL *URL; + +/*! The app ID for the app store */ +@property (nonatomic, copy, readonly) NSString *appStoreId; + +/*! The name of the app */ +@property (nonatomic, copy, readonly) NSString *appName; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m b/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m new file mode 100644 index 0000000..5518cba --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFAppLinkTarget.h" + +@interface BFAppLinkTarget () + +@property (nonatomic, strong, readwrite) NSURL *URL; +@property (nonatomic, copy, readwrite) NSString *appStoreId; +@property (nonatomic, copy, readwrite) NSString *appName; + +@end + +@implementation BFAppLinkTarget + ++ (instancetype)appLinkTargetWithURL:(NSURL *)url + appStoreId:(NSString *)appStoreId + appName:(NSString *)appName { + BFAppLinkTarget *target = [[self alloc] init]; + target.URL = url; + target.appStoreId = appStoreId; + target.appName = appName; + return target; +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLink_Internal.h b/Pods/Bolts/Bolts/iOS/BFAppLink_Internal.h new file mode 100644 index 0000000..6644b90 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFAppLink_Internal.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@interface BFAppLink (Internal) + ++ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL + targets:(NSArray *)targets + webURL:(NSURL *)webURL + isBackToReferrer:(BOOL)isBackToReferrer; + +/*! return if this AppLink is to go back to referrer. */ +@property (nonatomic, assign, readonly, getter=isBackToReferrer) BOOL backToReferrer; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h new file mode 100644 index 0000000..b3173fc --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +/*! The name of the notification posted by BFMeasurementEvent */ +FOUNDATION_EXPORT NSString *const BFMeasurementEventNotificationName; + +/*! Defines keys in the userInfo object for the notification named BFMeasurementEventNotificationName */ +/*! The string field for the name of the event */ +FOUNDATION_EXPORT NSString *const BFMeasurementEventNameKey; +/*! The dictionary field for the arguments of the event */ +FOUNDATION_EXPORT NSString *const BFMeasurementEventArgsKey; + +/*! Bolts Events raised by BFMeasurementEvent for Applink */ +/*! + The name of the event posted when [BFURL URLWithURL:] is called successfully. This represents the successful parsing of an app link URL. + */ +FOUNDATION_EXPORT NSString *const BFAppLinkParseEventName; + +/*! + The name of the event posted when [BFURL URLWithInboundURL:] is called successfully. + This represents parsing an inbound app link URL from a different application + */ +FOUNDATION_EXPORT NSString *const BFAppLinkNavigateInEventName; + +/*! The event raised when the user navigates from your app to other apps */ +FOUNDATION_EXPORT NSString *const BFAppLinkNavigateOutEventName; + +/*! + The event raised when the user navigates out from your app and back to the referrer app. + e.g when the user leaves your app after tapping the back-to-referrer navigation bar + */ +FOUNDATION_EXPORT NSString *const BFAppLinkNavigateBackToReferrerEventName; + +@interface BFMeasurementEvent : NSObject + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m new file mode 100644 index 0000000..e3e6cde --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFMeasurementEvent_Internal.h" + +NSString *const BFMeasurementEventNotificationName = @"com.parse.bolts.measurement_event"; + +NSString *const BFMeasurementEventNameKey = @"event_name"; +NSString *const BFMeasurementEventArgsKey = @"event_args"; + +/* app Link Event raised by this BFURL */ +NSString *const BFAppLinkParseEventName = @"al_link_parse"; +NSString *const BFAppLinkNavigateInEventName = @"al_nav_in"; + +/*! AppLink events raised in this class */ +NSString *const BFAppLinkNavigateOutEventName = @"al_nav_out"; +NSString *const BFAppLinkNavigateBackToReferrerEventName = @"al_ref_back_out"; + +__attribute__((noinline)) void warnOnMissingEventName() { + NSLog(@"Warning: Missing event name when logging bolts measurement event. \n" + " Ignoring this event in logging."); +} + +@implementation BFMeasurementEvent { + NSString *_name; + NSDictionary *_args; +} + +- (void)postNotification { + if (!_name) { + warnOnMissingEventName(); + return; + } + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + NSDictionary *userInfo = @{BFMeasurementEventNameKey : _name, + BFMeasurementEventArgsKey : _args}; + + [center postNotificationName:BFMeasurementEventNotificationName + object:self + userInfo:userInfo]; +} + +- (instancetype)initEventWithName:(NSString *)name args:(NSDictionary *)args { + if ((self = [super init])) { + _name = name; + _args = args ? args : @{}; + } + return self; +} + ++ (void)postNotificationForEventName:(NSString *)name args:(NSDictionary *)args { + [[[self alloc] initEventWithName:name args:args] postNotification]; +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent_Internal.h b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent_Internal.h new file mode 100644 index 0000000..7d46fd0 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent_Internal.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +/*! + Provides methods for posting notifications from the Bolts framework + */ +@interface BFMeasurementEvent (Internal) + ++ (void)postNotificationForEventName:(NSString *)name args:(NSDictionary *)args; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFURL.h b/Pods/Bolts/Bolts/iOS/BFURL.h new file mode 100644 index 0000000..924c91d --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFURL.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@class BFAppLink; + +/*! + Provides a set of utilities for working with NSURLs, such as parsing of query parameters + and handling for App Link requests. + */ +@interface BFURL : NSObject + +/*! + Creates a link target from a raw URL. + On success, this posts the BFAppLinkParseEventName measurement event. If you are constructing the BFURL within your application delegate's + application:openURL:sourceApplication:annotation:, you should instead use URLWithInboundURL:sourceApplication: + to support better BFMeasurementEvent notifications + @param url The instance of `NSURL` to create BFURL from. + */ ++ (BFURL *)URLWithURL:(NSURL *)url; + +/*! + Creates a link target from a raw URL received from an external application. This is typically called from the app delegate's + application:openURL:sourceApplication:annotation: and will post the BFAppLinkNavigateInEventName measurement event. + @param url The instance of `NSURL` to create BFURL from. + @param sourceApplication the bundle ID of the app that is requesting your app to open the URL. The same sourceApplication in application:openURL:sourceApplication:annotation: + */ ++ (BFURL *)URLWithInboundURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication; + +/*! + Gets the target URL. If the link is an App Link, this is the target of the App Link. + Otherwise, it is the url that created the target. + */ +@property (nonatomic, strong, readonly) NSURL *targetURL; + +/*! + Gets the query parameters for the target, parsed into an NSDictionary. + */ +@property (nonatomic, strong, readonly) NSDictionary *targetQueryParameters; + +/*! + If this link target is an App Link, this is the data found in al_applink_data. + Otherwise, it is nil. + */ +@property (nonatomic, strong, readonly) NSDictionary *appLinkData; + +/*! + If this link target is an App Link, this is the data found in extras. + */ +@property (nonatomic, strong, readonly) NSDictionary *appLinkExtras; + +/*! + The App Link indicating how to navigate back to the referer app, if any. + */ +@property (nonatomic, strong, readonly) BFAppLink *appLinkReferer; + +/*! + The URL that was used to create this BFURL. + */ +@property (nonatomic, strong, readonly) NSURL *inputURL; + +/*! + The query parameters of the inputURL, parsed into an NSDictionary. + */ +@property (nonatomic, strong, readonly) NSDictionary *inputQueryParameters; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFURL.m b/Pods/Bolts/Bolts/iOS/BFURL.m new file mode 100644 index 0000000..e8f2676 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFURL.m @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import "BFURL_Internal.h" +#import "BFAppLink_Internal.h" +#import "BFAppLinkTarget.h" +#import "BFMeasurementEvent_Internal.h" + +FOUNDATION_EXPORT NSString *const BFAppLinkDataParameterName; +FOUNDATION_EXPORT NSString *const BFAppLinkTargetKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkUserAgentKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkExtrasKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkVersionKeyName; +FOUNDATION_EXPORT NSString *const BFAppLinkRefererAppLink; +FOUNDATION_EXPORT NSString *const BFAppLinkRefererAppName; +FOUNDATION_EXPORT NSString *const BFAppLinkRefererUrl; + +@implementation BFURL + +- (instancetype)initWithURL:(NSURL *)url forOpenInboundURL:(BOOL)forOpenURLEvent sourceApplication:(NSString *)sourceApplication forRenderBackToReferrerBar:(BOOL)forRenderBackToReferrerBar { + if (self = [super init]) { + _inputURL = url; + _targetURL = url; + + // Parse the query string parameters for the base URL + NSDictionary *baseQuery = [BFURL queryParametersForURL:url]; + _inputQueryParameters = baseQuery; + _targetQueryParameters = baseQuery; + + // Check for applink_data + NSString *appLinkDataString = baseQuery[BFAppLinkDataParameterName]; + if (appLinkDataString) { + // Try to parse the JSON + NSError *error = nil; + NSDictionary *applinkData = [NSJSONSerialization JSONObjectWithData:[appLinkDataString dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:&error]; + if (!error && [applinkData isKindOfClass:[NSDictionary class]]) { + // If the version is not specified, assume it is 1. + NSString *version = applinkData[BFAppLinkVersionKeyName] ?: @"1.0"; + NSString *target = applinkData[BFAppLinkTargetKeyName]; + if ([version isKindOfClass:[NSString class]] && + [version isEqual:BFAppLinkVersion]) { + // There's applink data! The target should actually be the applink target. + _appLinkData = applinkData; + id applinkExtras = applinkData[BFAppLinkExtrasKeyName]; + if (applinkExtras && [applinkExtras isKindOfClass:[NSDictionary class]]) { + _appLinkExtras = applinkExtras; + } + _targetURL = ([target isKindOfClass:[NSString class]] ? [NSURL URLWithString:target] : url); + _targetQueryParameters = [BFURL queryParametersForURL:_targetURL]; + + NSDictionary *refererAppLink = _appLinkData[BFAppLinkRefererAppLink]; + NSString *refererURLString = refererAppLink[BFAppLinkRefererUrl]; + NSString *refererAppName = refererAppLink[BFAppLinkRefererAppName]; + + if (refererURLString && refererAppName) { + BFAppLinkTarget *target = [BFAppLinkTarget appLinkTargetWithURL:[NSURL URLWithString:refererURLString] + appStoreId:nil + appName:refererAppName]; + _appLinkReferer = [BFAppLink appLinkWithSourceURL:[NSURL URLWithString:refererURLString] + targets:@[ target ] + webURL:nil + isBackToReferrer:YES]; + } + + // Raise Measurement Event + NSString *const EVENT_YES_VAL = @"1"; + NSString *const EVENT_NO_VAL = @"0"; + NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; + logData[@"version"] = version; + if (refererURLString) { + logData[@"refererURL"] = refererURLString; + } + if (refererAppName) { + logData[@"refererAppName"] = refererAppName; + } + if (sourceApplication) { + logData[@"sourceApplication"] = sourceApplication; + } + if ([_targetURL absoluteString]) { + logData[@"targetURL"] = [_targetURL absoluteString]; + } + if ([_inputURL absoluteString]) { + logData[@"inputURL"] = [_inputURL absoluteString]; + } + if ([_inputURL scheme]) { + logData[@"inputURLScheme"] = [_inputURL scheme]; + } + logData[@"forRenderBackToReferrerBar"] = forRenderBackToReferrerBar ? EVENT_YES_VAL : EVENT_NO_VAL; + logData[@"forOpenUrl"] = forOpenURLEvent ? EVENT_YES_VAL : EVENT_NO_VAL; + [BFMeasurementEvent postNotificationForEventName:BFAppLinkParseEventName args:logData]; + if (forOpenURLEvent) { + [BFMeasurementEvent postNotificationForEventName:BFAppLinkNavigateInEventName args:logData]; + } + } + } + } + } + return self; +} + ++ (BFURL *)URLWithURL:(NSURL *)url { + return [[BFURL alloc] initWithURL:url forOpenInboundURL:NO sourceApplication:nil forRenderBackToReferrerBar:NO]; +} + ++ (BFURL *)URLWithInboundURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { + return [[BFURL alloc] initWithURL:url forOpenInboundURL:YES sourceApplication:sourceApplication forRenderBackToReferrerBar:NO]; +} + ++ (BFURL *)URLForRenderBackToReferrerBarURL:(NSURL *)url { + return [[BFURL alloc] initWithURL:url forOpenInboundURL:NO sourceApplication:nil forRenderBackToReferrerBar:YES]; +} + ++ (NSString *)decodeURLString:(NSString *)string { + return (NSString *)CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapes(NULL, + (CFStringRef)string, + CFSTR(""))); +} + ++ (NSDictionary *)queryParametersForURL:(NSURL *)url { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + NSString *query = url.query; + if ([query isEqualToString:@""]) { + return @{}; + } + NSArray *queryComponents = [query componentsSeparatedByString:@"&"]; + for (NSString *component in queryComponents) { + NSRange equalsLocation = [component rangeOfString:@"="]; + if (equalsLocation.location == NSNotFound) { + // There's no equals, so associate the key with NSNull + parameters[[self decodeURLString:component]] = [NSNull null]; + } else { + NSString *key = [self decodeURLString:[component substringToIndex:equalsLocation.location]]; + NSString *value = [self decodeURLString:[component substringFromIndex:equalsLocation.location + 1]]; + parameters[key] = value; + } + } + return [NSDictionary dictionaryWithDictionary:parameters]; +} + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFURL_Internal.h b/Pods/Bolts/Bolts/iOS/BFURL_Internal.h new file mode 100644 index 0000000..03b6bc6 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFURL_Internal.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@interface BFURL (Internal) ++ (BFURL *)URLForRenderBackToReferrerBarURL:(NSURL *)url; +@end diff --git a/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h b/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h new file mode 100644 index 0000000..3782ae2 --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import + +/*! + A reference implementation for an App Link resolver that uses a hidden UIWebView + to parse the HTML containing App Link metadata. + */ +@interface BFWebViewAppLinkResolver : NSObject + +/*! + Gets the instance of a BFWebViewAppLinkResolver. + */ ++ (instancetype)sharedInstance; + +@end diff --git a/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m b/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m new file mode 100644 index 0000000..720838b --- /dev/null +++ b/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import "BFWebViewAppLinkResolver.h" +#import "BFAppLink.h" +#import "BFAppLinkTarget.h" +#import "BFTask.h" +#import "BFTaskCompletionSource.h" +#import "BFExecutor.h" + +// Defines JavaScript to extract app link tags from HTML content +static NSString *const BFWebViewAppLinkResolverTagExtractionJavaScript = @"" +"(function() {" +" var metaTags = document.getElementsByTagName('meta');" +" var results = [];" +" for (var i = 0; i < metaTags.length; i++) {" +" var property = metaTags[i].getAttribute('property');" +" if (property && property.substring(0, 'al:'.length) === 'al:') {" +" var tag = { \"property\": metaTags[i].getAttribute('property') };" +" if (metaTags[i].hasAttribute('content')) {" +" tag['content'] = metaTags[i].getAttribute('content');" +" }" +" results.push(tag);" +" }" +" }" +" return JSON.stringify(results);" +"})()"; +static NSString *const BFWebViewAppLinkResolverIOSURLKey = @"url"; +static NSString *const BFWebViewAppLinkResolverIOSAppStoreIdKey = @"app_store_id"; +static NSString *const BFWebViewAppLinkResolverIOSAppNameKey = @"app_name"; +static NSString *const BFWebViewAppLinkResolverDictionaryValueKey = @"_value"; +static NSString *const BFWebViewAppLinkResolverPreferHeader = @"Prefer-Html-Meta-Tags"; +static NSString *const BFWebViewAppLinkResolverMetaTagPrefix = @"al"; +static NSString *const BFWebViewAppLinkResolverWebKey = @"web"; +static NSString *const BFWebViewAppLinkResolverIOSKey = @"ios"; +static NSString *const BFWebViewAppLinkResolverIPhoneKey = @"iphone"; +static NSString *const BFWebViewAppLinkResolverIPadKey = @"ipad"; +static NSString *const BFWebViewAppLinkResolverWebURLKey = @"url"; +static NSString *const BFWebViewAppLinkResolverShouldFallbackKey = @"should_fallback"; + +@interface BFWebViewAppLinkResolverWebViewDelegate : NSObject + +@property (nonatomic, copy) void (^didFinishLoad)(UIWebView *webView); +@property (nonatomic, copy) void (^didFailLoadWithError)(UIWebView *webView, NSError *error); +@property (nonatomic, assign) BOOL hasLoaded; + +@end + +@implementation BFWebViewAppLinkResolverWebViewDelegate + +- (void)webViewDidFinishLoad:(UIWebView *)webView { + if (self.didFinishLoad) { + self.didFinishLoad(webView); + } +} + +- (void)webViewDidStartLoad:(UIWebView *)webView { +} + +- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { + if (self.didFailLoadWithError) { + self.didFailLoadWithError(webView, error); + } +} + +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { + if (self.hasLoaded) { + // Consider loading a second resource to be "success", since it indicates an inner frame + // or redirect is happening. We can run the tag extraction script at this point. + self.didFinishLoad(webView); + return NO; + } + self.hasLoaded = YES; + return YES; +} + +@end + +@implementation BFWebViewAppLinkResolver + ++ (instancetype)sharedInstance { + static id instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] init]; + }); + return instance; +} + +- (BFTask *)followRedirects:(NSURL *)url { + // This task will be resolved with either the redirect NSURL + // or a dictionary with the response data to be returned. + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request setValue:BFWebViewAppLinkResolverMetaTagPrefix forHTTPHeaderField:BFWebViewAppLinkResolverPreferHeader]; + + void (^completion)(NSURLResponse *response, NSData *data, NSError *error) = ^(NSURLResponse *response, NSData *data, NSError *error) { + if (error) { + [tcs setError:error]; + return; + } + + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + + // NSURLConnection usually follows redirects automatically, but the + // documentation is unclear what the default is. This helps it along. + if (httpResponse.statusCode >= 300 && httpResponse.statusCode < 400) { + NSString *redirectString = httpResponse.allHeaderFields[@"Location"]; + NSURL *redirectURL = [NSURL URLWithString:redirectString]; + [tcs setResult:redirectURL]; + return; + } + } + + [tcs setResult:@{ @"response" : response, @"data" : data }]; + }; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + NSURLSession *session = [NSURLSession sharedSession]; + [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + completion(response, data, error); + }] resume]; +#else + [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:completion]; +#endif + + return [tcs.task continueWithSuccessBlock:^id(BFTask *task) { + // If we redirected, just keep recursing. + if ([task.result isKindOfClass:[NSURL class]]) { + return [self followRedirects:task.result]; + } + return task; + }]; +} + +- (BFTask *)appLinkFromURLInBackground:(NSURL *)url { + return [[self followRedirects:url] continueWithExecutor:[BFExecutor mainThreadExecutor] + withSuccessBlock:^id(BFTask *task) { + NSData *responseData = task.result[@"data"]; + NSHTTPURLResponse *response = task.result[@"response"]; + BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; + + UIWebView *webView = [[UIWebView alloc] init]; + BFWebViewAppLinkResolverWebViewDelegate *listener = [[BFWebViewAppLinkResolverWebViewDelegate alloc] init]; + __block BFWebViewAppLinkResolverWebViewDelegate *retainedListener = listener; + listener.didFinishLoad = ^(UIWebView *view) { + if (retainedListener) { + NSDictionary *ogData = [self getALDataFromLoadedPage:view]; + [view removeFromSuperview]; + view.delegate = nil; + retainedListener = nil; + [tcs setResult:[self appLinkFromALData:ogData destination:url]]; + } + }; + listener.didFailLoadWithError = ^(UIWebView* view, NSError *error) { + if (retainedListener) { + [view removeFromSuperview]; + view.delegate = nil; + retainedListener = nil; + [tcs setError:error]; + } + }; + webView.delegate = listener; + webView.hidden = YES; + [webView loadData:responseData + MIMEType:response.MIMEType + textEncodingName:response.textEncodingName + baseURL:response.URL]; + UIWindow *window = [UIApplication sharedApplication].windows.firstObject; + [window addSubview:webView]; + + return tcs.task; + }]; +} + +/* + Builds up a data structure filled with the app link data from the meta tags on a page. + The structure of this object is a dictionary where each key holds an array of app link + data dictionaries. Values are stored in a key called "_value". + */ +- (NSDictionary *)parseALData:(NSArray *)dataArray { + NSMutableDictionary *al = [NSMutableDictionary dictionary]; + for (NSDictionary *tag in dataArray) { + NSString *name = tag[@"property"]; + if (![name isKindOfClass:[NSString class]]) { + continue; + } + NSArray *nameComponents = [name componentsSeparatedByString:@":"]; + if (![nameComponents[0] isEqualToString:BFWebViewAppLinkResolverMetaTagPrefix]) { + continue; + } + NSMutableDictionary *root = al; + for (int i = 1; i < nameComponents.count; i++) { + NSMutableArray *children = root[nameComponents[i]]; + if (!children) { + children = [NSMutableArray array]; + root[nameComponents[i]] = children; + } + NSMutableDictionary *child = children.lastObject; + if (!child || i == nameComponents.count - 1) { + child = [NSMutableDictionary dictionary]; + [children addObject:child]; + } + root = child; + } + if (tag[@"content"]) { + root[BFWebViewAppLinkResolverDictionaryValueKey] = tag[@"content"]; + } + } + return al; +} + +- (NSDictionary *)getALDataFromLoadedPage:(UIWebView *)webView { + // Run some JavaScript in the webview to fetch the meta tags. + NSString *jsonString = [webView stringByEvaluatingJavaScriptFromString:BFWebViewAppLinkResolverTagExtractionJavaScript]; + NSError *error = nil; + NSArray *arr = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:&error]; + return [self parseALData:arr]; +} + +/* + Converts app link data into a BFAppLink containing the targets relevant for this platform. + */ +- (BFAppLink *)appLinkFromALData:(NSDictionary *)appLinkDict destination:(NSURL *)destination { + NSMutableArray *linkTargets = [NSMutableArray array]; + + NSArray *platformData = nil; + switch (UI_USER_INTERFACE_IDIOM()) { + case UIUserInterfaceIdiomPad: + platformData = @[ appLinkDict[BFWebViewAppLinkResolverIPadKey] ?: @{}, + appLinkDict[BFWebViewAppLinkResolverIOSKey] ?: @{} ]; + break; + case UIUserInterfaceIdiomPhone: + platformData = @[ appLinkDict[BFWebViewAppLinkResolverIPhoneKey] ?: @{}, + appLinkDict[BFWebViewAppLinkResolverIOSKey] ?: @{} ]; + break; + default: + // Future-proofing. Other User Interface idioms should only hit ios. + platformData = @[ appLinkDict[BFWebViewAppLinkResolverIOSKey] ?: @{} ]; + break; + } + + for (NSArray *platformObjects in platformData) { + for (NSDictionary *platformDict in platformObjects) { + // The schema requires a single url/app store id/app name, + // but we could find multiple of them. We'll make a best effort + // to interpret this data. + NSArray *urls = platformDict[BFWebViewAppLinkResolverIOSURLKey]; + NSArray *appStoreIds = platformDict[BFWebViewAppLinkResolverIOSAppStoreIdKey]; + NSArray *appNames = platformDict[BFWebViewAppLinkResolverIOSAppNameKey]; + + NSUInteger maxCount = MAX(urls.count, MAX(appStoreIds.count, appNames.count)); + + for (NSUInteger i = 0; i < maxCount; i++) { + NSString *urlString = urls[i][BFWebViewAppLinkResolverDictionaryValueKey]; + NSURL *url = urlString ? [NSURL URLWithString:urlString] : nil; + NSString *appStoreId = appStoreIds[i][BFWebViewAppLinkResolverDictionaryValueKey]; + NSString *appName = appNames[i][BFWebViewAppLinkResolverDictionaryValueKey]; + BFAppLinkTarget *target = [BFAppLinkTarget appLinkTargetWithURL:url + appStoreId:appStoreId + appName:appName]; + [linkTargets addObject:target]; + } + } + } + + NSDictionary *webDict = appLinkDict[BFWebViewAppLinkResolverWebKey][0]; + NSString *webUrlString = webDict[BFWebViewAppLinkResolverWebURLKey][0][BFWebViewAppLinkResolverDictionaryValueKey]; + NSString *shouldFallbackString = webDict[BFWebViewAppLinkResolverShouldFallbackKey][0][BFWebViewAppLinkResolverDictionaryValueKey]; + + NSURL *webUrl = destination; + + if (shouldFallbackString && + [@[ @"no", @"false", @"0" ] containsObject:[shouldFallbackString lowercaseString]]) { + webUrl = nil; + } + if (webUrl && webUrlString) { + webUrl = [NSURL URLWithString:webUrlString]; + } + + return [BFAppLink appLinkWithSourceURL:destination + targets:linkTargets + webURL:webUrl]; +} + +@end diff --git a/Pods/Bolts/LICENSE b/Pods/Bolts/LICENSE new file mode 100644 index 0000000..e1a5831 --- /dev/null +++ b/Pods/Bolts/LICENSE @@ -0,0 +1,30 @@ +BSD License + +For Bolts software + +Copyright (c) 2013-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Pods/Bolts/README.md b/Pods/Bolts/README.md new file mode 100644 index 0000000..003a2ea --- /dev/null +++ b/Pods/Bolts/README.md @@ -0,0 +1,682 @@ +Bolts +============ +[![Build Status](http://img.shields.io/travis/BoltsFramework/Bolts-iOS/master.svg?style=flat)](https://travis-ci.org/BoltsFramework/Bolts-iOS) +[![Coverage Status](https://codecov.io/github/BoltsFramework/Bolts-iOS/coverage.svg?branch=master)](https://codecov.io/github/BoltsFramework/Bolts-iOS?branch=master) +[![Pod Version](http://img.shields.io/cocoapods/v/Bolts.svg?style=flat)](http://cocoadocs.org/docsets/Bolts/) +[![Pod Platform](http://img.shields.io/cocoapods/p/Bolts.svg?style=flat)](http://cocoadocs.org/docsets/Bolts/) +[![Pod License](http://img.shields.io/cocoapods/l/Bolts.svg?style=flat)](https://github.com/BoltsFramework/Bolts-iOS/blob/master/LICENSE) +[![Dependency Status](https://www.versioneye.com/objective-c/bolts/1.1.1/badge.svg?style=flat)](https://www.versioneye.com/objective-c/bolts) +[![Reference Status](https://www.versioneye.com/objective-c/bolts/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/bolts/references) + +Bolts is a collection of low-level libraries designed to make developing mobile +apps easier. Bolts was designed by Parse and Facebook for our own internal use, +and we have decided to open source these libraries to make them available to +others. Using these libraries does not require using any Parse services. Nor +do they require having a Parse or Facebook developer account. + +Bolts includes: + +* "Tasks", which make organization of complex asynchronous code more manageable. A task is kind of like a JavaScript Promise, but available for iOS and Android. +* An implementation of the [App Links protocol](http://www.applinks.org), helping you link to content in other apps and handle incoming deep-links. + +For more information, see the [Bolts iOS API Reference](http://boltsframework.github.io/docs/ios/). + +# Tasks + +To build a truly responsive iOS application, you must keep long-running operations off of the UI thread, and be careful to avoid blocking anything the UI thread might be waiting on. This means you will need to execute various operations in the background. To make this easier, we've added a class called `BFTask`. A task represents the result of an asynchronous operation. Typically, a `BFTask` is returned from an asynchronous function and gives the ability to continue processing the result of the task. When a task is returned from a function, it's already begun doing its job. A task is not tied to a particular threading model: it represents the work being done, not where it is executing. Tasks have many advantages over other methods of asynchronous programming, such as callbacks. `BFTask` is not a replacement for `NSOperation` or GCD. In fact, they play well together. But tasks do fill in some gaps that those technologies don't address. +* `BFTask` takes care of managing dependencies for you. Unlike using `NSOperation` for dependency management, you don't have to declare all dependencies before starting a `BFTask`. For example, imagine you need to save a set of objects and each one may or may not require saving child objects. With an `NSOperation`, you would normally have to create operations for each of the child saves ahead of time. But you don't always know before you start the work whether that's going to be necessary. That can make managing dependencies with `NSOperation` very painful. Even in the best case, you have to create your dependencies before the operations that depend on them, which results in code that appears in a different order than it executes. With `BFTask`, you can decide during your operation's work whether there will be subtasks and return the other task in just those cases. +* `BFTasks` release their dependencies. `NSOperation` strongly retains its dependencies, so if you have a queue of ordered operations and sequence them using dependencies, you have a leak, because every operation gets retained forever. `BFTasks` release their callbacks as soon as they are run, so everything cleans up after itself. This can reduce memory use, and simplify memory management. +* `BFTasks` keep track of the state of finished tasks: It tracks whether there was a returned value, the task was cancelled, or if an error occurred. It also has convenience methods for propagating errors. With `NSOperation`, you have to build all of this stuff yourself. +* `BFTasks` don't depend on any particular threading model. So it's easy to have some tasks perform their work with an operation queue, while others perform work using blocks with GCD. These tasks can depend on each other seamlessly. +* Performing several tasks in a row will not create nested "pyramid" code as you would get when using only callbacks. +* `BFTasks` are fully composable, allowing you to perform branching, parallelism, and complex error handling, without the spaghetti code of having many named callbacks. +* You can arrange task-based code in the order that it executes, rather than having to split your logic across scattered callback functions. + +For the examples in this doc, assume there are async versions of some common Parse methods, called `saveAsync:` and `findAsync:` which return a `Task`. In a later section, we'll show how to define these functions yourself. + +## The `continueWithBlock` Method + +Every `BFTask` has a method named `continueWithBlock:` which takes a continuation block. A continuation is a block that will be executed when the task is complete. You can then inspect the task to check if it was successful and to get its result. + +```objective-c +// Objective-C +[[self saveAsync:obj] continueWithBlock:^id(BFTask *task) { + if (task.isCancelled) { + // the save was cancelled. + } else if (task.error) { + // the save failed. + } else { + // the object was saved successfully. + PFObject *object = task.result; + } + return nil; +}]; +``` + +```swift +// Swift +self.saveAsync(obj).continueWithBlock { + (task: BFTask!) -> BFTask in + if task.isCancelled() { + // the save was cancelled. + } else if task.error() { + // the save failed. + } else { + // the object was saved successfully. + var object = task.result() as PFObject + } +} +``` + +BFTasks use Objective-C blocks, so the syntax should be pretty straightforward. Let's look closer at the types involved with an example. + +```objective-c +// Objective-C +/** + * Gets an NSString asynchronously. + */ +- (BFTask *)getStringAsync { + // Let's suppose getNumberAsync returns a BFTask whose result is an NSNumber. + return [[self getNumberAsync] continueWithBlock:^id(BFTask *task) { + // This continuation block takes the NSNumber BFTask as input, + // and provides an NSString as output. + + NSNumber *number = task.result; + return [NSString stringWithFormat:@"%@", number]; + )]; +} +``` + +```swift +// Swift +/** + * Gets an NSString asynchronously. + */ +func getStringAsync() -> BFTask { + //Let's suppose getNumberAsync returns a BFTask whose result is an NSNumber. + return self.getNumberAsync().continueWithBlock { + (task: BFTask!) -> NSString in + // This continuation block takes the NSNumber BFTask as input, + // and provides an NSString as output. + + let number = task.result() as NSNumber + return NSString(format:"%@", number) + } +} +``` + +In many cases, you only want to do more work if the previous task was successful, and propagate any errors or cancellations to be dealt with later. To do this, use the `continueWithSuccessBlock:` method instead of `continueWithBlock:`. + +```objective-c +// Objective-C +[[self saveAsync:obj] continueWithSuccessBlock:^id(BFTask *task) { + // the object was saved successfully. + return nil; +}]; +``` + +```swift +// Swift +self.saveAsync(obj).continueWithSuccessBlock { + (task: BFTask!) -> AnyObject! in + // the object was saved successfully. + return nil +} +``` + +## Chaining Tasks Together + +BFTasks are a little bit magical, in that they let you chain them without nesting. If you return a BFTask from `continueWithBlock:`, then the task returned by `continueWithBlock:` will not be considered finished until the new task returned from the new continuation block. This lets you perform multiple actions without incurring the pyramid code you would get with callbacks. Likewise, you can return a `BFTask` from `continueWithSuccessBlock:`. So, return a `BFTask` to do more asynchronous work. + +```objective-c +// Objective-C +PFQuery *query = [PFQuery queryWithClassName:@"Student"]; +[query orderByDescending:@"gpa"]; +[[[[[self findAsync:query] continueWithSuccessBlock:^id(BFTask *task) { + NSArray *students = task.result; + PFObject *valedictorian = [students objectAtIndex:0]; + [valedictorian setObject:@YES forKey:@"valedictorian"]; + return [self saveAsync:valedictorian]; +}] continueWithSuccessBlock:^id(BFTask *task) { + PFObject *valedictorian = task.result; + return [self findAsync:query]; +}] continueWithSuccessBlock:^id(BFTask *task) { + NSArray *students = task.result; + PFObject *salutatorian = [students objectAtIndex:1]; + [salutatorian setObject:@YES forKey:@"salutatorian"]; + return [self saveAsync:salutatorian]; +}] continueWithSuccessBlock:^id(BFTask *task) { + // Everything is done! + return nil; +}]; +``` + +```swift +// Swift +var query = PFQuery(className:"Student") +query.orderByDescending("gpa") +findAsync(query).continueWithSuccessBlock { + (task: BFTask!) -> BFTask in + let students = task.result() as NSArray + var valedictorian = students.objectAtIndex(0) as PFObject + valedictorian["valedictorian"] = true + return self.saveAsync(valedictorian) +}.continueWithSuccessBlock { + (task: BFTask!) -> BFTask in + var valedictorian = task.result() as PFObject + return self.findAsync(query) +}.continueWithSuccessBlock { + (task: BFTask!) -> BFTask in + let students = task.result() as NSArray + var salutatorian = students.objectAtIndex(1) as PFObject + salutatorian["salutatorian"] = true + return self.saveAsync(salutatorian) +}.continueWithSuccessBlock { + (task: BFTask!) -> AnyObject! in + // Everything is done! + return nil +} +``` + +## Error Handling + +By carefully choosing whether to call `continueWithBlock:` or `continueWithSuccessBlock:`, you can control how errors are propagated in your application. Using `continueWithBlock:` lets you handle errors by transforming them or dealing with them. You can think of failed tasks kind of like throwing an exception. In fact, if you throw an exception inside a continuation, the resulting task will be faulted with that exception. + +```objective-c +// Objective-C +PFQuery *query = [PFQuery queryWithClassName:@"Student"]; +[query orderByDescending:@"gpa"]; +[[[[[self findAsync:query] continueWithSuccessBlock:^id(BFTask *task) { + NSArray *students = task.result; + PFObject *valedictorian = [students objectAtIndex:0]; + [valedictorian setObject:@YES forKey:@"valedictorian"]; + // Force this callback to fail. + return [BFTask taskWithError:[NSError errorWithDomain:@"example.com" + code:-1 + userInfo:nil]]; +}] continueWithSuccessBlock:^id(BFTask *task) { + // Now this continuation will be skipped. + PFQuery *valedictorian = task.result; + return [self findAsync:query]; +}] continueWithBlock:^id(BFTask *task) { + if (task.error) { + // This error handler WILL be called. + // The error will be the NSError returned above. + // Let's handle the error by returning a new value. + // The task will be completed with nil as its value. + return nil; + } + // This will also be skipped. + NSArray *students = task.result; + PFObject *salutatorian = [students objectAtIndex:1]; + [salutatorian setObject:@YES forKey:@"salutatorian"]; + return [self saveAsync:salutatorian]; +}] continueWithSuccessBlock:^id(BFTask *task) { + // Everything is done! This gets called. + // The task's result is nil. + return nil; +}]; +``` + +```swift +// Swift +var query = PFQuery(className:"Student") +query.orderByDescending("gpa") +findAsync(query).continueWithSuccessBlock { + (task: BFTask!) -> BFTask in + let students = task.result() as NSArray + var valedictorian = students.objectAtIndex(0) as PFObject + valedictorian["valedictorian"] = true + //Force this callback to fail. + return BFTask(error:NSError(domain:"example.com", + code:-1, userInfo: nil)) +}.continueWithSuccessBlock { + (task: BFTask!) -> AnyObject! in + //Now this continuation will be skipped. + var valedictorian = task.result() as PFObject + return self.findAsync(query) +}.continueWithBlock { + (task: BFTask!) -> AnyObject! in + if task.error() { + // This error handler WILL be called. + // The error will be the NSError returned above. + // Let's handle the error by returning a new value. + // The task will be completed with nil as its value. + return nil + } + // This will also be skipped. + let students = task.result() as NSArray + var salutatorian = students.objectAtIndex(1) as PFObject + salutatorian["salutatorian"] = true + return self.saveAsync(salutatorian) +}.continueWithSuccessBlock { + (task: BFTask!) -> AnyObject! in + // Everything is done! This gets called. + // The tasks result is nil. + return nil +} +``` + +It's often convenient to have a long chain of success callbacks with only one error handler at the end. + +## Creating Tasks + +When you're getting started, you can just use the tasks returned from methods like `findAsync:` or `saveAsync:`. However, for more advanced scenarios, you may want to make your own tasks. To do that, you create a `BFTaskCompletionSource`. This object will let you create a new `BFTask`, and control whether it gets marked as finished or cancelled. After you create a `BFTask`, you'll need to call `setResult:`, `setError:`, or `cancel` to trigger its continuations. + +```objective-c +// Objective-C +- (BFTask *)successAsync { + BFTaskCompletionSource *successful = [BFTaskCompletionSource taskCompletionSource]; + [successful setResult:@"The good result."]; + return successful.task; +} + +- (BFTask *)failAsync { + BFTaskCompletionSource *failed = [BFTaskCompletionSource taskCompletionSource]; + [failed setError:[NSError errorWithDomain:@"example.com" code:-1 userInfo:nil]]; + return failed.task; +} +``` + +```swift +// Swift +func successAsync() -> BFTask { + var successful = BFTaskCompletionSource() + successful.setResult("The good result.") + return successful.task +} + +func failAsync() -> BFTask { + var failed = BFTaskCompletionSource() + failed.setError(NSError(domain:"example.com", code:-1, userInfo:nil)) + return failed.task +} +``` + +If you know the result of a task at the time it is created, there are some convenience methods you can use. + +```objective-c +// Objective-C +BFTask *successful = [BFTask taskWithResult:@"The good result."]; + +BFTask *failed = [BFTask taskWithError:anError]; +``` + +```swift +// Swift +let successful = BFTask(result:"The good result") + +let failed = BFTask(error:anError) +``` + +## Creating Async Methods + +With these tools, it's easy to make your own asynchronous functions that return tasks. For example, you can make a task-based version of `fetchAsync:` easily. + +```objective-c +// Objective-C +- (BFTask *) fetchAsync:(PFObject *)object { + BFTaskCompletionSource *task = [BFTaskCompletionSource taskCompletionSource]; + [object fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) { + if (!error) { + [task setResult:object]; + } else { + [task setError:error]; + } + }]; + return task.task; +} +``` + +```swift +// Swift +func fetchAsync(object: PFObject) -> BFTask { + var task = BFTaskCompletionSource() + object.fetchInBackgroundWithBlock { + (object: PFObject?, error: NSError?) -> Void in + if error == nil { + task.setResult(object) + } else { + task.setError(error) + } + } + return task.task +} + +``` + +It's similarly easy to create `saveAsync:`, `findAsync:` or `deleteAsync:`. + +## Tasks in Series + +`BFTasks` are convenient when you want to do a series of tasks in a row, each one waiting for the previous to finish. For example, imagine you want to delete all of the comments on your blog. + +```objective-c +// Objective-C +PFQuery *query = [PFQuery queryWithClassName:@"Comments"]; +[query whereKey:@"post" equalTo:@123]; + +[[[self findAsync:query] continueWithBlock:^id(BFTask *task) { + NSArray *results = task.result; + + // Create a trivial completed task as a base case. + BFTask *task = [BFTask taskWithResult:nil]; + for (PFObject *result in results) { + // For each item, extend the task with a function to delete the item. + task = [task continueWithBlock:^id(BFTask *task) { + // Return a task that will be marked as completed when the delete is finished. + return [self deleteAsync:result]; + }]; + } + return task; +}] continueWithBlock:^id(BFTask *task) { + // Every comment was deleted. + return nil; +}]; +``` + +```swift +// Swift +var query = PFQuery(className:"Comments") +query.whereKey("post", equalTo:123) +findAsync(query).continueWithBlock { + (task: BFTask!) -> BFTask in + let results = task.result() as NSArray + + // Create a trivial completed task as a base case. + let task = BFTask(result:nil) + for result : PFObject in results { + // For each item, extend the task with a function to delete the item. + task = task.continueWithBlock { + (task: BFTask!) -> BFTask in + return self.deleteAsync(result) + } + } + return task +}.continueWithBlock { + (task: BFTask!) -> AnyObject! in + // Every comment was deleted. + return nil +} +``` + +## Tasks in Parallel + +You can also perform several tasks in parallel, using the `taskForCompletionOfAllTasks:` method. You can start multiple operations at once, and use `taskForCompletionOfAllTasks:` to create a new task that will be marked as completed when all of its input tasks are completed. The new task will be successful only if all of the passed-in tasks succeed. Performing operations in parallel will be faster than doing them serially, but may consume more system resources and bandwidth. + +```objective-c +// Objective-C +PFQuery *query = [PFQuery queryWithClassName:@"Comments"]; +[query whereKey:@"post" equalTo:@123]; + +[[[self findAsync:query] continueWithBlock:^id(BFTask *results) { + // Collect one task for each delete into an array. + NSMutableArray *tasks = [NSMutableArray array]; + for (PFObject *result in results) { + // Start this delete immediately and add its task to the list. + [tasks addObject:[self deleteAsync:result]]; + } + // Return a new task that will be marked as completed when all of the deletes are + // finished. + return [BFTask taskForCompletionOfAllTasks:tasks]; +}] continueWithBlock:^id(BFTask *task) { + // Every comment was deleted. + return nil; +}]; +``` + +```swift +// Swift +var query = PFQuery(className:"Comments") +query.whereKey("post", equalTo:123) + +findAsync(query).continueWithBlock { + (task: BFTask!) -> BFTask in + // Collect one task for each delete into an array. + var tasks = NSMutableArray.array() + var results = task.result() as NSArray + for result : PFObject! in results { + // Start this delete immediately and add its task to the list. + tasks.addObject(self.deleteAsync(result)) + } + // Return a new task that will be marked as completed when all of the deletes + // are finished. + return BFTask(forCompletionOfAllTasks:tasks) +}.continueWithBlock { + (task: BFTask!) -> AnyObject! in + // Every comment was deleted. + return nil +} +``` + +## Task Executors + +Both `continueWithBlock:` and `continueWithSuccessBlock:` methods have another form that takes an instance of `BFExecutor`. These are `continueWithExecutor:withBlock:` and `continueWithExecutor:withSuccessBlock:`. These methods allow you to control how the continuation is executed. The default executor will dispatch to GCD, but you can provide your own executor to schedule work onto a different thread. For example, if you want to continue with work on the UI thread: + +```objective-c +// Create a BFExecutor that uses the main thread. +BFExecutor *myExecutor = [BFExecutor executorWithBlock:^void(void(^block)()) { + dispatch_async(dispatch_get_main_queue(), block); +}]; + +// And use the Main Thread Executor like this. The executor applies only to the new +// continuation being passed into continueWithBlock. +[[self fetchAsync:object] continueWithExecutor:myExecutor withBlock:^id(BFTask *task) { + myTextView.text = [object objectForKey:@"name"]; +}]; +``` + +For common cases, such as dispatching on the main thread, we have provided default implementations of `BFExecutor`. These include `defaultExecutor`, `immediateExecutor`, `mainThreadExecutor`, `executorWithDispatchQueue:`, and `executorWithOperationQueue:`. For example: + +```objective-c +// Continue on the Main Thread, using a built-in executor. +[[self fetchAsync:object] continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task) { + myTextView.text = [object objectForKey:@"name"]; +}]; +``` + +## Task Cancellation + +It's generally bad design to keep track of the `BFTaskCompletionSource` for cancellation. A better model is to create a "cancellation token" at the top level, and pass that to each async function that you want to be part of the same "cancelable operation". Then, in your continuation blocks, you can check whether the cancellation token has been cancelled and bail out early by returning a `[BFTask cancelledTask]`. For example: + +```objective-c +- (void)doSomethingComplicatedAsync:(MYCancellationToken *)cancellationToken { + [[self doSomethingAsync:cancellationToken] continueWithBlock:^{ + if (cancellationToken.isCancelled) { + return [BFTask cancelledTask]; + } + // Do something that takes a while. + return result; + }]; +} + +// Somewhere else. +MYCancellationToken *cancellationToken = [[MYCancellationToken alloc] init]; +[obj doSomethingComplicatedAsync:cancellationToken]; + +// When you get bored... +[cancellationToken cancel]; +``` + +**Note:** The cancellation token implementation should be thread-safe. +We are likely to add some concept like this to Bolts at some point in the future. + +# App Links + +[App Links](http://www.applinks.org) provide a cross-platform mechanism that allows a developer to define and publish a deep-linking scheme for their content, allowing other apps to link directly to an experience optimized for the device they are running on. Whether you are building an app that receives incoming links or one that may link out to other apps' content, Bolts provides tools to simplify implementation of the [App Links protocol](http://www.applinks.org/documentation). + +## Handling an App Link + +The most common case will be making your app receive App Links. In-linking will allow your users to quickly access the richest, most native-feeling presentation of linked content on their devices. Bolts makes it easy to handle an inbound App Link (as well as general inbound deep-links) by providing utilities for processing an incoming URL. + +For example, you can use the `BFURL` utility class to parse an incoming URL in your `AppDelegate`: + +```objective-c +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation { + BFURL *parsedUrl = [BFURL URLWithInboundURL:url sourceApplication:sourceApplication]; + + // Use the target URL from the App Link to locate content. + if ([parsedUrl.targetURL.pathComponents[1] isEqualToString:@"profiles"]) { + // Open a profile viewer. + } + + // You can also check the query string easily. + NSString *query = parsedUrl.targetQueryParameters[@"query"]; + + // Apps that have existing deep-linking support and map their App Links to existing + // deep-linking functionality may instead want to perform these operations on the input URL. + // Use the target URL from the App Link to locate content. + if ([parsedUrl.inputURL.pathComponents[1] isEqualToString:@"profiles"]) { + // Open a profile viewer. + } + + // You can also check the query string easily. + NSString *query = parsedUrl.inputQueryParameters[@"query"]; + + // Apps can easily check the Extras and App Link data from the App Link as well. + NSString *fbAccessToken = parsedUrl.appLinkExtras[@"fb_access_token"]; + NSDictionary *refererData = parsedUrl.appLinkExtras[@"referer"]; +} +``` + +## Navigating to a URL + +Following an App Link allows your app to provide the best user experience (as defined by the receiving app) when a user navigates to a link. Bolts makes this process simple, automating the steps required to follow a link: + +1. Resolve the App Link by getting the App Link metadata from the HTML at the URL specified. +2. Step through App Link targets relevant to the device being used, checking whether the app that can handle the target is present on the device. +3. If an app is present, build a URL with the appropriate al_applink_data specified and navigate to that URL. +4. Otherwise, open the browser with the original URL specified. + +In the simplest case, it takes just one line of code to navigate to a URL that may have an App Link: + +```objective-c +[BFAppLinkNavigation navigateToURLInBackground:url]; +``` + +### Adding App and Navigation Data + +Under most circumstances, the data that will need to be passed along to an app during a navigation will be contained in the URL itself, so that whether or not the app is actually installed on the device, users are taken to the correct content. Occasionally, however, apps will want to pass along data that is relevant for app-to-app navigation, or will want to augment the App Link protocol with information that might be used by the app to adjust how the app should behave (e.g. showing a link back to the referring app). + +If you want to take advantage of these features, you can break apart the navigation process. First, you must have an App Link to which you wish to navigate: + +```objective-c +[[BFAppLinkNavigation resolveAppLinkInBackground:url] continueWithSuccessBlock:^id(BFTask *task) { + BFAppLink *link = task.result; +}]; +``` + +Then, you can build an App Link request with any additional data you would like and navigate: + +```objective-c +BFAppLinkNavigation *navigation = [BFAppLinkNavigation navigationWithAppLink:link + extras:@{ @"access_token": @"t0kEn" } + appLinkData:@{ @"ref": @"12345" }]; +NSError *error = nil; +[navigation navigate:&error]; +``` + +### Resolving App Link Metadata + +Bolts allows for custom App Link resolution, which may be used as a performance optimization (e.g. caching the metadata) or as a mechanism to allow developers to use a centralized index for obtaining App Link metadata. A custom App Link resolver just needs to be able to take a URL and return a `BFAppLink` containing the ordered list of `BFAppLinkTarget`s that are applicable for this device. Bolts provides one of these out of the box that performs this resolution on the device using a hidden UIWebView. + +You can use any resolver that implements the `BFAppLinkResolving` protocol by using one of the overloads on `BFAppLinkNavigation`: + +```objective-c +[BFAppLinkNavigation navigateToURLInBackground:url + resolver:resolver]; +``` + +Alternatively, a you can swap out the default resolver to be used by the built-in APIs: + +```objective-c +[BFAppLinkNavigation setDefaultResolver:resolver]; +[BFAppLinkNavigation navigateToURLInBackground:url]; +``` + +## App Link Return-to-Referer View + +When an application is opened via an App Link, a banner allowing the user to "Touch to return to " should be displayed. The `BFAppLinkReturnToRefererView` provides this functionality. It will take an incoming App Link and parse the referer information to display the appropriate calling app name. + +```objective-c +- (void)viewDidLoad { + [super viewDidLoad]; + + // Perform other view initialization. + + self.returnToRefererController = [[BFAppLinkReturnToRefererController alloc] init]; + + // self.returnToRefererView is a BFAppLinkReturnToRefererView. + // You may initialize the view either by loading it from a NIB or programmatically. + self.returnToRefererController.view = self.returnToRefererView; + + // If you have a UINavigationController in the view, then the bar must be shown above it. + [self.returnToRefererController] +} +``` + +The following code assumes that the view controller has an `openedAppLinkURL` `NSURL` property that has already been populated with the URL used to open the app. You can then do something like this to show the view: + +```objective-c +- (void)viewWillAppear { + [super viewWillAppear]; + + // Show only if you have a back AppLink. + [self.returnToRefererController showViewForRefererURL:self.openedAppLinkURL]; +} +``` + +In a navigaton-controller view hierarchy, the banner should be displayed above the navigation bar, and `BFAppLinkReturnToRefererController` provides an `initForDisplayAboveNavController` method to assist with this. + +## Analytics + +Bolts introduces Measurement Event. App Links posts three different Measurement Event notifications to the application, which can be caught and integrated with existing analytics components in your application. + +* `al_nav_out` — Raised when your app switches out to an App Links URL. +* `al_nav_in` — Raised when your app opens an incoming App Links URL. +* `al_ref_back_out` — Raised when your app returns back the referrer app using the built-in top navigation back bar view. + +### Listen for App Links Measurement Events + +There are other analytics tools that are integrated with Bolts' App Links events, but you can also listen for these events yourself: + +```objective-c +[[NSNotificationCenter defaultCenter] addObserverForName:BFMeasurementEventNotificationName object:nil queue:nil usingBlock:^(NSNotification *note) { + NSDictionary *event = note.userInfo; + NSDictionary *eventData = event[BFMeasurementEventArgsKey]; + // Integrate to your logging/analytics component. +}]; +``` + +### App Links Event Fields + +App Links Measurement Events sends additional information from App Links Intents in flattened string key value pairs. Here are some of the useful fields for the three events. + +* `al_nav_in` + * `inputURL`: the URL that opens the app. + * `inputURLScheme`: the scheme of `inputURL`. + * `refererURL`: the URL that the referrer app added into `al_applink_data`: `referer_app_link`. + * `refererAppName`: the app name that the referrer app added to `al_applink_data`: `referer_app_link`. + * `sourceApplication`: the bundle of referrer application. + * `targetURL`: the `target_url` field in `al_applink_data`. + * `version`: App Links API version. + +* `al_nav_out` / `al_ref_back_out` + * `outputURL`: the URL used to open the other app (or browser). If there is an eligible app to open, this will be the custom scheme url/intent in `al_applink_data`. + * `outputURLScheme`: the scheme of `outputURL`. + * `sourceURL`: the URL of the page hosting App Links meta tags. + * `sourceURLHost`: the hostname of `sourceURL`. + * `success`: `“1”` to indicate success in opening the App Link in another app or browser; `“0”` to indicate failure to open the App Link. + * `type`: `“app”` for open in app, `“web”` for open in browser; `“fail”` when the success field is `“0”`. + * `version`: App Links API version. + +# Installation + +You can download the latest framework files from our [Releases page](https://github.com/BoltsFramework/Bolts-iOS/releases). + +Bolts is also available through [CocoaPods](http://cocoapods.org). To install it simply add the following line to your Podfile: + + pod 'Bolts' diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h new file mode 100644 index 0000000..4ed0656 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h @@ -0,0 +1,166 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import + +/*! + @abstract Notification indicating that the `currentAccessToken` has changed. + @discussion the userInfo dictionary of the notification will contain keys + `FBSDKAccessTokenChangeOldKey` and + `FBSDKAccessTokenChangeNewKey`. + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeNotification; + +/*! + @abstract A key in the notification's userInfo that will be set + if and only if the user ID changed between the old and new tokens. + @discussion Token refreshes can occur automatically with the SDK + which do not change the user. If you're only interested in user + changes (such as logging out), you should check for the existence + of this key. The value is a NSNumber with a boolValue. + + On a fresh start of the app where the SDK reads in the cached value + of an access token, this key will also exist since the access token + is moving from a null state (no user) to a non-null state (user). + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeUserID; + +/* + @abstract key in notification's userInfo object for getting the old token. + @discussion If there was no old token, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeOldKey; + +/* + @abstract key in notification's userInfo object for getting the new token. + @discussion If there is no new token, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeNewKey; + + +/*! + @class FBSDKAccessToken + @abstract Represents an immutable access token for using Facebook services. + */ +@interface FBSDKAccessToken : NSObject + +/*! + @abstract Returns the app ID. + */ +@property (readonly, copy, nonatomic) NSString *appID; + +/*! + @abstract Returns the known declined permissions. + */ +@property (readonly, copy, nonatomic) NSSet *declinedPermissions; + +/*! + @abstract Returns the expiration date. + */ +@property (readonly, copy, nonatomic) NSDate *expirationDate; + +/*! + @abstract Returns the known granted permissions. + */ +@property (readonly, copy, nonatomic) NSSet *permissions; + +/*! + @abstract Returns the date the token was last refreshed. +*/ +@property (readonly, copy, nonatomic) NSDate *refreshDate; + +/*! + @abstract Returns the opaque token string. + */ +@property (readonly, copy, nonatomic) NSString *tokenString; + +/*! + @abstract Returns the user ID. + */ +@property (readonly, copy, nonatomic) NSString *userID; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/*! + @abstract Initializes a new instance. + @param tokenString the opaque token string. + @param permissions the granted permissions. Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + @param declinedPermissions the declined permissions. Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + @param appID the app ID. + @param userID the user ID. + @param expirationDate the optional expiration date (defaults to distantFuture). + @param refreshDate the optional date the token was last refreshed (defaults to today). + @discussion This initializer should only be used for advanced apps that + manage tokens explicitly. Typical login flows only need to use `FBSDKLoginManager` + along with `+currentAccessToken`. + */ +- (instancetype)initWithTokenString:(NSString *)tokenString + permissions:(NSArray *)permissions + declinedPermissions:(NSArray *)declinedPermissions + appID:(NSString *)appID + userID:(NSString *)userID + expirationDate:(NSDate *)expirationDate + refreshDate:(NSDate *)refreshDate +NS_DESIGNATED_INITIALIZER; + +/*! + @abstract Convenience getter to determine if a permission has been granted + @param permission The permission to check. + */ +- (BOOL)hasGranted:(NSString *)permission; + +/*! + @abstract Compares the receiver to another FBSDKAccessToken + @param token The other token + @return YES if the receiver's values are equal to the other token's values; otherwise NO + */ +- (BOOL)isEqualToAccessToken:(FBSDKAccessToken *)token; + +/*! + @abstract Returns the "global" access token that represents the currently logged in user. + @discussion The `currentAccessToken` is a convenient representation of the token of the + current user and is used by other SDK components (like `FBSDKLoginManager`). + */ ++ (FBSDKAccessToken *)currentAccessToken; + +/*! + @abstract Sets the "global" access token that represents the currently logged in user. + @param token The access token to set. + @discussion This will broadcast a notification and save the token to the app keychain. + */ ++ (void)setCurrentAccessToken:(FBSDKAccessToken *)token; + +/*! + @abstract Refresh the current access token's permission state and extend the token's expiration date, + if possible. + @param completionHandler an optional callback handler that can surface any errors related to permission refreshing. + @discussion On a successful refresh, the currentAccessToken will be updated so you typically only need to + observe the `FBSDKAccessTokenDidChangeNotification` notification. + + If a token is already expired, it cannot be refreshed. + */ ++ (void)refreshCurrentAccessToken:(FBSDKGraphRequestHandler)completionHandler; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m new file mode 100644 index 0000000..456400b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m @@ -0,0 +1,200 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessToken.h" + +#import "FBSDKGraphRequestPiggybackManager.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKMath.h" +#import "FBSDKSettings+Internal.h" + +NSString *const FBSDKAccessTokenDidChangeNotification = @"com.facebook.sdk.FBSDKAccessTokenData.FBSDKAccessTokenDidChangeNotification"; +NSString *const FBSDKAccessTokenDidChangeUserID = @"FBSDKAccessTokenDidChangeUserID"; +NSString *const FBSDKAccessTokenChangeNewKey = @"FBSDKAccessToken"; +NSString *const FBSDKAccessTokenChangeOldKey = @"FBSDKAccessTokenOld"; + +static FBSDKAccessToken *g_currentAccessToken; + +#define FBSDK_ACCESSTOKEN_TOKENSTRING_KEY @"tokenString" +#define FBSDK_ACCESSTOKEN_PERMISSIONS_KEY @"permissions" +#define FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY @"declinedPermissions" +#define FBSDK_ACCESSTOKEN_APPID_KEY @"appID" +#define FBSDK_ACCESSTOKEN_USERID_KEY @"userID" +#define FBSDK_ACCESSTOKEN_REFRESHDATE_KEY @"refreshDate" +#define FBSDK_ACCESSTOKEN_EXPIRATIONDATE_KEY @"expirationDate" + +@implementation FBSDKAccessToken + +- (instancetype)init NS_UNAVAILABLE +{ + assert(0); +} + +- (instancetype)initWithTokenString:(NSString *)tokenString + permissions:(NSArray *)permissions + declinedPermissions:(NSArray *)declinedPermissions + appID:(NSString *)appID + userID:(NSString *)userID + expirationDate:(NSDate *)expirationDate + refreshDate:(NSDate *)refreshDate +{ + if ((self = [super init])) { + _tokenString = [tokenString copy]; + _permissions = [NSSet setWithArray:permissions]; + _declinedPermissions = [NSSet setWithArray:declinedPermissions]; + _appID = [appID copy]; + _userID = [userID copy]; + _expirationDate = [expirationDate copy] ?: [NSDate distantFuture]; + _refreshDate = [refreshDate copy] ?: [NSDate date]; + } + return self; +} + +- (BOOL)hasGranted:(NSString *)permission +{ + return [self.permissions containsObject:permission]; +} + ++ (FBSDKAccessToken *)currentAccessToken +{ + return g_currentAccessToken; +} + ++ (void)setCurrentAccessToken:(FBSDKAccessToken *)token +{ + if (token != g_currentAccessToken) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [FBSDKInternalUtility dictionary:userInfo setObject:token forKey:FBSDKAccessTokenChangeNewKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:g_currentAccessToken forKey:FBSDKAccessTokenChangeOldKey]; + if (![g_currentAccessToken.userID isEqualToString:token.userID]) { + userInfo[FBSDKAccessTokenDidChangeUserID] = @YES; + } + + g_currentAccessToken = token; + + // Only need to keep current session in web view for the case when token is current + // When token is abandoned cookies must to be cleaned up immediatelly + if (token == nil) { + [FBSDKInternalUtility deleteFacebookCookies]; + } + + [[FBSDKSettings accessTokenCache] cacheAccessToken:token]; + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAccessTokenDidChangeNotification + object:[self class] + userInfo:userInfo]; + } +} + ++ (void)refreshCurrentAccessToken:(FBSDKGraphRequestHandler)completionHandler +{ + if ([FBSDKAccessToken currentAccessToken]) { + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + [FBSDKGraphRequestPiggybackManager addRefreshPiggyback:connection permissionHandler:completionHandler]; + [connection start]; + } else { + if (completionHandler) { + completionHandler(nil, nil, [FBSDKError errorWithCode:FBSDKAccessTokenRequiredErrorCode message:@"No current access token to refresh"]); + } + } +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [self.tokenString hash], + [self.permissions hash], + [self.declinedPermissions hash], + [self.appID hash], + [self.userID hash], + [self.refreshDate hash], + [self.expirationDate hash] + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKAccessToken class]]) { + return NO; + } + return [self isEqualToAccessToken:(FBSDKAccessToken *)object]; +} + +- (BOOL)isEqualToAccessToken:(FBSDKAccessToken *)token +{ + return (token && + [FBSDKInternalUtility object:self.tokenString isEqualToObject:token.tokenString] && + [FBSDKInternalUtility object:self.permissions isEqualToObject:token.permissions] && + [FBSDKInternalUtility object:self.declinedPermissions isEqualToObject:token.declinedPermissions] && + [FBSDKInternalUtility object:self.appID isEqualToObject:token.appID] && + [FBSDKInternalUtility object:self.userID isEqualToObject:token.userID] && + [FBSDKInternalUtility object:self.refreshDate isEqualToObject:token.refreshDate] && + [FBSDKInternalUtility object:self.expirationDate isEqualToObject:token.expirationDate] ); +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + // we're immutable. + return self; +} + +#pragma mark NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_APPID_KEY]; + NSSet *declinedPermissions = [decoder decodeObjectOfClass:[NSSet class] forKey:FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY]; + NSSet *permissions = [decoder decodeObjectOfClass:[NSSet class] forKey:FBSDK_ACCESSTOKEN_PERMISSIONS_KEY]; + NSString *tokenString = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_TOKENSTRING_KEY]; + NSString *userID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_USERID_KEY]; + NSDate *refreshDate = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_ACCESSTOKEN_REFRESHDATE_KEY]; + NSDate *expirationDate = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_ACCESSTOKEN_EXPIRATIONDATE_KEY]; + + return [self initWithTokenString:tokenString + permissions:[permissions allObjects] + declinedPermissions:[declinedPermissions allObjects] + appID:appID + userID:userID + expirationDate:expirationDate + refreshDate:refreshDate]; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:self.appID forKey:FBSDK_ACCESSTOKEN_APPID_KEY]; + [encoder encodeObject:self.declinedPermissions forKey:FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY]; + [encoder encodeObject:self.permissions forKey:FBSDK_ACCESSTOKEN_PERMISSIONS_KEY]; + [encoder encodeObject:self.tokenString forKey:FBSDK_ACCESSTOKEN_TOKENSTRING_KEY]; + [encoder encodeObject:self.userID forKey:FBSDK_ACCESSTOKEN_USERID_KEY]; + [encoder encodeObject:self.expirationDate forKey:FBSDK_ACCESSTOKEN_EXPIRATIONDATE_KEY]; + [encoder encodeObject:self.refreshDate forKey:FBSDK_ACCESSTOKEN_REFRESHDATE_KEY]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h new file mode 100644 index 0000000..375d413 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h @@ -0,0 +1,462 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKMacros.h" + +@class FBSDKAccessToken; +@class FBSDKGraphRequest; + +/*! @abstract NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */ +FBSDK_EXTERN NSString *const FBSDKAppEventsLoggingResultNotification; + +/*! @abstract optional plist key ("FacebookLoggingOverrideAppID") for setting `loggingOverrideAppID` */ +FBSDK_EXTERN NSString *const FBSDKAppEventsOverrideAppIDBundleKey; + +/*! + + @typedef NS_ENUM (NSUInteger, FBSDKAppEventsFlushBehavior) + + @abstract Specifies when `FBSDKAppEvents` sends log events to the server. + + */ +typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushBehavior) +{ + + /*! Flush automatically: periodically (once a minute or every 100 logged events) and always at app reactivation. */ + FBSDKAppEventsFlushBehaviorAuto = 0, + + /*! Only flush when the `flush` method is called. When an app is moved to background/terminated, the + events are persisted and re-established at activation, but they will only be written with an + explicit call to `flush`. */ + FBSDKAppEventsFlushBehaviorExplicitOnly, + +}; + +/*! + @methodgroup Predefined event names for logging events common to many apps. Logging occurs through the `logEvent` family of methods on `FBSDKAppEvents`. + Common event parameters are provided in the `FBSDKAppEventsParameterNames*` constants. + */ + +/*! Log this event when the user has achieved a level in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAchievedLevel; + +/*! Log this event when the user has entered their payment info. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedPaymentInfo; + +/*! Log this event when the user has added an item to their cart. The valueToSum passed to logEvent should be the item's price. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToCart; + +/*! Log this event when the user has added an item to their wishlist. The valueToSum passed to logEvent should be the item's price. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToWishlist; + +/*! Log this event when a user has completed registration with the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedRegistration; + +/*! Log this event when the user has completed a tutorial in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedTutorial; + +/*! Log this event when the user has entered the checkout process. The valueToSum passed to logEvent should be the total price in the cart. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameInitiatedCheckout; + +/*! Log this event when the user has rated an item in the app. The valueToSum passed to logEvent should be the numeric rating. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameRated; + +/*! Log this event when a user has performed a search within the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameSearched; + +/*! Log this event when the user has spent app credits. The valueToSum passed to logEvent should be the number of credits spent. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameSpentCredits; + +/*! Log this event when the user has unlocked an achievement in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameUnlockedAchievement; + +/*! Log this event when a user has viewed a form of content in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameViewedContent; + +/*! + @methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logEvent` family + of methods on `FBSDKAppEvents`. Common event names are provided in the `FBAppEventName*` constants. + */ + +/*! Parameter key used to specify an ID for the specific piece of content being logged about. Could be an EAN, article identifier, etc., depending on the nature of the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentID; + +/*! Parameter key used to specify a generic content type/family for the logged event, e.g. "music", "photo", "video". Options to use will vary based upon what the app is all about. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentType; + +/*! Parameter key used to specify currency used with logged event. E.g. "USD", "EUR", "GBP". See ISO-4217 for specific values. One reference for these is . */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameCurrency; + +/*! Parameter key used to specify a description appropriate to the event being logged. E.g., the name of the achievement unlocked in the `FBAppEventNameAchievementUnlocked` event. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameDescription; + +/*! Parameter key used to specify the level achieved in a `FBAppEventNameAchieved` event. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameLevel; + +/*! Parameter key used to specify the maximum rating available for the `FBAppEventNameRate` event. E.g., "5" or "10". */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameMaxRatingValue; + +/*! Parameter key used to specify how many items are being processed for an `FBAppEventNameInitiatedCheckout` or `FBAppEventNamePurchased` event. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameNumItems; + +/*! Parameter key used to specify whether payment info is available for the `FBAppEventNameInitiatedCheckout` event. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable; + +/*! Parameter key used to specify method user has used to register for the app, e.g., "Facebook", "email", "Twitter", etc */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameRegistrationMethod; + +/*! Parameter key used to specify the string provided by the user for a search operation. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSearchString; + +/*! Parameter key used to specify whether the activity being logged about was successful or not. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSuccess; + +/* + @methodgroup Predefined values to assign to event parameters that accompany events logged through the `logEvent` family + of methods on `FBSDKAppEvents`. Common event parameters are provided in the `FBSDKAppEventParameterName*` constants. + */ + +/*! Yes-valued parameter value to be used with parameter keys that need a Yes/No value */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueYes; + +/*! No-valued parameter value to be used with parameter keys that need a Yes/No value */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueNo; + + +/*! + + @class FBSDKAppEvents + + @abstract + Client-side event logging for specialized application analytics available through Facebook App Insights + and for use with Facebook Ads conversion tracking and optimization. + + @discussion + The `FBSDKAppEvents` static class has a few related roles: + + + Logging predefined and application-defined events to Facebook App Insights with a + numeric value to sum across a large number of events, and an optional set of key/value + parameters that define "segments" for this event (e.g., 'purchaserStatus' : 'frequent', or + 'gamerLevel' : 'intermediate') + + + Logging events to later be used for ads optimization around lifetime value. + + + Methods that control the way in which events are flushed out to the Facebook servers. + + Here are some important characteristics of the logging mechanism provided by `FBSDKAppEvents`: + + + Events are not sent immediately when logged. They're cached and flushed out to the Facebook servers + in a number of situations: + - when an event count threshold is passed (currently 100 logged events). + - when a time threshold is passed (currently 15 seconds). + - when an app has gone to background and is then brought back to the foreground. + + + Events will be accumulated when the app is in a disconnected state, and sent when the connection is + restored and one of the above 'flush' conditions are met. + + + The `FBSDKAppEvents` class is thread-safe in that events may be logged from any of the app's threads. + + + The developer can set the `flushBehavior` on `FBSDKAppEvents` to force the flushing of events to only + occur on an explicit call to the `flush` method. + + + The developer can turn on console debug output for event logging and flushing to the server by using + the `FBSDKLoggingBehaviorAppEvents` value in `[FBSettings setLoggingBehavior:]`. + + Some things to note when logging events: + + + There is a limit on the number of unique event names an app can use, on the order of 1000. + + There is a limit to the number of unique parameter names in the provided parameters that can + be used per event, on the order of 25. This is not just for an individual call, but for all + invocations for that eventName. + + Event names and parameter names (the keys in the NSDictionary) must be between 2 and 40 characters, and + must consist of alphanumeric characters, _, -, or spaces. + + The length of each parameter value can be no more than on the order of 100 characters. + + */ +@interface FBSDKAppEvents : NSObject + +/* + * Basic event logging + */ + +/*! + + @abstract + Log an event with just an eventName. + + @param eventName The name of the event to record. Limitations on number of events and name length + are given in the `FBSDKAppEvents` documentation. + + */ ++ (void)logEvent:(NSString *)eventName; + +/*! + + @abstract + Log an event with an eventName and a numeric value to be aggregated with other events of this name. + + @param eventName The name of the event to record. Limitations on number of events and name length + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report + the cumulative and average value of this amount. + */ ++ (void)logEvent:(NSString *)eventName + valueToSum:(double)valueToSum; + + +/*! + + @abstract + Log an event with an eventName and a set of key/value pairs in the parameters dictionary. + Parameter limitations are described above. + + @param eventName The name of the event to record. Limitations on number of events and name construction + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + */ ++ (void)logEvent:(NSString *)eventName + parameters:(NSDictionary *)parameters; + +/*! + + @abstract + Log an event with an eventName, a numeric value to be aggregated with other events of this name, + and a set of key/value pairs in the parameters dictionary. + + @param eventName The name of the event to record. Limitations on number of events and name construction + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report + the cumulative and average value of this amount. + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + */ ++ (void)logEvent:(NSString *)eventName + valueToSum:(double)valueToSum + parameters:(NSDictionary *)parameters; + + +/*! + + @abstract + Log an event with an eventName, a numeric value to be aggregated with other events of this name, + and a set of key/value pairs in the parameters dictionary. Providing session lets the developer + target a particular . If nil is provided, then `[FBSession activeSession]` will be used. + + @param eventName The name of the event to record. Limitations on number of events and name construction + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report + the cumulative and average value of this amount. Note that this is an NSNumber, and a value of `nil` denotes + that this event doesn't have a value associated with it for summation. + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + @param accessToken The optional access token to log the event as. + */ ++ (void)logEvent:(NSString *)eventName + valueToSum:(NSNumber *)valueToSum + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken; + +/* + * Purchase logging + */ + +/*! + + @abstract + Log a purchase of the specified amount, in the specified currency. + + @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency. This value + will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). + + @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for + specific values. One reference for these is . + + @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set + to `FBSDKAppEventsFlushBehaviorExplicitOnly`. + + */ ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency; + +/*! + + @abstract + Log a purchase of the specified amount, in the specified currency, also providing a set of + additional characteristics describing the purchase. + + @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency.This value + will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). + + @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for + specific values. One reference for these is . + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set + to `FBSDKAppEventsFlushBehaviorExplicitOnly`. + + */ ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency + parameters:(NSDictionary *)parameters; + +/*! + + @abstract + Log a purchase of the specified amount, in the specified currency, also providing a set of + additional characteristics describing the purchase, as well as an to log to. + + @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency.This value + will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). + + @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for + specific values. One reference for these is . + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + @param accessToken The optional access token to log the event as. + + @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set + to `FBSDKAppEventsFlushBehaviorExplicitOnly`. + + */ ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken; + +/*! + + @abstract + Notifies the events system that the app has launched and, when appropriate, logs an "activated app" event. Should typically be placed in the + app delegates' `applicationDidBecomeActive:` method. + + This method also takes care of logging the event indicating the first time this app has been launched, which, among other things, is used to + track user acquisition and app install ads conversions. + + @discussion + `activateApp` will not log an event on every app launch, since launches happen every time the app is backgrounded and then foregrounded. + "activated app" events will be logged when the app has not been active for more than 60 seconds. This method also causes a "deactivated app" + event to be logged when sessions are "completed", and these events are logged with the session length, with an indication of how much + time has elapsed between sessions, and with the number of background/foreground interruptions that session had. This data + is all visible in your app's App Events Insights. + */ ++ (void)activateApp; + +/* + * Control over event batching/flushing + */ + +/*! + + @abstract + Get the current event flushing behavior specifying when events are sent back to Facebook servers. + */ ++ (FBSDKAppEventsFlushBehavior)flushBehavior; + +/*! + + @abstract + Set the current event flushing behavior specifying when events are sent back to Facebook servers. + + @param flushBehavior The desired `FBSDKAppEventsFlushBehavior` to be used. + */ ++ (void)setFlushBehavior:(FBSDKAppEventsFlushBehavior)flushBehavior; + +/*! + @abstract + Set the 'override' App ID for App Event logging. + + @discussion + In some cases, apps want to use one Facebook App ID for login and social presence and another + for App Event logging. (An example is if multiple apps from the same company share an app ID for login, but + want distinct logging.) By default, this value is `nil`, and defers to the `FBSDKAppEventsOverrideAppIDBundleKey` + plist value. If that's not set, it defaults to `[FBSDKSettings appID]`. + + This should be set before any other calls are made to `FBSDKAppEvents`. Thus, you should set it in your application + delegate's `application:didFinishLaunchingWithOptions:` delegate. + + @param appID The Facebook App ID to be used for App Event logging. + */ ++ (void)setLoggingOverrideAppID:(NSString *)appID; + +/*! + @abstract + Get the 'override' App ID for App Event logging. + + @see setLoggingOverrideAppID: + + */ ++ (NSString *)loggingOverrideAppID; + + +/*! + @abstract + Explicitly kick off flushing of events to Facebook. This is an asynchronous method, but it does initiate an immediate + kick off. Server failures will be reported through the NotificationCenter with notification ID `FBSDKAppEventsLoggingResultNotification`. + */ ++ (void)flush; + +/*! + @abstract + Creates a request representing the Graph API call to retrieve a Custom Audience "third party ID" for the app's Facebook user. + Callers will send this ID back to their own servers, collect up a set to create a Facebook Custom Audience with, + and then use the resultant Custom Audience to target ads. + + @param accessToken The access token to use to establish the user's identity for users logged into Facebook through this app. + If `nil`, then the `[FBSDKAccessToken currentAccessToken]` is used. + + @discussion + The JSON in the request's response will include an "custom_audience_third_party_id" key/value pair, with the value being the ID retrieved. + This ID is an encrypted encoding of the Facebook user's ID and the invoking Facebook app ID. + Multiple calls with the same user will return different IDs, thus these IDs cannot be used to correlate behavior + across devices or applications, and are only meaningful when sent back to Facebook for creating Custom Audiences. + + The ID retrieved represents the Facebook user identified in the following way: if the specified access token is valid, + the ID will represent the user associated with that token; otherwise the ID will represent the user logged into the + native Facebook app on the device. If there is no native Facebook app, no one is logged into it, or the user has opted out + at the iOS level from ad tracking, then a `nil` ID will be returned. + + This method returns `nil` if either the user has opted-out (via iOS) from Ad Tracking, the app itself has limited event usage + via the `[FBSDKSettings limitEventAndDataUsage]` flag, or a specific Facebook user cannot be identified. + */ ++ (FBSDKGraphRequest *)requestForCustomAudienceThirdPartyIDWithAccessToken:(FBSDKAccessToken *)accessToken; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m new file mode 100644 index 0000000..7891652 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m @@ -0,0 +1,831 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppEvents.h" +#import "FBSDKAppEvents+Internal.h" + +#import + +#import "FBSDKAccessToken.h" +#import "FBSDKAppEventsState.h" +#import "FBSDKAppEventsStateManager.h" +#import "FBSDKAppEventsUtility.h" +#import "FBSDKConstants.h" +#import "FBSDKError.h" +#import "FBSDKGraphRequest+Internal.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKPaymentObserver.h" +#import "FBSDKServerConfiguration.h" +#import "FBSDKServerConfigurationManager.h" +#import "FBSDKSettings.h" +#import "FBSDKTimeSpentData.h" +#import "FBSDKUtility.h" + +// +// Public event names +// + +// General purpose +NSString *const FBSDKAppEventNameCompletedRegistration = @"fb_mobile_complete_registration"; +NSString *const FBSDKAppEventNameViewedContent = @"fb_mobile_content_view"; +NSString *const FBSDKAppEventNameSearched = @"fb_mobile_search"; +NSString *const FBSDKAppEventNameRated = @"fb_mobile_rate"; +NSString *const FBSDKAppEventNameCompletedTutorial = @"fb_mobile_tutorial_completion"; +NSString *const FBSDKAppEventParameterLaunchSource = @"fb_mobile_launch_source"; + +// Ecommerce related +NSString *const FBSDKAppEventNameAddedToCart = @"fb_mobile_add_to_cart"; +NSString *const FBSDKAppEventNameAddedToWishlist = @"fb_mobile_add_to_wishlist"; +NSString *const FBSDKAppEventNameInitiatedCheckout = @"fb_mobile_initiated_checkout"; +NSString *const FBSDKAppEventNameAddedPaymentInfo = @"fb_mobile_add_payment_info"; + +// Gaming related +NSString *const FBSDKAppEventNameAchievedLevel = @"fb_mobile_level_achieved"; +NSString *const FBSDKAppEventNameUnlockedAchievement = @"fb_mobile_achievement_unlocked"; +NSString *const FBSDKAppEventNameSpentCredits = @"fb_mobile_spent_credits"; + +// +// Public event parameter names +// + +NSString *const FBSDKAppEventParameterNameCurrency = @"fb_currency"; +NSString *const FBSDKAppEventParameterNameRegistrationMethod = @"fb_registration_method"; +NSString *const FBSDKAppEventParameterNameContentType = @"fb_content_type"; +NSString *const FBSDKAppEventParameterNameContentID = @"fb_content_id"; +NSString *const FBSDKAppEventParameterNameSearchString = @"fb_search_string"; +NSString *const FBSDKAppEventParameterNameSuccess = @"fb_success"; +NSString *const FBSDKAppEventParameterNameMaxRatingValue = @"fb_max_rating_value"; +NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable = @"fb_payment_info_available"; +NSString *const FBSDKAppEventParameterNameNumItems = @"fb_num_items"; +NSString *const FBSDKAppEventParameterNameLevel = @"fb_level"; +NSString *const FBSDKAppEventParameterNameDescription = @"fb_description"; + +// +// Public event parameter values +// + +NSString *const FBSDKAppEventParameterValueNo = @"0"; +NSString *const FBSDKAppEventParameterValueYes = @"1"; + +// +// Event names internal to this file +// +NSString *const FBSDKAppEventNamePurchased = @"fb_mobile_purchase"; + +NSString *const FBSDKAppEventNameLoginViewUsage = @"fb_login_view_usage"; +NSString *const FBSDKAppEventNameShareSheetLaunch = @"fb_share_sheet_launch"; +NSString *const FBSDKAppEventNameShareSheetDismiss = @"fb_share_sheet_dismiss"; +NSString *const FBSDKAppEventNamePermissionsUILaunch = @"fb_permissions_ui_launch"; +NSString *const FBSDKAppEventNamePermissionsUIDismiss = @"fb_permissions_ui_dismiss"; +NSString *const FBSDKAppEventNameFBDialogsPresentShareDialog = @"fb_dialogs_present_share"; +NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogPhoto = @"fb_dialogs_present_share_photo"; +NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogOG = @"fb_dialogs_present_share_og"; +NSString *const FBSDKAppEventNameFBDialogsPresentLikeDialogOG = @"fb_dialogs_present_like_og"; +NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialog = @"fb_dialogs_present_message"; +NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogPhoto = @"fb_dialogs_present_message_photo"; +NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogOG = @"fb_dialogs_present_message_og"; + +NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogStart = @"fb_dialogs_native_login_dialog_start"; +NSString *const FBSDKAppEventsNativeLoginDialogStartTime = @"fb_native_login_dialog_start_time"; + +NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogEnd = @"fb_dialogs_native_login_dialog_end"; +NSString *const FBSDKAppEventsNativeLoginDialogEndTime = @"fb_native_login_dialog_end_time"; + +NSString *const FBSDKAppEventNameFBDialogsWebLoginCompleted = @"fb_dialogs_web_login_dialog_complete"; +NSString *const FBSDKAppEventsWebLoginE2E = @"fb_web_login_e2e"; + +NSString *const FBSDKAppEventNameFBSessionAuthStart = @"fb_mobile_login_start"; +NSString *const FBSDKAppEventNameFBSessionAuthEnd = @"fb_mobile_login_complete"; +NSString *const FBSDKAppEventNameFBSessionAuthMethodStart = @"fb_mobile_login_method_start"; +NSString *const FBSDKAppEventNameFBSessionAuthMethodEnd = @"fb_mobile_login_method_complete"; + +NSString *const FBSDKAppEventNameFBSDKLikeButtonImpression = @"fb_like_button_impression"; +NSString *const FBSDKAppEventNameFBSDKLoginButtonImpression = @"fb_login_button_impression"; +NSString *const FBSDKAppEventNameFBSDKSendButtonImpression = @"fb_send_button_impression"; +NSString *const FBSDKAppEventNameFBSDKShareButtonImpression = @"fb_share_button_impression"; + +NSString *const FBSDKAppEventNameFBSDKLikeButtonDidTap = @"fb_like_button_did_tap"; +NSString *const FBSDKAppEventNameFBSDKLoginButtonDidTap = @"fb_login_button_did_tap"; +NSString *const FBSDKAppEventNameFBSDKSendButtonDidTap = @"fb_send_button_did_tap"; +NSString *const FBSDKAppEventNameFBSDKShareButtonDidTap = @"fb_share_button_did_tap"; + +NSString *const FBSDKAppEventNameFBSDKLikeControlDidDisable = @"fb_like_control_did_disable"; +NSString *const FBSDKAppEventNameFBSDKLikeControlDidLike = @"fb_like_control_did_like"; +NSString *const FBSDKAppEventNameFBSDKLikeControlDidPresentDialog = @"fb_like_control_did_present_dialog"; +NSString *const FBSDKAppEventNameFBSDKLikeControlDidTap = @"fb_like_control_did_tap"; +NSString *const FBSDKAppEventNameFBSDKLikeControlDidUnlike = @"fb_like_control_did_unlike"; +NSString *const FBSDKAppEventNameFBSDKLikeControlError = @"fb_like_control_error"; +NSString *const FBSDKAppEventNameFBSDKLikeControlImpression = @"fb_like_control_impression"; +NSString *const FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable = @"fb_like_control_network_unavailable"; + +NSString *const FBSDLAppEventNameFBSDKEventShareDialogResult = @"fb_dialog_share_result"; +NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogResult = @"fb_messenger_dialog_share_result"; +NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult = @"fb_app_invite_dialog_share_result"; + +NSString *const FBSDKAppEventNameFBSDKEventShareDialogShow = @"fb_dialog_share_show"; +NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogShow = @"fb_messenger_dialog_share_show"; +NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow = @"fb_app_invite_share_show"; + +// Event Parameters internal to this file +NSString *const FBSDKAppEventParameterDialogOutcome = @"fb_dialog_outcome"; +NSString *const FBSDKAppEventParameterDialogErrorMessage = @"fb_dialog_outcome_error_message"; +NSString *const FBSDKAppEventParameterDialogMode = @"fb_dialog_mode"; +NSString *const FBSDKAppEventParameterDialogShareContentType = @"fb_dialog_share_content_type"; + +// Event parameter values internal to this file +NSString *const FBSDKAppEventsDialogOutcomeValue_Completed = @"Completed"; +NSString *const FBSDKAppEventsDialogOutcomeValue_Cancelled = @"Cancelled"; +NSString *const FBSDKAppEventsDialogOutcomeValue_Failed = @"Failed"; + +NSString *const FBSDKAppEventsDialogShareModeAutomatic = @"Automatic"; +NSString *const FBSDKAppEventsDialogShareModeBrowser = @"Browser"; +NSString *const FBSDKAppEventsDialogShareModeNative = @"Native"; +NSString *const FBSDKAppEventsDialogShareModeShareSheet = @"ShareSheet"; +NSString *const FBSDKAppEventsDialogShareModeWeb = @"Web"; +NSString *const FBSDKAppEventsDialogShareModeFeedBrowser = @"FeedBrowser"; +NSString *const FBSDKAppEventsDialogShareModeFeedWeb = @"FeedWeb"; +NSString *const FBSDKAppEventsDialogShareModeUnknown = @"Unknown"; + +NSString *const FBSDKAppEventsDialogShareContentTypeOpenGraph = @"OpenGraph"; +NSString *const FBSDKAppEventsDialogShareContentTypeStatus = @"Status"; +NSString *const FBSDKAppEventsDialogShareContentTypePhoto = @"Photo"; +NSString *const FBSDKAppEventsDialogShareContentTypeVideo = @"Video"; +NSString *const FBSDKAppEventsDialogShareContentTypeUnknown = @"Unknown"; + +NSString *const FBSDKAppEventsLoggingResultNotification = @"com.facebook.sdk:FBSDKAppEventsLoggingResultNotification"; + +NSString *const FBSDKAppEventsOverrideAppIDBundleKey = @"FacebookLoggingOverrideAppID"; + +#define NUM_LOG_EVENTS_TO_TRY_TO_FLUSH_AFTER 100 +#define FLUSH_PERIOD_IN_SECONDS 15 +#define APP_SUPPORTS_ATTRIBUTION_ID_RECHECK_PERIOD 60 * 60 * 24 + +static NSString *g_overrideAppID = nil; + +@interface FBSDKAppEvents () + +@property (nonatomic, readwrite) FBSDKAppEventsFlushBehavior flushBehavior; +//for testing only. +@property (nonatomic, assign) BOOL disableTimer; +@end + +@implementation FBSDKAppEvents +{ + BOOL _explicitEventsLoggedYet; + NSTimer *_flushTimer; + NSTimer *_attributionIDRecheckTimer; + FBSDKServerConfiguration *_serverConfiguration; + FBSDKAppEventsState *_appEventsState; +} + +#pragma mark - Object Lifecycle + ++ (void)initialize +{ + if (self == [FBSDKAppEvents class]) { + g_overrideAppID = [[[NSBundle mainBundle] objectForInfoDictionaryKey:FBSDKAppEventsOverrideAppIDBundleKey] copy]; + } +} + +- (FBSDKAppEvents *)init +{ + self = [super init]; + if (self) { + _flushBehavior = FBSDKAppEventsFlushBehaviorAuto; + _flushTimer = [NSTimer scheduledTimerWithTimeInterval:FLUSH_PERIOD_IN_SECONDS + target:self + selector:@selector(flushTimerFired:) + userInfo:nil + repeats:YES]; + + _attributionIDRecheckTimer = [NSTimer scheduledTimerWithTimeInterval:APP_SUPPORTS_ATTRIBUTION_ID_RECHECK_PERIOD + target:self + selector:@selector(appSettingsFetchStateResetTimerFired:) + userInfo:nil + repeats:YES]; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(applicationMovingFromActiveStateOrTerminating) + name:UIApplicationWillResignActiveNotification + object:NULL]; + + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(applicationMovingFromActiveStateOrTerminating) + name:UIApplicationWillTerminateNotification + object:NULL]; + + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(applicationDidBecomeActive) + name:UIApplicationDidBecomeActiveNotification + object:NULL]; + } + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + // technically these timers retain self so there's a cycle but + // we're a singleton anyway. + [_flushTimer invalidate]; + [_attributionIDRecheckTimer invalidate]; +} + +#pragma mark - Public Methods + ++ (void)logEvent:(NSString *)eventName +{ + [FBSDKAppEvents logEvent:eventName + parameters:nil]; +} + ++ (void)logEvent:(NSString *)eventName + valueToSum:(double)valueToSum +{ + [FBSDKAppEvents logEvent:eventName + valueToSum:valueToSum + parameters:nil]; +} + ++ (void)logEvent:(NSString *)eventName + parameters:(NSDictionary *)parameters +{ + [FBSDKAppEvents logEvent:eventName + valueToSum:nil + parameters:parameters + accessToken:nil]; +} + ++ (void)logEvent:(NSString *)eventName + valueToSum:(double)valueToSum + parameters:(NSDictionary *)parameters +{ + [FBSDKAppEvents logEvent:eventName + valueToSum:[NSNumber numberWithDouble:valueToSum] + parameters:parameters + accessToken:nil]; +} + ++ (void)logEvent:(NSString *)eventName + valueToSum:(NSNumber *)valueToSum + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken +{ + [[FBSDKAppEvents singleton] instanceLogEvent:eventName + valueToSum:valueToSum + parameters:parameters + isImplicitlyLogged:NO + accessToken:accessToken]; +} + ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency +{ + [FBSDKAppEvents logPurchase:purchaseAmount + currency:currency + parameters:nil]; +} + ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency + parameters:(NSDictionary *)parameters +{ + [FBSDKAppEvents logPurchase:purchaseAmount + currency:currency + parameters:parameters + accessToken:nil]; +} + ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken +{ + + // A purchase event is just a regular logged event with a given event name + // and treating the currency value as going into the parameters dictionary. + NSDictionary *newParameters; + if (!parameters) { + newParameters = @{ FBSDKAppEventParameterNameCurrency : currency }; + } else { + newParameters = [NSMutableDictionary dictionaryWithDictionary:parameters]; + [newParameters setValue:currency forKey:FBSDKAppEventParameterNameCurrency]; + } + + [FBSDKAppEvents logEvent:FBSDKAppEventNamePurchased + valueToSum:[NSNumber numberWithDouble:purchaseAmount] + parameters:newParameters + accessToken:accessToken]; + + // Unless the behavior is set to only allow explicit flushing, we go ahead and flush, since purchase events + // are relatively rare and relatively high value and worth getting across on wire right away. + if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) { + [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent]; + } +} + ++ (void)activateApp +{ + [FBSDKAppEventsUtility ensureOnMainThread]; + + // Fetch app settings and register for transaction notifications only if app supports implicit purchase + // events + FBSDKAppEvents *instance = [FBSDKAppEvents singleton]; + [instance publishInstall]; + [instance fetchServerConfiguration:NULL]; + + // Restore time spent data, indicating that we're being called from "activateApp", which will, + // when appropriate, result in logging an "activated app" and "deactivated app" (for the + // previous session) App Event. + [FBSDKTimeSpentData restore:YES]; +} + ++ (FBSDKAppEventsFlushBehavior)flushBehavior +{ + return [FBSDKAppEvents singleton].flushBehavior; +} + ++ (void)setFlushBehavior:(FBSDKAppEventsFlushBehavior)flushBehavior +{ + [FBSDKAppEvents singleton].flushBehavior = flushBehavior; +} + ++ (NSString *)loggingOverrideAppID +{ + return g_overrideAppID; +} + ++ (void)setLoggingOverrideAppID:(NSString *)appID +{ + if (![g_overrideAppID isEqualToString:appID]) { + FBSDKConditionalLog(![FBSDKAppEvents singleton]->_explicitEventsLoggedYet, + FBSDKLoggingBehaviorDeveloperErrors, + @"[FBSDKAppEvents setLoggingOverrideAppID:] should only be called prior to any events being logged."); + g_overrideAppID = appID; + } +} + ++ (void)flush +{ + [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonExplicit]; +} + +#pragma mark - Internal Methods + ++ (void)logImplicitEvent:(NSString *)eventName + valueToSum:(NSNumber *)valueToSum + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken +{ + [[FBSDKAppEvents singleton] instanceLogEvent:eventName + valueToSum:valueToSum + parameters:parameters + isImplicitlyLogged:YES + accessToken:accessToken]; +} + ++ (FBSDKAppEvents *)singleton +{ + static dispatch_once_t pred; + static FBSDKAppEvents *shared = nil; + + dispatch_once(&pred, ^{ + shared = [[FBSDKAppEvents alloc] init]; + }); + return shared; +} + +- (void)flushForReason:(FBSDKAppEventsFlushReason)flushReason +{ + // Always flush asynchronously, even on main thread, for two reasons: + // - most consistent code path for all threads. + // - allow locks being held by caller to be released prior to actual flushing work being done. + @synchronized (self) { + if (!_appEventsState) { + return; + } + FBSDKAppEventsState *copy = [_appEventsState copy]; + _appEventsState = [[FBSDKAppEventsState alloc] initWithToken:copy.tokenString + appID:copy.appID]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self flushOnMainQueue:copy forReason:flushReason]; + }); + } +} + +#pragma mark - Private Methods +- (NSString *)appID +{ + return [FBSDKAppEvents loggingOverrideAppID] ?: [FBSDKSettings appID]; +} + +- (void)publishInstall +{ + NSString *appID = [self appID]; + NSString *lastAttributionPingString = [NSString stringWithFormat:@"com.facebook.sdk:lastAttributionPing%@", appID]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + if ([defaults objectForKey:lastAttributionPingString]) { + return; + } + [self fetchServerConfiguration:^{ + NSDictionary *params = [FBSDKAppEventsUtility activityParametersDictionaryForEvent:@"MOBILE_APP_INSTALL" + implicitEventsOnly:NO + shouldAccessAdvertisingID:_serverConfiguration.isAdvertisingIDEnabled]; + NSString *path = [NSString stringWithFormat:@"%@/activities", appID]; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:path + parameters:params + tokenString:nil + HTTPMethod:@"POST" + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (!error) { + [defaults setObject:[NSDate date] forKey:lastAttributionPingString]; + NSString *lastInstallResponseKey = [NSString stringWithFormat:@"com.facebook.sdk:lastInstallResponse%@", appID]; + [defaults setObject:result forKey:lastInstallResponseKey]; + [defaults synchronize]; + } + }]; + }]; +} + +// app events can use a server configuration up to 24 hours old to minimize network traffic. +- (void)fetchServerConfiguration:(void (^)(void))callback +{ + if (_serverConfiguration == nil) { + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *error) { + _serverConfiguration = serverConfiguration; + + if (_serverConfiguration.implicitPurchaseLoggingEnabled) { + [FBSDKPaymentObserver startObservingTransactions]; + } else { + [FBSDKPaymentObserver stopObservingTransactions]; + } + if (callback) { + callback(); + } + }]; + return; + } + if (callback) { + callback(); + } +} + +- (void)instanceLogEvent:(NSString *)eventName + valueToSum:(NSNumber *)valueToSum + parameters:(NSDictionary *)parameters + isImplicitlyLogged:(BOOL)isImplicitlyLogged + accessToken:(FBSDKAccessToken *)accessToken +{ + if (isImplicitlyLogged && _serverConfiguration && !_serverConfiguration.isImplicitLoggingSupported) { + return; + } + + if (!isImplicitlyLogged && !_explicitEventsLoggedYet) { + _explicitEventsLoggedYet = YES; + } + + __block BOOL failed = NO; + + if (![FBSDKAppEventsUtility validateIdentifier:eventName]) { + failed = YES; + } + + // Make sure parameter dictionary is well formed. Log and exit if not. + [parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + if (![key isKindOfClass:[NSString class]]) { + [FBSDKAppEventsUtility logAndNotify:[NSString stringWithFormat:@"The keys in the parameters must be NSStrings, '%@' is not.", key]]; + failed = YES; + } + if (![FBSDKAppEventsUtility validateIdentifier:key]) { + failed = YES; + } + if (![obj isKindOfClass:[NSString class]] && ![obj isKindOfClass:[NSNumber class]]) { + [FBSDKAppEventsUtility logAndNotify:[NSString stringWithFormat:@"The values in the parameters dictionary must be NSStrings or NSNumbers, '%@' is not.", obj]]; + failed = YES; + } + } + ]; + + if (failed) { + return; + } + + NSMutableDictionary *eventDictionary = [NSMutableDictionary dictionaryWithDictionary:parameters]; + eventDictionary[@"_eventName"] = eventName; + eventDictionary[@"_logTime"] = @([FBSDKAppEventsUtility unixTimeNow]); + [FBSDKInternalUtility dictionary:eventDictionary setObject:valueToSum forKey:@"_valueToSum"]; + if (isImplicitlyLogged) { + eventDictionary[@"_implicitlyLogged"] = @"1"; + } + + NSString *currentViewControllerName; + if ([NSThread isMainThread]) { + // We only collect the view controller when on the main thread, as the behavior off + // the main thread is unpredictable. Besides, UI state for off-main-thread computations + // isn't really relevant anyhow. + UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController.presentedViewController; + if (vc) { + currentViewControllerName = [[vc class] description]; + } else { + currentViewControllerName = @"no_ui"; + } + } else { + currentViewControllerName = @"off_thread"; + } + eventDictionary[@"_ui"] = currentViewControllerName; + + NSString *tokenString = [FBSDKAppEventsUtility tokenStringToUseFor:accessToken]; + NSString *appID = [self appID]; + + @synchronized (self) { + if (!_appEventsState) { + _appEventsState = [[FBSDKAppEventsState alloc] initWithToken:tokenString appID:appID]; + } else if (![_appEventsState isCompatibleWithTokenString:tokenString appID:appID]) { + if (self.flushBehavior == FBSDKAppEventsFlushBehaviorExplicitOnly) { + [FBSDKAppEventsStateManager persistAppEventsData:_appEventsState]; + } else { + [self flushForReason:FBSDKAppEventsFlushReasonSessionChange]; + } + _appEventsState = [[FBSDKAppEventsState alloc] initWithToken:tokenString appID:appID]; + } + + [_appEventsState addEvent:eventDictionary isImplicit:isImplicitlyLogged]; + if (!isImplicitlyLogged) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKAppEvents: Recording event @ %ld: %@", + [FBSDKAppEventsUtility unixTimeNow], + eventDictionary]; + } + + [self checkPersistedEvents]; + + if (_appEventsState.events.count > NUM_LOG_EVENTS_TO_TRY_TO_FLUSH_AFTER && + self.flushBehavior != FBSDKAppEventsFlushBehaviorExplicitOnly) { + [self flushForReason:FBSDKAppEventsFlushReasonEventThreshold]; + } + } +} + +// this fetches persisted event states. +// for those matching the currently tracked events, add it. +// otherwise, either flush (if not explicitonly behavior) or persist them back. +- (void)checkPersistedEvents +{ + NSArray *existingEventsStates = [FBSDKAppEventsStateManager retrievePersistedAppEventsStates]; + if (existingEventsStates.count == 0) { + return; + } + FBSDKAppEventsState *matchingEventsPreviouslySaved = nil; + // reduce lock time by creating a new FBSDKAppEventsState to collect matching persisted events. + @synchronized(self) { + if (_appEventsState) { + matchingEventsPreviouslySaved = [[FBSDKAppEventsState alloc] initWithToken:_appEventsState.tokenString + appID:_appEventsState.appID]; + } + } + for (FBSDKAppEventsState *saved in existingEventsStates) { + if ([saved isCompatibleWithAppEventsState:matchingEventsPreviouslySaved]) { + [matchingEventsPreviouslySaved addEventsFromAppEventState:saved]; + } else { + if (self.flushBehavior == FBSDKAppEventsFlushBehaviorExplicitOnly) { + [FBSDKAppEventsStateManager persistAppEventsData:saved]; + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [self flushOnMainQueue:saved forReason:FBSDKAppEventsFlushReasonPersistedEvents]; + }); + } + } + } + if (matchingEventsPreviouslySaved.events.count > 0) { + @synchronized(self) { + if ([_appEventsState isCompatibleWithAppEventsState:matchingEventsPreviouslySaved]) { + [_appEventsState addEventsFromAppEventState:matchingEventsPreviouslySaved]; + } + } + } +} + +- (void)flushOnMainQueue:(FBSDKAppEventsState *)appEventsState + forReason:(FBSDKAppEventsFlushReason)reason +{ + if (appEventsState.events.count == 0) { + return; + } + [FBSDKAppEventsUtility ensureOnMainThread]; + + [self fetchServerConfiguration:^(void) { + NSString *JSONString = [appEventsState JSONStringForEvents:_serverConfiguration.implicitLoggingEnabled]; + NSData *encodedEvents = [JSONString dataUsingEncoding:NSUTF8StringEncoding]; + if (!encodedEvents) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + logEntry:@"FBSDKAppEvents: Flushing skipped - no events after removing implicitly logged ones.\n"]; + return; + } + NSMutableDictionary *postParameters = [FBSDKAppEventsUtility + activityParametersDictionaryForEvent:@"CUSTOM_APP_EVENTS" + implicitEventsOnly:appEventsState.areAllEventsImplicit + shouldAccessAdvertisingID:_serverConfiguration.advertisingIDEnabled]; + postParameters[@"custom_events_file"] = encodedEvents; + if (appEventsState.numSkipped > 0) { + postParameters[@"num_skipped_events"] = [NSString stringWithFormat:@"%lu", (unsigned long)appEventsState.numSkipped]; + } + + NSString *loggingEntry = nil; + if ([[FBSDKSettings loggingBehavior] containsObject:FBSDKLoggingBehaviorAppEvents]) { + NSData *prettyJSONData = [NSJSONSerialization dataWithJSONObject:appEventsState.events + options:NSJSONWritingPrettyPrinted + error:NULL]; + NSString *prettyPrintedJsonEvents = [[NSString alloc] initWithData:prettyJSONData + encoding:NSUTF8StringEncoding]; + // Remove this param -- just an encoding of the events which we pretty print later. + NSMutableDictionary *paramsForPrinting = [postParameters mutableCopy]; + [paramsForPrinting removeObjectForKey:@"custom_events_file"]; + + loggingEntry = [NSString stringWithFormat:@"FBSDKAppEvents: Flushed @ %ld, %lu events due to '%@' - %@\nEvents: %@", + [FBSDKAppEventsUtility unixTimeNow], + (unsigned long)appEventsState.events.count, + [FBSDKAppEventsUtility flushReasonToString:reason], + paramsForPrinting, + prettyPrintedJsonEvents]; + } + + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/activities", appEventsState.appID] + parameters:postParameters + tokenString:appEventsState.tokenString + HTTPMethod:@"POST" + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + + [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + [self handleActivitiesPostCompletion:error + loggingEntry:loggingEntry + appEventsState:(FBSDKAppEventsState *)appEventsState]; + }]; + + }]; +} + +- (void)handleActivitiesPostCompletion:(NSError *)error + loggingEntry:(NSString *)loggingEntry + appEventsState:(FBSDKAppEventsState *)appEventsState +{ + typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushResult) { + FlushResultSuccess, + FlushResultServerError, + FlushResultNoConnectivity + }; + + [FBSDKAppEventsUtility ensureOnMainThread]; + + FBSDKAppEventsFlushResult flushResult = FlushResultSuccess; + if (error) { + NSInteger errorCode = [error.userInfo[FBSDKGraphRequestErrorHTTPStatusCodeKey] integerValue]; + + // We interpret a 400 coming back from FBRequestConnection as a server error due to improper data being + // sent down. Otherwise we assume no connectivity, or another condition where we could treat it as no connectivity. + flushResult = errorCode == 400 ? FlushResultServerError : FlushResultNoConnectivity; + } + + if (flushResult == FlushResultServerError) { + // Only log events that developer can do something with (i.e., if parameters are incorrect). + // as opposed to cases where the token is bad. + if ([error.userInfo[FBSDKGraphRequestErrorCategoryKey] unsignedIntegerValue] == FBSDKGraphRequestErrorCategoryOther) { + NSString *message = [NSString stringWithFormat:@"Failed to send AppEvents: %@", error]; + [FBSDKAppEventsUtility logAndNotify:message allowLogAsDeveloperError:!appEventsState.areAllEventsImplicit]; + } + } else if (flushResult == FlushResultNoConnectivity) { + @synchronized(self) { + if ([appEventsState isCompatibleWithAppEventsState:_appEventsState]) { + [_appEventsState addEventsFromAppEventState:appEventsState]; + } else { + // flush failed due to connectivity. Persist to be tried again later. + [FBSDKAppEventsStateManager persistAppEventsData:appEventsState]; + } + } + } + + NSString *resultString = @""; + switch (flushResult) { + case FlushResultSuccess: + resultString = @"Success"; + break; + + case FlushResultNoConnectivity: + resultString = @"No Connectivity"; + break; + + case FlushResultServerError: + resultString = [NSString stringWithFormat:@"Server Error - %@", [error description]]; + break; + } + + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"%@\nFlush Result : %@", loggingEntry, resultString]; +} + +- (void)flushTimerFired:(id)arg +{ + [FBSDKAppEventsUtility ensureOnMainThread]; + if (self.flushBehavior != FBSDKAppEventsFlushBehaviorExplicitOnly && !self.disableTimer) { + [self flushForReason:FBSDKAppEventsFlushReasonTimer]; + } +} + +- (void)appSettingsFetchStateResetTimerFired:(id)arg +{ + _serverConfiguration = nil; +} + +- (void)applicationDidBecomeActive +{ + [FBSDKAppEventsUtility ensureOnMainThread]; + + [self checkPersistedEvents]; + + // Restore time spent data, indicating that we're not being called from "activateApp". + [FBSDKTimeSpentData restore:NO]; +} + +- (void)applicationMovingFromActiveStateOrTerminating +{ + // When moving from active state, we don't have time to wait for the result of a flush, so + // just persist events to storage, and we'll process them at the next activation. + FBSDKAppEventsState *copy = nil; + @synchronized (self) { + copy = [_appEventsState copy]; + _appEventsState = nil; + } + if (copy) { + [FBSDKAppEventsStateManager persistAppEventsData:copy]; + } + [FBSDKTimeSpentData suspend]; +} + +#pragma mark - Custom Audience + ++ (FBSDKGraphRequest *)requestForCustomAudienceThirdPartyIDWithAccessToken:(FBSDKAccessToken *)accessToken +{ + accessToken = accessToken ?: [FBSDKAccessToken currentAccessToken]; + // Rules for how we use the attribution ID / advertiser ID for an 'custom_audience_third_party_id' Graph API request + // 1) if the OS tells us that the user has Limited Ad Tracking, then just don't send, and return a nil in the token. + // 2) if the app has set 'limitEventAndDataUsage', this effectively implies that app-initiated ad targeting shouldn't happen, + // so use that data here to return nil as well. + // 3) if we have a user session token, then no need to send attribution ID / advertiser ID back as the udid parameter + // 4) otherwise, send back the udid parameter. + + if ([FBSDKAppEventsUtility advertisingTrackingStatus] == FBSDKAdvertisingTrackingDisallowed || [FBSDKSettings limitEventAndDataUsage]) { + return nil; + } + + NSString *tokenString = [FBSDKAppEventsUtility tokenStringToUseFor:accessToken]; + NSString *udid = nil; + if (!accessToken) { + // We don't have a logged in user, so we need some form of udid representation. Prefer advertiser ID if + // available, and back off to attribution ID if not. Note that this function only makes sense to be + // called in the context of advertising. + udid = [FBSDKAppEventsUtility advertiserID]; + if (!udid) { + udid = [FBSDKAppEventsUtility attributionID]; + } + + if (!udid) { + // No udid, and no user token. No point in making the request. + return nil; + } + } + + NSDictionary *parameters = nil; + if (udid) { + parameters = @{ @"udid" : udid }; + } + + NSString *graphPath = [NSString stringWithFormat:@"%@/custom_audience_third_party_id", [[self singleton] appID]]; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:parameters + tokenString:tokenString + HTTPMethod:nil + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + + return request; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h new file mode 100644 index 0000000..8e65e5b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h @@ -0,0 +1,82 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class BFTask; + +// Check if Bolts.framework is available for import +#if __has_include() +// Import it if it's available +# import +#else +// Otherwise - redeclare BFAppLinkResolving protocol to resolve the problem of missing symbols +// Please note: Bolts.framework is still required for AppLink resolving to work, +// but this allows FBSDKCoreKit to weakly link Bolts.framework as well as this enables clang modulemaps to work. + +/*! + Implement this protocol to provide an alternate strategy for resolving + App Links that may include pre-fetching, caching, or querying for App Link + data from an index provided by a service provider. + */ +@protocol BFAppLinkResolving + +/*! + Asynchronously resolves App Link data for a given URL. + + @param url The URL to resolve into an App Link. + @returns A BFTask that will return a BFAppLink for the given URL. + */ +- (BFTask *)appLinkFromURLInBackground:(NSURL *)url; + +@end + +#endif + +/*! + @class FBSDKAppLinkResolver + + @abstract + Provides an implementation of the BFAppLinkResolving protocol that uses the Facebook App Link + Index API to resolve App Links given a URL. It also provides an additional helper method that can resolve + multiple App Links in a single call. + + @discussion + Usage of this type requires a client token. See `[FBSDKSettings setClientToken:]` and linking + Bolts.framework + */ +@interface FBSDKAppLinkResolver : NSObject + +/*! + @abstract Asynchronously resolves App Link data for multiple URLs. + + @param urls An array of NSURLs to resolve into App Links. + @returns A BFTask that will return dictionary mapping input NSURLs to their + corresponding BFAppLink. + + @discussion + You should set the client token before making this call. See `[FBSDKSettings setClientToken:]` + */ +- (BFTask *)appLinksFromURLsInBackground:(NSArray *)urls; + +/*! + @abstract Allocates and initializes a new instance of FBSDKAppLinkResolver. + */ ++ (instancetype)resolver; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m new file mode 100644 index 0000000..9ce2143 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m @@ -0,0 +1,195 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppLinkResolver.h" + +#import + +#import +#import +#import +#import + +#import "FBSDKGraphRequest+Internal.h" +#import "FBSDKGraphRequestConnection.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings+Internal.h" +#import "FBSDKUtility.h" + +static NSString *const kURLKey = @"url"; +static NSString *const kIOSAppStoreIdKey = @"app_store_id"; +static NSString *const kIOSAppNameKey = @"app_name"; +static NSString *const kWebKey = @"web"; +static NSString *const kIOSKey = @"ios"; +static NSString *const kIPhoneKey = @"iphone"; +static NSString *const kIPadKey = @"ipad"; +static NSString *const kShouldFallbackKey = @"should_fallback"; +static NSString *const kAppLinksKey = @"app_links"; + +static void FBSDKAppLinkResolverBoltsClassFromString(Class *clazz, NSString *className) +{ + *clazz = NSClassFromString(className); + if (*clazz == nil) { + NSString *message = [NSString stringWithFormat:@"Unable to load class %@. Did you link Bolts.framework?", className]; + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:message + userInfo:nil]; + } +} + +@interface FBSDKAppLinkResolver () + +@property (nonatomic, strong) NSMutableDictionary *cachedLinks; +@property (nonatomic, assign) UIUserInterfaceIdiom userInterfaceIdiom; +@end + +@implementation FBSDKAppLinkResolver + +static Class g_BFTaskCompletionSourceClass; +static Class g_BFAppLinkTargetClass; +static Class g_BFAppLinkClass; +static Class g_BFTaskClass; + ++ (void)initialize +{ + if (self == [FBSDKAppLinkResolver class]) { + FBSDKAppLinkResolverBoltsClassFromString(&g_BFTaskCompletionSourceClass, @"BFTaskCompletionSource"); + FBSDKAppLinkResolverBoltsClassFromString(&g_BFAppLinkTargetClass, @"BFAppLinkTarget"); + FBSDKAppLinkResolverBoltsClassFromString(&g_BFAppLinkClass, @"BFAppLink"); + FBSDKAppLinkResolverBoltsClassFromString(&g_BFTaskClass, @"BFTask"); + } +} + +- (id)initWithUserInterfaceIdiom:(UIUserInterfaceIdiom)userInterfaceIdiom +{ + if (self = [super init]) { + self.cachedLinks = [NSMutableDictionary dictionary]; + self.userInterfaceIdiom = userInterfaceIdiom; + } + return self; +} + +- (BFTask *)appLinksFromURLsInBackground:(NSArray *)urls +{ + if (![FBSDKSettings clientToken] && ![FBSDKAccessToken currentAccessToken]) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + logEntry:@"A user access token or clientToken is required to use FBAppLinkResolver"]; + } + NSMutableDictionary *appLinks = [NSMutableDictionary dictionary]; + NSMutableArray *toFind = [NSMutableArray array]; + NSMutableArray *toFindStrings = [NSMutableArray array]; + + @synchronized (self.cachedLinks) { + for (NSURL *url in urls) { + if (self.cachedLinks[url]) { + appLinks[url] = self.cachedLinks[url]; + } else { + [toFind addObject:url]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [toFindStrings addObject:[url.absoluteString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; +#pragma clang diagnostic pop + } + } + } + if (toFind.count == 0) { + // All of the URLs have already been found. + return [g_BFTaskClass taskWithResult:appLinks]; + } + NSMutableArray *fields = [NSMutableArray arrayWithObject:kIOSKey]; + + NSString *idiomSpecificField = nil; + + switch (self.userInterfaceIdiom) { + case UIUserInterfaceIdiomPad: + idiomSpecificField = kIPadKey; + break; + case UIUserInterfaceIdiomPhone: + idiomSpecificField = kIPhoneKey; + break; + default: + break; + } + if (idiomSpecificField) { + [fields addObject:idiomSpecificField]; + } + NSString *path = [NSString stringWithFormat:@"?fields=%@.fields(%@)&ids=%@", + kAppLinksKey, + [fields componentsJoinedByString:@","], + [toFindStrings componentsJoinedByString:@","]]; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:path + parameters:nil + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + BFTaskCompletionSource *tcs = [g_BFTaskCompletionSourceClass taskCompletionSource]; + [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (error) { + [tcs setError:error]; + return; + } + for (NSURL *url in toFind) { + id nestedObject = [[result objectForKey:url.absoluteString] objectForKey:kAppLinksKey]; + NSMutableArray *rawTargets = [NSMutableArray array]; + if (idiomSpecificField) { + [rawTargets addObjectsFromArray:[nestedObject objectForKey:idiomSpecificField]]; + } + [rawTargets addObjectsFromArray:[nestedObject objectForKey:kIOSKey]]; + + NSMutableArray *targets = [NSMutableArray arrayWithCapacity:rawTargets.count]; + for (id rawTarget in rawTargets) { + [targets addObject:[g_BFAppLinkTargetClass appLinkTargetWithURL:[NSURL URLWithString:[rawTarget objectForKey:kURLKey]] + appStoreId:[rawTarget objectForKey:kIOSAppStoreIdKey] + appName:[rawTarget objectForKey:kIOSAppNameKey]]]; + } + + id webTarget = [nestedObject objectForKey:kWebKey]; + NSString *webFallbackString = [webTarget objectForKey:kURLKey]; + NSURL *fallbackUrl = webFallbackString ? [NSURL URLWithString:webFallbackString] : url; + + NSNumber *shouldFallback = [webTarget objectForKey:kShouldFallbackKey]; + if (shouldFallback && !shouldFallback.boolValue) { + fallbackUrl = nil; + } + + BFAppLink *link = [g_BFAppLinkClass appLinkWithSourceURL:url + targets:targets + webURL:fallbackUrl]; + @synchronized (self.cachedLinks) { + self.cachedLinks[url] = link; + } + appLinks[url] = link; + } + [tcs setResult:appLinks]; + }]; + return tcs.task; +} + +- (BFTask *)appLinkFromURLInBackground:(NSURL *)url +{ + // Implement in terms of appLinksFromURLsInBackground + BFTask *resolveTask = [self appLinksFromURLsInBackground:@[url]]; + return [resolveTask continueWithSuccessBlock:^id(BFTask *task) { + return task.result[url]; + }]; +} + ++ (id)resolver +{ + return [[self alloc] initWithUserInterfaceIdiom:UI_USER_INTERFACE_IDIOM()]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h new file mode 100644 index 0000000..216b71d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h @@ -0,0 +1,55 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @abstract Describes the callback for fetchDeferredAppLink. + @param url the url representing the deferred App Link + @param error the error during the request, if any + + @discussion The url may also have a fb_click_time_utc query parameter that + represents when the click occurred that caused the deferred App Link to be created. + */ +typedef void (^FBSDKDeferredAppLinkHandler)(NSURL *url, NSError *error); + +/*! + @abstract Class containing App Links related utility methods. + */ +@interface FBSDKAppLinkUtility : NSObject + +/*! + @abstract + Call this method from the main thread to fetch deferred applink data if you use Mobile App + Engagement Ads (https://developers.facebook.com/docs/ads-for-apps/mobile-app-ads-engagement). + This may require a network round trip. If successful, the handler is invoked with the link + data (this will only return a valid URL once, and future calls will result in a nil URL + value in the callback). + + @param handler the handler to be invoked if there is deferred App Link data + + @discussion The handler may contain an NSError instance to capture any errors. In the + common case where there simply was no app link data, the NSError instance will be nil. + + This method should only be called from a location that occurs after any launching URL has + been processed (e.g., you should call this method from your application delegate's + applicationDidBecomeActive:). + */ ++ (void)fetchDeferredAppLink:(FBSDKDeferredAppLinkHandler)handler; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m new file mode 100644 index 0000000..83dc2c4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m @@ -0,0 +1,80 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppLinkUtility.h" + +#import "FBSDKAppEventsUtility.h" +#import "FBSDKGraphRequest.h" +#import "FBSDKSettings.h" +#import "FBSDKUtility.h" + +static NSString *const FBSDKLastDeferredAppLink = @"com.facebook.sdk:lastDeferredAppLink%@"; +static NSString *const FBSDKDeferredAppLinkEvent = @"DEFERRED_APP_LINK"; + +@implementation FBSDKAppLinkUtility {} + ++ (void)fetchDeferredAppLink:(FBSDKDeferredAppLinkHandler)handler +{ + NSAssert([NSThread isMainThread], @"FBSDKAppLink fetchDeferredAppLink: must be invoked from main thread."); + + NSString *appID = [FBSDKSettings appID]; + + // Deferred app links are only currently used for engagement ads, thus we consider the app to be an advertising one. + // If this is considered for organic, non-ads scenarios, we'll need to retrieve the FBAppEventsUtility.shouldAccessAdvertisingID + // before we make this call. + NSMutableDictionary *deferredAppLinkParameters = + [FBSDKAppEventsUtility activityParametersDictionaryForEvent:FBSDKDeferredAppLinkEvent + implicitEventsOnly:NO + shouldAccessAdvertisingID:YES]; + + FBSDKGraphRequest *deferredAppLinkRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/activities", appID, nil] + parameters:deferredAppLinkParameters + tokenString:nil + version:nil + HTTPMethod:@"POST"]; + + [deferredAppLinkRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, + id result, + NSError *error) { + NSURL *applinkURL = nil; + if (!error) { + NSString *appLinkString = result[@"applink_url"]; + if (appLinkString) { + applinkURL = [NSURL URLWithString:appLinkString]; + + NSString *createTimeUtc = result[@"click_time"]; + if (createTimeUtc) { + // append/translate the create_time_utc so it can be used by clients + NSString *modifiedURLString = [[applinkURL absoluteString] + stringByAppendingFormat:@"%@fb_click_time_utc=%@", + ([applinkURL query]) ? @"&" : @"?" , + createTimeUtc ]; + applinkURL = [NSURL URLWithString:modifiedURLString]; + } + } + } + + if (handler) { + dispatch_async(dispatch_get_main_queue(), ^{ + handler(applinkURL, error); + }); + } + }]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h new file mode 100644 index 0000000..857acd0 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h @@ -0,0 +1,74 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @class FBSDKApplicationDelegate + + @abstract + The FBSDKApplicationDelegate is designed to post process the results from Facebook Login + or Facebook Dialogs (or any action that requires switching over to the native Facebook + app or Safari). + + @discussion + The methods in this class are designed to mirror those in UIApplicationDelegate, and you + should call them in the respective methods in your AppDelegate implementation. + */ +@interface FBSDKApplicationDelegate : NSObject + +/*! + @abstract Gets the singleton instance. + */ ++ (instancetype)sharedInstance; + +/*! + @abstract + Call this method from the [UIApplicationDelegate application:openURL:sourceApplication:annotation:] method + of the AppDelegate for your app. It should be invoked for the proper processing of responses during interaction + with the native Facebook app or Safari as part of SSO authorization flow or Facebook dialogs. + + @param application The application as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @param url The URL as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @param sourceApplication The sourceApplication as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @param annotation The annotation as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @return YES if the url was intended for the Facebook SDK, NO if not. + */ +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation; + +/*! + @abstract + Call this method from the [UIApplicationDelegate application:didFinishLaunchingWithOptions:] method + of the AppDelegate for your app. It should be invoked for the proper use of the Facebook SDK. + + @param application The application as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. + + @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. + + @return YES if the url was intended for the Facebook SDK, NO if not. + */ +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m new file mode 100644 index 0000000..d3916a4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m @@ -0,0 +1,430 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKApplicationDelegate.h" +#import "FBSDKApplicationDelegate+Internal.h" + +#import + +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKBoltsMeasurementEventListener.h" +#import "FBSDKBridgeAPIRequest.h" +#import "FBSDKBridgeAPIResponse.h" +#import "FBSDKConstants.h" +#import "FBSDKContainerViewController.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKProfile+Internal.h" +#import "FBSDKServerConfiguration.h" +#import "FBSDKServerConfigurationManager.h" +#import "FBSDKSettings+Internal.h" +#import "FBSDKTimeSpentData.h" +#import "FBSDKUtility.h" + +NSString *const FBSDKApplicationDidBecomeActiveNotification = @"com.facebook.sdk.FBSDKApplicationDidBecomeActiveNotification"; + +static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound"; + +@implementation FBSDKApplicationDelegate +{ + FBSDKBridgeAPIRequest *_pendingRequest; + FBSDKBridgeAPICallbackBlock _pendingRequestCompletionBlock; + id _pendingURLOpen; + BOOL _expectingBackground; + UIViewController *_safariViewController; +} + +#pragma mark - Class Methods + ++ (void)load +{ + // when the app becomes active by any means, kick off the initialization. + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(initializeWithLaunchData:) + name:UIApplicationDidFinishLaunchingNotification + object:nil]; +} + +// Initialize SDK listeners +// Don't call this function in any place else. It should only be called when the class is loaded. ++ (void)initializeWithLaunchData:(NSNotification *)note +{ + NSDictionary *launchData = note.userInfo; + // Register Listener for Bolts measurement events + [FBSDKBoltsMeasurementEventListener defaultListener]; + + // Set the SourceApplication for time spent data. This is not going to update the value if the app has already launched. + [FBSDKTimeSpentData setSourceApplication:launchData[UIApplicationLaunchOptionsSourceApplicationKey] + openURL:launchData[UIApplicationLaunchOptionsURLKey]]; + // Register on UIApplicationDidEnterBackgroundNotification events to reset source application data when app backgrounds. + [FBSDKTimeSpentData registerAutoResetSourceApplication]; + + // Remove the observer + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + ++ (instancetype)sharedInstance +{ + static FBSDKApplicationDelegate *_sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _sharedInstance = [[self alloc] _init]; + }); + return _sharedInstance; +} + +#pragma mark - Object Lifecycle + +- (instancetype)_init +{ + if ((self = [super init]) != nil) { + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + [defaultCenter addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; + [defaultCenter addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; + } + return self; +} + +- (instancetype)init +{ + return nil; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - UIApplicationDelegate + +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation +{ + if (sourceApplication != nil && ![sourceApplication isKindOfClass:[NSString class]]) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"Expected 'sourceApplication' to be NSString. Please verify you are passing in 'sourceApplication' from your app delegate (not the UIApplication* parameter). If your app delegate implements iOS 9's application:openURL:options:, you should pass in options[UIApplicationOpenURLOptionsSourceApplicationKey]. " + userInfo:nil]; + } + [FBSDKTimeSpentData setSourceApplication:sourceApplication openURL:url]; + // if they completed a SFVC flow, dimiss it. + [_safariViewController.presentingViewController dismissViewControllerAnimated:YES completion: nil]; + _safariViewController = nil; + + if (_pendingURLOpen) { + id pendingURLOpen = _pendingURLOpen; + + _pendingURLOpen = nil; + + if ([pendingURLOpen application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]) { + return YES; + } + } + if ([self _handleBridgeAPIResponseURL:url sourceApplication:sourceApplication]) { + return YES; + } + + [self _logIfAppLinkEvent:url]; + + return NO; +} + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + FBSDKProfile *cachedProfile = [FBSDKProfile fetchCachedProfile]; + [FBSDKProfile setCurrentProfile:cachedProfile]; + + FBSDKAccessToken *cachedToken = [[FBSDKSettings accessTokenCache] fetchAccessToken]; + [FBSDKAccessToken setCurrentAccessToken:cachedToken]; + + NSURL *launchedURL = launchOptions[UIApplicationLaunchOptionsURLKey]; + NSString *sourceApplication = launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]; + + if (launchedURL && + sourceApplication) { + Class loginManagerClass = NSClassFromString(@"FBSDKLoginManager"); + if (loginManagerClass) { + id annotation = launchOptions[UIApplicationLaunchOptionsAnnotationKey]; + id loginManager = [[loginManagerClass alloc] init]; + return [loginManager application:application + openURL:launchedURL + sourceApplication:sourceApplication + annotation:annotation]; + } + } + return NO; +} + +- (void)applicationDidEnterBackground:(NSNotification *)notification +{ + _active = NO; + _expectingBackground = NO; +} + +- (void)applicationDidBecomeActive:(NSNotification *)notification +{ + // _expectingBackground can be YES if the caller started doing work (like login) + // within the app delegate's lifecycle like openURL, in which case there + // might have been a "didBecomeActive" event pending that we want to ignore. + if (!_expectingBackground && !_safariViewController) { + _active = YES; + [_pendingURLOpen applicationDidBecomeActive:[notification object]]; + + [self _cancelBridgeRequest]; + + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKApplicationDidBecomeActiveNotification object:self]; + } +} + +#pragma mark - SFSafariViewControllerDelegate + +// This means the user tapped "Done" which we should treat as a cancellation. +- (void)safariViewControllerDidFinish:(UIViewController *)safariViewController +{ + if (_pendingURLOpen) { + id pendingURLOpen = _pendingURLOpen; + + _pendingURLOpen = nil; + + [pendingURLOpen application:nil + openURL:nil + sourceApplication:nil + annotation:nil]; + + } + [self _cancelBridgeRequest]; + _safariViewController = nil; +} + +#pragma mark - FBSDKContainerViewControllerDelegate + +- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated +{ + if (_safariViewController) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + logEntry:@"**ERROR**:\n The SFSafariViewController's parent view controller was dismissed.\n" + "This can happen if you are triggering login from a UIAlertController. Instead, make sure your top most view " + "controller will not be prematurely dismissed."]; + [self safariViewControllerDidFinish:_safariViewController]; + } +} + +#pragma mark - Internal Methods + +- (void)openBridgeAPIRequest:(FBSDKBridgeAPIRequest *)request + useSafariViewController:(BOOL)useSafariViewController + fromViewController:(UIViewController *)fromViewController + completionBlock:(FBSDKBridgeAPICallbackBlock)completionBlock +{ + if (!request) { + return; + } + NSError *error; + NSURL *requestURL = [request requestURL:&error]; + if (!requestURL) { + FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request error:error]; + completionBlock(response); + return; + } + _pendingRequest = request; + _pendingRequestCompletionBlock = [completionBlock copy]; + void (^handler)(BOOL) = ^(BOOL openedURL) { + if (!openedURL) { + _pendingRequest = nil; + _pendingRequestCompletionBlock = nil; + NSError *openedURLError; + if ([request.scheme hasPrefix:@"http"]) { + openedURLError = [FBSDKError errorWithCode:FBSDKBrowswerUnavailableErrorCode + message:@"the app switch failed because the browser is unavailable"]; + } else { + openedURLError = [FBSDKError errorWithCode:FBSDKAppVersionUnsupportedErrorCode + message:@"the app switch failed because the destination app is out of date"]; + } + FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request + error:openedURLError]; + completionBlock(response); + return; + } + }; + if (useSafariViewController) { + [self openURLWithSafariViewController:requestURL sender:nil fromViewController:fromViewController handler:handler]; + } else { + [self openURL:requestURL sender:nil handler:handler]; + } +} + +- (void)openURLWithSafariViewController:(NSURL *)url + sender:(id)sender + fromViewController:(UIViewController *)fromViewController + handler:(void(^)(BOOL))handler +{ + if (![url.scheme hasPrefix:@"http"]) { + [self openURL:url sender:sender handler:handler]; + return; + } + + _expectingBackground = NO; + _pendingURLOpen = sender; + + // trying to dynamically load SFSafariViewController class + // so for the cases when it is available we can send users through Safari View Controller flow + // in cases it is not available regular flow will be selected + Class SFSafariViewControllerClass = fbsdkdfl_SFSafariViewControllerClass(); + + if (SFSafariViewControllerClass) { + UIViewController *parent = fromViewController ?: [FBSDKInternalUtility topMostViewController]; + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + NSURLQueryItem *sfvcQueryItem = [[NSURLQueryItem alloc] initWithName:@"sfvc" value:@"1"]; + [components setQueryItems:[components.queryItems arrayByAddingObject:sfvcQueryItem]]; + url = components.URL; + FBSDKContainerViewController *container = [[FBSDKContainerViewController alloc] init]; + container.delegate = self; + if (parent.transitionCoordinator != nil) { + // Wait until the transition is finished before presenting SafariVC to avoid a blank screen. + [parent.transitionCoordinator animateAlongsideTransition:NULL completion:^(id context) { + // Note SFVC init must occur inside block to avoid blank screen. + _safariViewController = [[SFSafariViewControllerClass alloc] initWithURL:url]; + [_safariViewController performSelector:@selector(setDelegate:) withObject:self]; + [container displayChildController:_safariViewController]; + [parent presentViewController:container animated:YES completion:nil]; + }]; + } else { + _safariViewController = [[SFSafariViewControllerClass alloc] initWithURL:url]; + [_safariViewController performSelector:@selector(setDelegate:) withObject:self]; + [container displayChildController:_safariViewController]; + [parent presentViewController:container animated:YES completion:nil]; + } + + // Assuming Safari View Controller always opens + if (handler) { + handler(YES); + } + } else { + [self openURL:url sender:sender handler:handler]; + } +} + +- (void)openURL:(NSURL *)url sender:(id)sender handler:(void(^)(BOOL))handler +{ + _expectingBackground = YES; + _pendingURLOpen = sender; + dispatch_async(dispatch_get_main_queue(), ^{ + // Dispatch openURL calls to prevent hangs if we're inside the current app delegate's openURL flow already + BOOL opened = [[UIApplication sharedApplication] openURL:url]; + + if ([url.scheme hasPrefix:@"http"] && !opened) { + NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; + if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { + // Safari openURL calls can wrongly return NO on iOS 7 so manually overwrite that case to YES. + // Otherwise we would rather trust in the actual result of openURL + opened = YES; + } + } + if (handler) { + handler(opened); + } + }); +} + +#pragma mark - Helper Methods + +- (BOOL)_handleBridgeAPIResponseURL:(NSURL *)responseURL sourceApplication:(NSString *)sourceApplication +{ + FBSDKBridgeAPIRequest *request = _pendingRequest; + FBSDKBridgeAPICallbackBlock completionBlock = _pendingRequestCompletionBlock; + _pendingRequest = nil; + _pendingRequestCompletionBlock = NULL; + if (![responseURL.scheme isEqualToString:[FBSDKInternalUtility appURLScheme]]) { + return NO; + } + if (![responseURL.host isEqualToString:@"bridge"]) { + return NO; + } + if (!request) { + return NO; + } + if (!completionBlock) { + return YES; + } + NSError *error; + FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request + responseURL:responseURL + sourceApplication:sourceApplication + error:&error]; + if (response) { + completionBlock(response); + return YES; + } else if (error) { + completionBlock([FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request error:error]); + return YES; + } else { + return NO; + } +} + +- (void)_logIfAppLinkEvent:(NSURL *)url +{ + if (!url) { + return; + } + NSDictionary *params = [FBSDKUtility dictionaryWithQueryString:url.query]; + NSString *applinkDataString = params[@"al_applink_data"]; + if (!applinkDataString) { + return; + } + + NSDictionary * applinkData = [FBSDKInternalUtility objectForJSONString:applinkDataString error:NULL]; + if (!applinkData) { + return; + } + + NSURL *targetURL = [NSURL URLWithString:applinkData[@"target_url"]]; + NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:logData setObject:[targetURL absoluteString] forKey:@"targetURL"]; + [FBSDKInternalUtility dictionary:logData setObject:[targetURL host] forKey:@"targetURLHost"]; + + NSDictionary *refererData = applinkData[@"referer_data"]; + if (refererData) { + [FBSDKInternalUtility dictionary:logData setObject:refererData[@"target_url"] forKey:@"referralTargetURL"]; + [FBSDKInternalUtility dictionary:logData setObject:refererData[@"url"] forKey:@"referralURL"]; + [FBSDKInternalUtility dictionary:logData setObject:refererData[@"app_name"] forKey:@"referralAppName"]; + } + [FBSDKInternalUtility dictionary:logData setObject:[url absoluteString] forKey:@"inputURL"]; + [FBSDKInternalUtility dictionary:logData setObject:[url scheme] forKey:@"inputURLScheme"]; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppLinkInboundEvent + valueToSum:nil + parameters:logData + accessToken:nil]; +} + +- (void)_cancelBridgeRequest +{ + if (_pendingRequest && _pendingRequestCompletionBlock) { + _pendingRequestCompletionBlock([FBSDKBridgeAPIResponse bridgeAPIResponseCancelledWithRequest:_pendingRequest]); + } + _pendingRequest = nil; + _pendingRequestCompletionBlock = NULL; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h new file mode 100644 index 0000000..8132998 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @abstract A base class for common SDK buttons. + */ +@interface FBSDKButton : UIButton + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m new file mode 100644 index 0000000..48467b5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m @@ -0,0 +1,430 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKButton.h" +#import "FBSDKButton+Subclass.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKAppEvents.h" +#import "FBSDKApplicationDelegate+Internal.h" +#import "FBSDKLogo.h" +#import "FBSDKMath.h" +#import "FBSDKUIUtility.h" +#import "FBSDKViewImpressionTracker.h" + +#define HEIGHT_TO_FONT_SIZE 0.47 +#define HEIGHT_TO_MARGIN 0.27 +#define HEIGHT_TO_PADDING 0.23 +#define HEIGHT_TO_TEXT_PADDING_CORRECTION 0.08 + +@implementation FBSDKButton +{ + BOOL _skipIntrinsicContentSizing; + BOOL _isExplicitlyDisabled; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + _skipIntrinsicContentSizing = YES; + [self configureButton]; + _skipIntrinsicContentSizing = NO; + } + return self; +} + +- (void)awakeFromNib +{ + [super awakeFromNib]; + _skipIntrinsicContentSizing = YES; + [self configureButton]; + _skipIntrinsicContentSizing = NO; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Properties + +- (void)setEnabled:(BOOL)enabled +{ + _isExplicitlyDisabled = !enabled; + [self checkImplicitlyDisabled]; +} + +#pragma mark - Layout + +- (CGRect)imageRectForContentRect:(CGRect)contentRect +{ + if ([self isHidden] || CGRectIsEmpty(self.bounds)) { + return CGRectZero; + } + CGRect imageRect = UIEdgeInsetsInsetRect(contentRect, self.imageEdgeInsets); + CGFloat margin = [self _marginForHeight:[self _heightForContentRect:contentRect]]; + imageRect = CGRectInset(imageRect, margin, margin); + imageRect.size.width = CGRectGetHeight(imageRect); + return imageRect; +} + +- (CGSize)intrinsicContentSize +{ + if (_skipIntrinsicContentSizing) { + return CGSizeZero; + } + _skipIntrinsicContentSizing = YES; + CGSize size = [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; + _skipIntrinsicContentSizing = NO; + return size; +} + +- (void)layoutSubviews +{ + // automatic impression tracking if the button conforms to FBSDKButtonImpressionTracking + if ([self conformsToProtocol:@protocol(FBSDKButtonImpressionTracking)]) { + NSString *eventName = [(id)self impressionTrackingEventName]; + NSString *identifier = [(id)self impressionTrackingIdentifier]; + NSDictionary *parameters = [(id)self analyticsParameters]; + if (eventName && identifier) { + FBSDKViewImpressionTracker *impressionTracker = [FBSDKViewImpressionTracker impressionTrackerWithEventName:eventName]; + [impressionTracker logImpressionWithIdentifier:identifier parameters:parameters]; + } + } + [super layoutSubviews]; +} + +- (CGSize)sizeThatFits:(CGSize)size +{ + if ([self isHidden]) { + return CGSizeZero; + } + CGSize normalSize = [self sizeThatFits:size title:[self titleForState:UIControlStateNormal]]; + CGSize selectedSize = [self sizeThatFits:size title:[self titleForState:UIControlStateSelected]]; + return CGSizeMake(MAX(normalSize.width, selectedSize.width), MAX(normalSize.height, selectedSize.height)); +} + +- (void)sizeToFit +{ + CGRect bounds = self.bounds; + bounds.size = [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; + self.bounds = bounds; +} + +- (CGRect)titleRectForContentRect:(CGRect)contentRect +{ + if ([self isHidden] || CGRectIsEmpty(self.bounds)) { + return CGRectZero; + } + CGRect imageRect = [self imageRectForContentRect:contentRect]; + CGFloat height = [self _heightForContentRect:contentRect]; + CGFloat padding = [self _paddingForHeight:height]; + CGFloat titleX = CGRectGetMaxX(imageRect) + padding; + CGRect titleRect = CGRectMake(titleX, 0.0, CGRectGetWidth(contentRect) - titleX, CGRectGetHeight(contentRect)); + + UIEdgeInsets titleEdgeInsets = UIEdgeInsetsZero; + if (!self.layer.needsLayout) { + UILabel *titleLabel = self.titleLabel; + if (titleLabel.textAlignment == NSTextAlignmentCenter) { + // if the text is centered, we need to adjust the frame for the titleLabel based on the size of the text in order + // to keep the text centered in the button without adding extra blank space to the right when unnecessary + // 1. the text fits centered within the button without colliding with the image (imagePaddingWidth) + // 2. the text would run into the image, so adjust the insets to effectively left align it (textPaddingWidth) + CGSize titleSize = FBSDKTextSize(titleLabel.text, + titleLabel.font, + titleRect.size, + titleLabel.lineBreakMode); + CGFloat titlePaddingWidth = (CGRectGetWidth(titleRect) - titleSize.width) / 2; + CGFloat imagePaddingWidth = (titleX - [self _marginForHeight:height]) / 2; + CGFloat inset = MIN(titlePaddingWidth, imagePaddingWidth); + titleEdgeInsets.left -= inset; + titleEdgeInsets.right += inset; + } + } + return UIEdgeInsetsInsetRect(titleRect, titleEdgeInsets); +} + +#pragma mark - Subclass Methods + +- (void)logTapEventWithEventName:(NSString *)eventName parameters:(NSDictionary *)parameters +{ + [FBSDKAppEvents logImplicitEvent:eventName + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; +} + +- (void)checkImplicitlyDisabled +{ + BOOL enabled = !_isExplicitlyDisabled && ![self isImplicitlyDisabled]; + BOOL currentEnabled = [self isEnabled]; + [super setEnabled:enabled]; + if (currentEnabled != enabled) { + [self invalidateIntrinsicContentSize]; + [self setNeedsLayout]; + } +} + +- (void)configureButton +{ + [self configureWithIcon:[[self class] defaultIcon] + title:nil + backgroundColor:[[self class] defaultBackgroundColor] + highlightedColor:[[self class] defaultHighlightedColor]]; +} + +- (void)configureWithIcon:(FBSDKIcon *)icon + title:(NSString *)title + backgroundColor:(UIColor *)backgroundColor + highlightedColor:(UIColor *)highlightedColor +{ + [self _configureWithIcon:icon + title:title + backgroundColor:backgroundColor + highlightedColor:highlightedColor + selectedTitle:nil + selectedIcon:nil + selectedColor:nil + selectedHighlightedColor:nil]; +} + +- (void)configureWithIcon:(FBSDKIcon *)icon + title:(NSString *)title + backgroundColor:(UIColor *)backgroundColor + highlightedColor:(UIColor *)highlightedColor + selectedTitle:(NSString *)selectedTitle + selectedIcon:(FBSDKIcon *)selectedIcon + selectedColor:(UIColor *)selectedColor + selectedHighlightedColor:(UIColor *)selectedHighlightedColor +{ + if (!selectedColor) { + selectedColor = [self defaultSelectedColor]; + } + if (!selectedHighlightedColor) { + selectedHighlightedColor = highlightedColor; + } + [self _configureWithIcon:icon + title:title + backgroundColor:backgroundColor + highlightedColor:highlightedColor + selectedTitle:selectedTitle + selectedIcon:selectedIcon + selectedColor:selectedColor + selectedHighlightedColor:selectedHighlightedColor]; +} + +- (UIColor *)defaultBackgroundColor +{ + return [UIColor colorWithRed:65.0/255.0 green:93.0/255.0 blue:174.0/255.0 alpha:1.0]; +} + +- (UIColor *)defaultDisabledColor +{ + return [UIColor colorWithRed:189.0/255.0 green:193.0/255.0 blue:201.0/255.0 alpha:1.0]; +} + +- (UIColor *)defaultHighlightedColor +{ + return [UIColor colorWithRed:47.0/255.0 green:71.0/255.0 blue:122.0/255.0 alpha:1.0]; +} + +- (FBSDKIcon *)defaultIcon +{ + return [[FBSDKLogo alloc] init]; +} + +- (UIColor *)defaultSelectedColor +{ + return [UIColor colorWithRed:124.0/255.0 green:143.0/255.0 blue:200.0/255.0 alpha:1.0]; +} + +- (BOOL)isImplicitlyDisabled +{ + return NO; +} + +- (CGSize)sizeThatFits:(CGSize)size title:(NSString *)title +{ + UIFont *font = self.titleLabel.font; + CGFloat height = [self _heightForFont:font]; + + UIEdgeInsets contentEdgeInsets = self.contentEdgeInsets; + + CGSize constrainedContentSize = FBSDKEdgeInsetsInsetSize(size, contentEdgeInsets); + + CGSize titleSize = FBSDKTextSize(title, font, constrainedContentSize, self.titleLabel.lineBreakMode); + + CGFloat padding = [self _paddingForHeight:height]; + CGFloat textPaddingCorrection = [self _textPaddingCorrectionForHeight:height]; + CGSize contentSize = CGSizeMake(height + padding + titleSize.width - textPaddingCorrection, height); + return FBSDKEdgeInsetsOutsetSize(contentSize, contentEdgeInsets); +} + +#pragma mark - Helper Methods + +- (void)_applicationDidBecomeActiveNotification:(NSNotification *)notification +{ + [self checkImplicitlyDisabled]; +} + +- (UIImage *)_backgroundImageWithColor:(UIColor *)color cornerRadius:(CGFloat)cornerRadius scale:(CGFloat)scale +{ + CGFloat size = 1.0 + 2 * cornerRadius; + UIGraphicsBeginImageContextWithOptions(CGSizeMake(size, size), NO, scale); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context, color.CGColor); + CGMutablePathRef path = CGPathCreateMutable(); + CGPathMoveToPoint(path, NULL, cornerRadius + 1.0, 0.0); + CGPathAddArcToPoint(path, NULL, size, 0.0, size, cornerRadius, cornerRadius); + CGPathAddLineToPoint(path, NULL, size, cornerRadius + 1.0); + CGPathAddArcToPoint(path, NULL, size, size, cornerRadius + 1.0, size, cornerRadius); + CGPathAddLineToPoint(path, NULL, cornerRadius, size); + CGPathAddArcToPoint(path, NULL, 0.0, size, 0.0, cornerRadius + 1.0, cornerRadius); + CGPathAddLineToPoint(path, NULL, 0.0, cornerRadius); + CGPathAddArcToPoint(path, NULL, 0.0, 0.0, cornerRadius, 0.0, cornerRadius); + CGPathCloseSubpath(path); + CGContextAddPath(context, path); + CGPathRelease(path); + CGContextFillPath(context); + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return [image stretchableImageWithLeftCapWidth:cornerRadius topCapHeight:cornerRadius]; +} + +- (void)_configureWithIcon:(FBSDKIcon *)icon + title:(NSString *)title + backgroundColor:(UIColor *)backgroundColor + highlightedColor:(UIColor *)highlightedColor + selectedTitle:(NSString *)selectedTitle + selectedIcon:(FBSDKIcon *)selectedIcon + selectedColor:(UIColor *)selectedColor + selectedHighlightedColor:(UIColor *)selectedHighlightedColor +{ + [self checkImplicitlyDisabled]; + + if (!icon) { + icon = [self defaultIcon]; + } + if (!backgroundColor) { + backgroundColor = [self defaultBackgroundColor]; + } + if (!highlightedColor) { + highlightedColor = [self defaultHighlightedColor]; + } + + self.adjustsImageWhenDisabled = NO; + self.adjustsImageWhenHighlighted = NO; + self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; + self.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; + self.tintColor = [UIColor whiteColor]; + + BOOL forceSizeToFit = CGRectIsEmpty(self.bounds); + + CGFloat scale = [UIScreen mainScreen].scale; + UIImage *backgroundImage; + + backgroundImage = [self _backgroundImageWithColor:backgroundColor cornerRadius:3.0 scale:scale]; + [self setBackgroundImage:backgroundImage forState:UIControlStateNormal]; + + backgroundImage = [self _backgroundImageWithColor:highlightedColor cornerRadius:3.0 scale:scale]; + [self setBackgroundImage:backgroundImage forState:UIControlStateHighlighted]; + + backgroundImage = [self _backgroundImageWithColor:[self defaultDisabledColor] cornerRadius:3.0 scale:scale]; + [self setBackgroundImage:backgroundImage forState:UIControlStateDisabled]; + + if (selectedColor) { + backgroundImage = [self _backgroundImageWithColor:selectedColor cornerRadius:3.0 scale:scale]; + [self setBackgroundImage:backgroundImage forState:UIControlStateSelected]; + } + + if (selectedHighlightedColor) { + backgroundImage = [self _backgroundImageWithColor:selectedHighlightedColor cornerRadius:3.0 scale:scale]; + [self setBackgroundImage:backgroundImage forState:UIControlStateSelected | UIControlStateHighlighted]; + } + + [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + + [self setTitle:title forState:UIControlStateNormal]; + if (selectedTitle) { + [self setTitle:selectedTitle forState:UIControlStateSelected]; + [self setTitle:selectedTitle forState:UIControlStateSelected | UIControlStateHighlighted]; + } + + UILabel *titleLabel = self.titleLabel; + titleLabel.lineBreakMode = NSLineBreakByClipping; + UIFont *font = [UIFont boldSystemFontOfSize:14.0]; + titleLabel.font = font; + + CGSize imageSize = CGSizeMake(font.pointSize, font.pointSize); + UIImage *image = [icon imageWithSize:imageSize]; + image = [image resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch]; + [self setImage:image forState:UIControlStateNormal]; + + if (selectedIcon) { + UIImage *selectedImage = [selectedIcon imageWithSize:imageSize]; + selectedImage = [selectedImage resizableImageWithCapInsets:UIEdgeInsetsZero + resizingMode:UIImageResizingModeStretch]; + [self setImage:selectedImage forState:UIControlStateSelected]; + [self setImage:selectedImage forState:UIControlStateSelected | UIControlStateHighlighted]; + } + + if (forceSizeToFit) { + [self sizeToFit]; + } + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(_applicationDidBecomeActiveNotification:) + name:FBSDKApplicationDidBecomeActiveNotification + object:[FBSDKApplicationDelegate sharedInstance]]; +} + +- (CGFloat)_fontSizeForHeight:(CGFloat)height +{ + return floorf(height * HEIGHT_TO_FONT_SIZE); +} + +- (CGFloat)_heightForContentRect:(CGRect)contentRect +{ + UIEdgeInsets contentEdgeInsets = self.contentEdgeInsets; + return contentEdgeInsets.top + CGRectGetHeight(contentRect) + contentEdgeInsets.bottom; +} + +- (CGFloat)_heightForFont:(UIFont *)font +{ + return floorf(font.pointSize / (1 - 2 * HEIGHT_TO_MARGIN)); +} + +- (CGFloat)_marginForHeight:(CGFloat)height +{ + return floorf(height * HEIGHT_TO_MARGIN); +} + +- (CGFloat)_paddingForHeight:(CGFloat)height +{ + return roundf(height * HEIGHT_TO_PADDING) - [self _textPaddingCorrectionForHeight:height]; +} + +- (CGFloat)_textPaddingCorrectionForHeight:(CGFloat)height +{ + return floorf(height * HEIGHT_TO_TEXT_PADDING_CORRECTION); +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h new file mode 100644 index 0000000..5f53161 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h @@ -0,0 +1,210 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract The error domain for all errors from FBSDKCoreKit. + @discussion Error codes from the SDK in the range 0-99 are reserved for this domain. + */ +FBSDK_EXTERN NSString *const FBSDKErrorDomain; + +/*! + @typedef NS_ENUM(NSInteger, FBSDKErrorCode) + @abstract Error codes for FBSDKErrorDomain. + */ +typedef NS_ENUM(NSInteger, FBSDKErrorCode) +{ + /*! + @abstract Reserved. + */ + FBSDKReservedErrorCode = 0, + + /*! + @abstract The error code for errors from invalid encryption on incoming encryption URLs. + */ + FBSDKEncryptionErrorCode, + + /*! + @abstract The error code for errors from invalid arguments to SDK methods. + */ + FBSDKInvalidArgumentErrorCode, + + /*! + @abstract The error code for unknown errors. + */ + FBSDKUnknownErrorCode, + + /*! + @abstract A request failed due to a network error. Use NSUnderlyingErrorKey to retrieve + the error object from the NSURLConnection for more information. + */ + FBSDKNetworkErrorCode, + + /*! + @abstract The error code for errors encounted during an App Events flush. + */ + FBSDKAppEventsFlushErrorCode, + + /*! + @abstract An endpoint that returns a binary response was used with FBSDKGraphRequestConnection. + @discussion Endpoints that return image/jpg, etc. should be accessed using NSURLRequest + */ + FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode, + + /*! + @abstract The operation failed because the server returned an unexpected response. + @discussion You can get this error if you are not using the most recent SDK, or you are accessing a version of the + Graph API incompatible with the current SDK. + */ + FBSDKGraphRequestProtocolMismatchErrorCode, + + /*! + @abstract The Graph API returned an error. + @discussion See below for useful userInfo keys (beginning with FBSDKGraphRequestError*) + */ + FBSDKGraphRequestGraphAPIErrorCode, + + /*! + @abstract The specified dialog configuration is not available. + @discussion This error may signify that the configuration for the dialogs has not yet been downloaded from the server + or that the dialog is unavailable. Subsequent attempts to use the dialog may succeed as the configuration is loaded. + */ + FBSDKDialogUnavailableErrorCode, + + /*! + @abstract Indicates an operation failed because a required access token was not found. + */ + FBSDKAccessTokenRequiredErrorCode, + + /*! + @abstract Indicates an app switch (typically for a dialog) failed because the destination app is out of date. + */ + FBSDKAppVersionUnsupportedErrorCode, + + /*! + @abstract Indicates an app switch to the browser (typically for a dialog) failed. + */ + FBSDKBrowswerUnavailableErrorCode, +}; + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) + @abstract Describes the category of Facebook error. See `FBSDKGraphRequestErrorCategoryKey`. + */ +typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) +{ + /*! The default error category that is not known to be recoverable. Check `FBSDKLocalizedErrorDescriptionKey` for a user facing message. */ + FBSDKGraphRequestErrorCategoryOther = 0, + /*! Indicates the error is temporary (such as server throttling). While a recoveryAttempter will be provided with the error instance, the attempt is guaranteed to succeed so you can simply retry the operation if you do not want to present an alert. */ + FBSDKGraphRequestErrorCategoryTransient = 1, + /*! Indicates the error can be recovered (such as requiring a login). A recoveryAttempter will be provided with the error instance that can take UI action. */ + FBSDKGraphRequestErrorCategoryRecoverable = 2 +}; + +/* + @methodgroup error userInfo keys + */ + +/*! + @abstract The userInfo key for the invalid collection for errors with FBSDKInvalidArgumentErrorCode. + @discussion If the invalid argument is a collection, the collection can be found with this key and the individual + invalid item can be found with FBSDKErrorArgumentValueKey. + */ +FBSDK_EXTERN NSString *const FBSDKErrorArgumentCollectionKey; + +/*! + @abstract The userInfo key for the invalid argument name for errors with FBSDKInvalidArgumentErrorCode. + */ +FBSDK_EXTERN NSString *const FBSDKErrorArgumentNameKey; + +/*! + @abstract The userInfo key for the invalid argument value for errors with FBSDKInvalidArgumentErrorCode. + */ +FBSDK_EXTERN NSString *const FBSDKErrorArgumentValueKey; + +/*! + @abstract The userInfo key for the message for developers in NSErrors that originate from the SDK. + @discussion The developer message will not be localized and is not intended to be presented within the app. + */ +FBSDK_EXTERN NSString *const FBSDKErrorDeveloperMessageKey; + +/*! + @abstract The userInfo key describing a localized description that can be presented to the user. + */ +FBSDK_EXTERN NSString *const FBSDKErrorLocalizedDescriptionKey; + +/*! + @abstract The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`. + */ +FBSDK_EXTERN NSString *const FBSDKErrorLocalizedTitleKey; + +/* + @methodgroup FBSDKGraphRequest error userInfo keys + */ + +/*! + @abstract The userInfo key describing the error category, for error recovery purposes. + @discussion See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorCategoryKey; + +/* + @abstract The userInfo key for the Graph API error code. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorCode; + +/* + @abstract The userInfo key for the Graph API error subcode. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorSubcode; + +/* + @abstract The userInfo key for the HTTP status code. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey; + +/* + @abstract The userInfo key for the raw JSON response. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey; + +/*! + @abstract a formal protocol very similar to the informal protocol NSErrorRecoveryAttempting + */ +@protocol FBSDKErrorRecoveryAttempting + +/*! + @abstract attempt the recovery + @param error the error + @param recoveryOptionIndex the selected option index + @param delegate the delegate + @param didRecoverSelector the callback selector, see discussion. + @param contextInfo context info to pass back to callback selector, see discussion. + @discussion + Given that an error alert has been presented document-modally to the user, and the user has chosen one of the error's recovery options, attempt recovery from the error, and send the selected message to the specified delegate. The option index is an index into the error's array of localized recovery options. The method selected by didRecoverSelector must have the same signature as: + + - (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; + + The value passed for didRecover must be YES if error recovery was completely successful, NO otherwise. + */ +- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m new file mode 100644 index 0000000..f3a6ee5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m @@ -0,0 +1,34 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKConstants.h" + +NSString *const FBSDKErrorDomain = @"com.facebook.sdk.core"; + +NSString *const FBSDKErrorArgumentCollectionKey = @"com.facebook.sdk:FBSDKErrorArgumentCollectionKey"; +NSString *const FBSDKErrorArgumentNameKey = @"com.facebook.sdk:FBSDKErrorArgumentNameKey"; +NSString *const FBSDKErrorArgumentValueKey = @"com.facebook.sdk:FBSDKErrorArgumentValueKey"; +NSString *const FBSDKErrorDeveloperMessageKey = @"com.facebook.sdk:FBSDKErrorDeveloperMessageKey"; +NSString *const FBSDKErrorLocalizedDescriptionKey = @"com.facebook.sdk:FBSDKErrorLocalizedDescriptionKey"; +NSString *const FBSDKErrorLocalizedTitleKey = @"com.facebook.sdk:FBSDKErrorLocalizedErrorTitleKey"; + +NSString *const FBSDKGraphRequestErrorCategoryKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey"; +NSString *const FBSDKGraphRequestErrorGraphErrorCode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode"; +NSString *const FBSDKGraphRequestErrorGraphErrorSubcode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode"; +NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey"; +NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey = @"com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey"; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h new file mode 100644 index 0000000..f4ad767 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h @@ -0,0 +1,33 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @abstract Extension protocol for NSCopying that adds the copy method, which is implemented on NSObject. + @discussion NSObject implicitly conforms to this protocol. + */ +@protocol FBSDKCopying + +/*! + @abstract Implemented by NSObject as a convenience to copyWithZone:. + @return A copy of the receiver. + */ +- (id)copy; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h new file mode 100644 index 0000000..3b78900 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h @@ -0,0 +1,38 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#define FBSDK_VERSION_STRING @"4.7.0" +#define FBSDK_TARGET_PLATFORM_VERSION @"v2.5" diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h new file mode 100644 index 0000000..d2b0313 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h @@ -0,0 +1,97 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKConstants.h" + +@class FBSDKGraphErrorRecoveryProcessor; +@class FBSDKGraphRequest; + +/*! + @abstract Defines a delegate for `FBSDKGraphErrorRecoveryProcessor`. + */ +@protocol FBSDKGraphErrorRecoveryProcessorDelegate + +/*! + @abstract Indicates the error recovery has been attempted. + @param processor the processor instance. + @param didRecover YES if the recovery was successful. + @param error the error that that was attempted to be recovered from. + */ +- (void)processorDidAttemptRecovery:(FBSDKGraphErrorRecoveryProcessor *)processor didRecover:(BOOL)didRecover error:(NSError *)error; + +@optional +/*! + @abstract Indicates the processor is about to process the error. + @param processor the processor instance. + @param error the error is about to be processed. + @discussion return NO if the processor should not process the error. For example, + if you want to prevent alerts of localized messages but otherwise perform retries and recoveries, + you could return NO for errors where userInfo[FBSDKGraphRequestErrorCategoryKey] equal to FBSDKGraphRequestErrorCategoryOther + */ +- (BOOL)processorWillProcessError:(FBSDKGraphErrorRecoveryProcessor *)processor error:(NSError *)error; + +@end + +/*! + @abstract Defines a type that can process Facebook NSErrors with best practices. + @discussion Facebook NSErrors can contain FBSDKErrorRecoveryAttempting instances to recover from errors, or + localized messages to present to the user. This class will process the instances as follows: + + 1. If the error is temporary as indicated by FBSDKGraphRequestErrorCategoryKey, assume the recovery succeeded and + notify the delegate. + 2. If a FBSDKErrorRecoveryAttempting instance is available, display an alert (dispatched to main thread) + with the recovery options and call the instance's [ attemptRecoveryFromError:optionIndex:...]. + 3. If a FBSDKErrorRecoveryAttempting is not available, check the userInfo for FBSDKLocalizedErrorDescriptionKey + and present that in an alert (dispatched to main thread). + + By default, FBSDKGraphRequests use this type to process errors and retry the request upon a successful + recovery. + + Note that Facebook recovery attempters can present UI or even cause app switches (such as to login). Any such + work is dispatched to the main thread (therefore your request handlers may then run on the main thread). + + Login recovery requires FBSDKLoginKit. Login will use FBSDKLoginBehaviorNative and will prompt the user + for all permissions last granted. If any are declined on the new request, the recovery is not successful but + the `[FBSDKAccessToken currentAccessToken]` might still have been updated. + . + */ +@interface FBSDKGraphErrorRecoveryProcessor : NSObject + +/*! + @abstract Gets the delegate. Note this is a strong reference, and is nil'ed out after recovery is complete. + */ +@property (nonatomic, strong, readonly) iddelegate; + +/*! + @abstract Attempts to process the error, return YES if the error can be processed. + @param error the error to process. + @param request the relateed request that may be reissued. + @param delegate the delegate that will be retained until recovery is complete. + */ +- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id) delegate; + +/*! + @abstract The callback for FBSDKErrorRecoveryAttempting + @param didRecover if the recovery succeeded + @param contextInfo unused + */ +- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m new file mode 100644 index 0000000..4caed96 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m @@ -0,0 +1,155 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKErrorRecoveryAttempter.h" + +@interface FBSDKGraphErrorRecoveryProcessor() +{ + FBSDKErrorRecoveryAttempter *_recoveryAttempter; + NSError *_error; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + UIAlertView *_alertView; +#pragma clang diagnostic pop +} + +@property (nonatomic, strong, readwrite) iddelegate; + +@end + +@implementation FBSDKGraphErrorRecoveryProcessor + +- (void)dealloc +{ + _alertView.delegate = nil; +} + +- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id) delegate +{ + self.delegate = delegate; + if ([self.delegate respondsToSelector:@selector(processorWillProcessError:error:)]) { + if (![self.delegate processorWillProcessError:self error:error]) { + return NO; + } + } + + FBSDKGraphRequestErrorCategory errorCategory = [error.userInfo[FBSDKGraphRequestErrorCategoryKey] unsignedIntegerValue]; + switch (errorCategory) { + case FBSDKGraphRequestErrorCategoryTransient : + [self.delegate processorDidAttemptRecovery:self didRecover:YES error:nil]; + self.delegate = nil; + return YES; + case FBSDKGraphRequestErrorCategoryRecoverable : + if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) { + _recoveryAttempter = error.recoveryAttempter; + BOOL isLoginRecoveryAttempter = [_recoveryAttempter isKindOfClass:NSClassFromString(@"_FBSDKLoginRecoveryAttempter")]; + + // Set up a block to do the typical recovery work so that we can chain it for ios auth special cases. + // the block returns YES if recovery UI is started (meaning we wait for the alertviewdelegate to resume control flow). + BOOL (^standardRecoveryWork)(void) = ^BOOL{ + NSArray *recoveryOptionsTitles = error.userInfo[NSLocalizedRecoveryOptionsErrorKey]; + if (recoveryOptionsTitles.count > 0 && _recoveryAttempter) { + NSString *recoverySuggestion = error.userInfo[NSLocalizedRecoverySuggestionErrorKey]; + _error = error; + dispatch_async(dispatch_get_main_queue(), ^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + _alertView = [[UIAlertView alloc] initWithTitle:nil + message:recoverySuggestion + delegate:self + cancelButtonTitle:nil + otherButtonTitles:nil]; +#pragma clang diagnostic pop + for (NSString *option in recoveryOptionsTitles) { + [_alertView addButtonWithTitle:option]; + } + [_alertView show]; + }); + return YES; + } + return NO; + }; + + if ([request.tokenString isEqualToString:[[FBSDKSystemAccountStoreAdapter sharedInstance] accessTokenString]] && + isLoginRecoveryAttempter) { + // special system auth case: if user has granted permissions we can simply renew. On a successful + // renew, treat this as immediately recovered without the standard alert prompty. + // (for example, this can repair expired tokens seamlessly) + [[FBSDKSystemAccountStoreAdapter sharedInstance] + renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *renewError) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (result == ACAccountCredentialRenewResultRenewed) { + [self.delegate processorDidAttemptRecovery:self didRecover:YES error:nil]; + self.delegate = nil; + } else if (!standardRecoveryWork()) { + [self.delegate processorDidAttemptRecovery:self didRecover:NO error:_error]; + }; + }); + }]; + // short-circuit YES so that the renew callback resumes the control flow. + return YES; + } + + return standardRecoveryWork(); + } + return NO; + case FBSDKGraphRequestErrorCategoryOther : + if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) { + NSString *message = error.userInfo[FBSDKErrorLocalizedDescriptionKey]; + NSString *title = error.userInfo[FBSDKErrorLocalizedTitleKey]; + if (message) { + dispatch_async(dispatch_get_main_queue(), ^{ + NSString *localizedOK = + NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Alert.OK", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"OK", + @"The title of the label to dismiss the alert when presenting user facing error messages"); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[[UIAlertView alloc] initWithTitle:title + message:message + delegate:nil + cancelButtonTitle:localizedOK + otherButtonTitles:nil] show]; +#pragma clang diagnostic pop + }); + } + } + return NO; + } + return NO; +} + +#pragma mark - UIAlertViewDelegate + +- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex +{ + [_recoveryAttempter attemptRecoveryFromError:_error optionIndex:buttonIndex delegate:self didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:) contextInfo:nil]; + _alertView.delegate = nil; + _alertView = nil; +} + +#pragma mark - FBSDKErrorRecoveryAttempting "delegate" + +- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo +{ + [self.delegate processorDidAttemptRecovery:self didRecover:didRecover error:_error]; + self.delegate = nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h new file mode 100644 index 0000000..5ae03e2 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h @@ -0,0 +1,120 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@class FBSDKAccessToken; + +/*! + @abstract Represents a request to the Facebook Graph API. + + @discussion `FBSDKGraphRequest` encapsulates the components of a request (the + Graph API path, the parameters, error recovery behavior) and should be + used in conjunction with `FBSDKGraphRequestConnection` to issue the request. + + Nearly all Graph APIs require an access token. Unless specified, the + `[FBSDKAccessToken currentAccessToken]` is used. Therefore, most requests + will require login first (see `FBSDKLoginManager` in FBSDKLoginKit.framework). + + A `- start` method is provided for convenience for single requests. + + By default, FBSDKGraphRequest will attempt to recover any errors returned from + Facebook. You can disable this via `disableErrorRecovery:`. + @see FBSDKGraphErrorRecoveryProcessor + */ +@interface FBSDKGraphRequest : NSObject + +/*! + @abstract Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. + @param graphPath the graph path (e.g., @"me"). + @param parameters the optional parameters dictionary. + */ +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters; + +/*! + @abstract Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. + @param graphPath the graph path (e.g., @"me"). + @param parameters the optional parameters dictionary. + @param HTTPMethod the optional HTTP method. nil defaults to @"GET". + */ +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + HTTPMethod:(NSString *)HTTPMethod; + +/*! + @abstract Initializes a new instance. + @param graphPath the graph path (e.g., @"me"). + @param parameters the optional parameters dictionary. + @param tokenString the token string to use. Specifying nil will cause no token to be used. + @param version the optional Graph API version (e.g., @"v2.0"). nil defaults to FBSDK_TARGET_PLATFORM_VERSION. + @param HTTPMethod the optional HTTP method (e.g., @"POST"). nil defaults to @"GET". + */ +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + tokenString:(NSString *)tokenString + version:(NSString *)version + HTTPMethod:(NSString *)HTTPMethod +NS_DESIGNATED_INITIALIZER; + +/*! + @abstract The request parameters. + */ +@property (nonatomic, strong, readonly) NSMutableDictionary *parameters; + +/*! + @abstract The access token string used by the request. + */ +@property (nonatomic, copy, readonly) NSString *tokenString; + +/*! + @abstract The Graph API endpoint to use for the request, for example "me". + */ +@property (nonatomic, copy, readonly) NSString *graphPath; + +/*! + @abstract The HTTPMethod to use for the request, for example "GET" or "POST". + */ +@property (nonatomic, copy, readonly) NSString *HTTPMethod; + +/*! + @abstract The Graph API version to use (e.g., "v2.0") + */ +@property (nonatomic, copy, readonly) NSString *version; + +/*! + @abstract If set, disables the automatic error recovery mechanism. + @param disable whether to disable the automatic error recovery mechanism + @discussion By default, non-batched FBSDKGraphRequest instances will automatically try to recover + from errors by constructing a `FBSDKGraphErrorRecoveryProcessor` instance that + re-issues the request on successful recoveries. The re-issued request will call the same + handler as the receiver but may occur with a different `FBSDKGraphRequestConnection` instance. + + This will override [FBSDKSettings setGraphErrorRecoveryDisabled:]. + */ +- (void)setGraphErrorRecoveryDisabled:(BOOL)disable; + +/*! + @abstract Starts a connection to the Graph API. + @param handler The handler block to call when the request completes. + */ +- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m new file mode 100644 index 0000000..050a676 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m @@ -0,0 +1,204 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGraphRequest+Internal.h" + +#import + +#import "FBSDKAccessToken.h" +#import "FBSDKCoreKit.h" +#import "FBSDKGraphRequestConnection.h" +#import "FBSDKGraphRequestDataAttachment.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings+Internal.h" + +// constants +static NSString *const kGetHTTPMethod = @"GET"; + +@interface FBSDKGraphRequest() +@property (nonatomic, assign) FBSDKGraphRequestFlags flags; +@end + +@implementation FBSDKGraphRequest + +- (instancetype)init NS_UNAVAILABLE +{ + assert(0); +} + +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters { + return [self initWithGraphPath:graphPath + parameters:parameters + flags:FBSDKGraphRequestFlagNone]; +} + +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + HTTPMethod:(NSString *)HTTPMethod { + return [self initWithGraphPath:graphPath + parameters:parameters + tokenString:[FBSDKAccessToken currentAccessToken].tokenString + version:nil + HTTPMethod:HTTPMethod]; +} + +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + flags:(FBSDKGraphRequestFlags)flags { + return [self initWithGraphPath:graphPath + parameters:parameters + tokenString:[FBSDKAccessToken currentAccessToken].tokenString + HTTPMethod:nil + flags:flags]; +} + +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + tokenString:(NSString *)tokenString + HTTPMethod:(NSString *)HTTPMethod + flags:(FBSDKGraphRequestFlags)flags { + if ((self = [self initWithGraphPath:graphPath + parameters:parameters + tokenString:tokenString + version:FBSDK_TARGET_PLATFORM_VERSION + HTTPMethod:HTTPMethod])) { + self.flags |= flags; + } + return self; +} + +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + tokenString:(NSString *)tokenString + version:(NSString *)version + HTTPMethod:(NSString *)HTTPMethod { + if ((self = [super init])) { + _tokenString = [tokenString copy]; + _version = version ? [version copy] : FBSDK_TARGET_PLATFORM_VERSION; + _graphPath = [graphPath copy]; + _HTTPMethod = HTTPMethod ? [HTTPMethod copy] : kGetHTTPMethod; + _parameters = [[NSMutableDictionary alloc] initWithDictionary:parameters]; + if ([FBSDKSettings isGraphErrorRecoveryDisabled]) { + _flags = FBSDKGraphRequestFlagDisableErrorRecovery; + } + } + return self; +} + +- (BOOL)isGraphErrorRecoveryDisabled +{ + return (self.flags & FBSDKGraphRequestFlagDisableErrorRecovery); +} + +- (void)setGraphErrorRecoveryDisabled:(BOOL)disable +{ + if (disable) { + self.flags |= FBSDKGraphRequestFlagDisableErrorRecovery; + } else { + self.flags &= ~FBSDKGraphRequestFlagDisableErrorRecovery; + } +} + +- (BOOL)hasAttachments +{ + __block BOOL hasAttachments = NO; + [self.parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + if ([FBSDKGraphRequest isAttachment:obj]) { + hasAttachments = YES; + *stop = YES; + } + }]; + return hasAttachments; +} + ++ (BOOL)isAttachment:(id)item +{ + return ([item isKindOfClass:[UIImage class]] || + [item isKindOfClass:[NSData class]] || + [item isKindOfClass:[FBSDKGraphRequestDataAttachment class]]); +} + + ++ (NSString *)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params { + return [self serializeURL:baseUrl params:params httpMethod:kGetHTTPMethod]; +} + ++ (NSString *)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params + httpMethod:(NSString *)httpMethod { + params = [self preprocessParams: params]; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSURL *parsedURL = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; +#pragma clang pop + NSString *queryPrefix = parsedURL.query ? @"&" : @"?"; + + NSString *query = [FBSDKInternalUtility queryStringWithDictionary:params error:NULL invalidObjectHandler:^id(id object, BOOL *stop) { + if ([self isAttachment:object]) { + if ([httpMethod isEqualToString:kGetHTTPMethod]) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"can not use GET to upload a file"]; + } + return nil; + } + return object; + }]; + return [NSString stringWithFormat:@"%@%@%@", baseUrl, queryPrefix, query]; +} + ++ (NSDictionary *)preprocessParams:(NSDictionary *)params +{ + NSString *debugValue = [FBSDKSettings graphAPIDebugParamValue]; + if (debugValue) { + NSMutableDictionary *mutableParams = [NSMutableDictionary dictionaryWithDictionary:params]; + [mutableParams setObject:debugValue forKey:@"debug"]; + return mutableParams; + } + + return params; +} + +- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler +{ + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + [connection addRequest:self completionHandler:handler]; + [connection start]; + return connection; +} + +#pragma mark - Debugging helpers + +- (NSString *)description +{ + NSMutableString *result = [NSMutableString stringWithFormat:@"<%@: %p", + NSStringFromClass([self class]), + self]; + if (self.graphPath) { + [result appendFormat:@", graphPath: %@", self.graphPath]; + } + if (self.HTTPMethod) { + [result appendFormat:@", HTTPMethod: %@", self.HTTPMethod]; + } + [result appendFormat:@", parameters: %@>", [self.parameters description]]; + return result; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h new file mode 100644 index 0000000..79ffb3f --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h @@ -0,0 +1,325 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@class FBSDKGraphRequest; +@class FBSDKGraphRequestConnection; + +/*! + @typedef FBSDKGraphRequestHandler + + @abstract + A block that is passed to addRequest to register for a callback with the results of that + request once the connection completes. + + @discussion + Pass a block of this type when calling addRequest. This will be called once + the request completes. The call occurs on the UI thread. + + @param connection The `FBSDKGraphRequestConnection` that sent the request. + + @param result The result of the request. This is a translation of + JSON data to `NSDictionary` and `NSArray` objects. This + is nil if there was an error. + + @param error The `NSError` representing any error that occurred. + + */ +typedef void (^FBSDKGraphRequestHandler)(FBSDKGraphRequestConnection *connection, + id result, + NSError *error); + +/*! + @protocol + + @abstract + The `FBSDKGraphRequestConnectionDelegate` protocol defines the methods used to receive network + activity progress information from a . + */ +@protocol FBSDKGraphRequestConnectionDelegate + +@optional + +/*! + @method + + @abstract + Tells the delegate the request connection will begin loading + + @discussion + If the is created using one of the convenience factory methods prefixed with + start, the object returned from the convenience method has already begun loading and this method + will not be called when the delegate is set. + + @param connection The request connection that is starting a network request + */ +- (void)requestConnectionWillBeginLoading:(FBSDKGraphRequestConnection *)connection; + +/*! + @method + + @abstract + Tells the delegate the request connection finished loading + + @discussion + If the request connection completes without a network error occuring then this method is called. + Invocation of this method does not indicate success of every made, only that the + request connection has no further activity. Use the error argument passed to the FBSDKGraphRequestHandler + block to determine success or failure of each . + + This method is invoked after the completion handler for each . + + @param connection The request connection that successfully completed a network request + */ +- (void)requestConnectionDidFinishLoading:(FBSDKGraphRequestConnection *)connection; + +/*! + @method + + @abstract + Tells the delegate the request connection failed with an error + + @discussion + If the request connection fails with a network error then this method is called. The `error` + argument specifies why the network connection failed. The `NSError` object passed to the + FBSDKGraphRequestHandler block may contain additional information. + + @param connection The request connection that successfully completed a network request + @param error The `NSError` representing the network error that occurred, if any. May be nil + in some circumstances. Consult the `NSError` for the for reliable + failure information. + */ +- (void)requestConnection:(FBSDKGraphRequestConnection *)connection + didFailWithError:(NSError *)error; + +/*! + @method + + @abstract + Tells the delegate how much data has been sent and is planned to send to the remote host + + @discussion + The byte count arguments refer to the aggregated objects, not a particular . + + Like `NSURLConnection`, the values may change in unexpected ways if data needs to be resent. + + @param connection The request connection transmitting data to a remote host + @param bytesWritten The number of bytes sent in the last transmission + @param totalBytesWritten The total number of bytes sent to the remote host + @param totalBytesExpectedToWrite The total number of bytes expected to send to the remote host + */ +- (void)requestConnection:(FBSDKGraphRequestConnection *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; + +@end + +/*! + @class FBSDKGraphRequestConnection + + @abstract + The `FBSDKGraphRequestConnection` represents a single connection to Facebook to service a request. + + @discussion + The request settings are encapsulated in a reusable object. The + `FBSDKGraphRequestConnection` object encapsulates the concerns of a single communication + e.g. starting a connection, canceling a connection, or batching requests. + + */ +@interface FBSDKGraphRequestConnection : NSObject + +/*! + @abstract + The delegate object that receives updates. + */ +@property (nonatomic, assign) id delegate; + +/*! + @abstract Gets or sets the timeout interval to wait for a response before giving up. + */ +@property (nonatomic) NSTimeInterval timeout; + +/*! + @abstract + The raw response that was returned from the server. (readonly) + + @discussion + This property can be used to inspect HTTP headers that were returned from + the server. + + The property is nil until the request completes. If there was a response + then this property will be non-nil during the FBSDKGraphRequestHandler callback. + */ +@property (nonatomic, retain, readonly) NSHTTPURLResponse *URLResponse; + +/*! + @methodgroup Class methods + */ + +/*! + @method + + @abstract + This method sets the default timeout on all FBSDKGraphRequestConnection instances. Defaults to 60 seconds. + + @param defaultConnectionTimeout The timeout interval. + */ ++ (void)setDefaultConnectionTimeout:(NSTimeInterval)defaultConnectionTimeout; + +/*! + @methodgroup Adding requests + */ + +/*! + @method + + @abstract + This method adds an object to this connection. + + @param request A request to be included in the round-trip when start is called. + @param handler A handler to call back when the round-trip completes or times out. + + @discussion + The completion handler is retained until the block is called upon the + completion or cancellation of the connection. + */ +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler; + +/*! + @method + + @abstract + This method adds an object to this connection. + + @param request A request to be included in the round-trip when start is called. + + @param handler A handler to call back when the round-trip completes or times out. + The handler will be invoked on the main thread. + + @param name An optional name for this request. This can be used to feed + the results of one request to the input of another in the same + `FBSDKGraphRequestConnection` as described in + [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). + + @discussion + The completion handler is retained until the block is called upon the + completion or cancellation of the connection. This request can be named + to allow for using the request's response in a subsequent request. + */ +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchEntryName:(NSString *)name; + +/*! + @method + + @abstract + This method adds an object to this connection. + + @param request A request to be included in the round-trip when start is called. + + @param handler A handler to call back when the round-trip completes or times out. + + @param batchParameters The optional dictionary of parameters to include for this request + as described in [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). + Examples include "depends_on", "name", or "omit_response_on_success". + + @discussion + The completion handler is retained until the block is called upon the + completion or cancellation of the connection. This request can be named + to allow for using the request's response in a subsequent request. + */ +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchParameters:(NSDictionary *)batchParameters; + +/*! + @methodgroup Instance methods + */ + +/*! + @method + + @abstract + Signals that a connection should be logically terminated as the + application is no longer interested in a response. + + @discussion + Synchronously calls any handlers indicating the request was cancelled. Cancel + does not guarantee that the request-related processing will cease. It + does promise that all handlers will complete before the cancel returns. A call to + cancel prior to a start implies a cancellation of all requests associated + with the connection. + */ +- (void)cancel; + +/*! + @method + + @abstract + This method starts a connection with the server and is capable of handling all of the + requests that were added to the connection. + + @discussion By default, a connection is scheduled on the current thread in the default mode when it is created. + See `setDelegateQueue:` for other options. + + This method cannot be called twice for an `FBSDKGraphRequestConnection` instance. + */ +- (void)start; + +/*! + @abstract Determines the operation queue that is used to call methods on the connection's delegate. + @param queue The operation queue to use when calling delegate methods. + @discussion By default, a connection is scheduled on the current thread in the default mode when it is created. + You cannot reschedule a connection after it has started. + + This is very similar to `[NSURLConnection setDelegateQueue:]`. + */ +- (void)setDelegateQueue:(NSOperationQueue *)queue; + +/*! + @method + + @abstract + Overrides the default version for a batch request + + @discussion + The SDK automatically prepends a version part, such as "v2.0" to API paths in order to simplify API versioning + for applications. If you want to override the version part while using batch requests on the connection, call + this method to set the version for the batch request. + + @param version This is a string in the form @"v2.0" which will be used for the version part of an API path + */ +- (void)overrideVersionPartWith:(NSString *)version; + +@end + +/*! + @abstract The key in the result dictionary for requests to old versions of the Graph API + whose response is not a JSON object. + + @discussion When a request returns a non-JSON response (such as a "true" literal), that response + will be wrapped into a dictionary using this const as the key. This only applies for very few Graph API + prior to v2.1. + */ +FBSDK_EXTERN NSString *const FBSDKNonJSONResponseProperty; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m new file mode 100644 index 0000000..3b86c36 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m @@ -0,0 +1,1011 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGraphRequestConnection+Internal.h" + +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKConstants.h" +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKError.h" +#import "FBSDKErrorConfiguration.h" +#import "FBSDKGraphErrorRecoveryProcessor.h" +#import "FBSDKGraphRequest+Internal.h" +#import "FBSDKGraphRequestBody.h" +#import "FBSDKGraphRequestDataAttachment.h" +#import "FBSDKGraphRequestMetadata.h" +#import "FBSDKGraphRequestPiggybackManager.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings+Internal.h" +#import "FBSDKURLConnection.h" + +NSString *const FBSDKNonJSONResponseProperty = @"FACEBOOK_NON_JSON_RESULT"; + +// URL construction constants +static NSString *const kGraphURLPrefix = @"graph."; +static NSString *const kGraphVideoURLPrefix = @"graph-video."; + +static NSString *const kBatchKey = @"batch"; +static NSString *const kBatchMethodKey = @"method"; +static NSString *const kBatchRelativeURLKey = @"relative_url"; +static NSString *const kBatchAttachmentKey = @"attached_files"; +static NSString *const kBatchFileNamePrefix = @"file"; +static NSString *const kBatchEntryName = @"name"; + +static NSString *const kAccessTokenKey = @"access_token"; +static NSString *const kSDK = @"ios"; +static NSString *const kUserAgentBase = @"FBiOSSDK"; + +static NSString *const kBatchRestMethodBaseURL = @"method/"; + +static NSTimeInterval g_defaultTimeout = 60.0; + +static FBSDKErrorConfiguration *g_errorConfiguration; + +// ---------------------------------------------------------------------------- +// FBSDKGraphRequestConnectionState + +typedef NS_ENUM(NSUInteger, FBSDKGraphRequestConnectionState) +{ + kStateCreated, + kStateSerialized, + kStateStarted, + kStateCompleted, + kStateCancelled, +}; + +// ---------------------------------------------------------------------------- +// Private properties and methods + +@interface FBSDKGraphRequestConnection () + +@property (nonatomic, retain) FBSDKURLConnection *connection; +@property (nonatomic, retain) NSMutableArray *requests; +@property (nonatomic) FBSDKGraphRequestConnectionState state; +@property (nonatomic, retain) FBSDKLogger *logger; +@property (nonatomic) unsigned long requestStartTime; + +@end + +// ---------------------------------------------------------------------------- +// FBSDKGraphRequestConnection + +@implementation FBSDKGraphRequestConnection +{ + NSString *_overrideVersionPart; + FBSDKGraphRequestMetadata *_recoveringRequestMetadata; + FBSDKGraphErrorRecoveryProcessor *_errorRecoveryProcessor; + NSUInteger _expectingResults; + NSOperationQueue *_delegateQueue; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _requests = [[NSMutableArray alloc] init]; + _timeout = g_defaultTimeout; + _state = kStateCreated; + _logger = [[FBSDKLogger alloc] initWithLoggingBehavior:FBSDKLoggingBehaviorNetworkRequests]; + } + return self; +} + +- (void)dealloc +{ + _connection.delegate = nil; + [_connection cancel]; +} + +#pragma mark - Public + ++ (void)setDefaultConnectionTimeout:(NSTimeInterval)defaultTimeout +{ + if (defaultTimeout >= 0) { + g_defaultTimeout = defaultTimeout; + } +} + +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler +{ + [self addRequest:request completionHandler:handler batchEntryName:nil]; +} + +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchEntryName:(NSString *)name +{ + NSDictionary *batchParams = (name)? @{kBatchEntryName : name } : nil; + [self addRequest:request completionHandler:handler batchParameters:batchParams]; +} + +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchParameters:(NSDictionary *)batchParameters +{ + if (self.state != kStateCreated) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Cannot add requests once started or if a URLRequest is set" + userInfo:nil]; + } + FBSDKGraphRequestMetadata *metadata = [[FBSDKGraphRequestMetadata alloc] initWithRequest:request + completionHandler:handler + batchParameters:batchParameters]; + + [self.requests addObject:metadata]; +} + +- (void)cancel +{ + self.state = kStateCancelled; + [self.connection cancel]; + self.connection = nil; +} + +- (void)overrideVersionPartWith:(NSString *)version +{ + if (![_overrideVersionPart isEqualToString:version]) { + _overrideVersionPart = [version copy]; + } +} + +- (void)start +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + g_errorConfiguration = [[FBSDKErrorConfiguration alloc] initWithDictionary:nil]; + }); + //optimistically check for updated server configuration; + g_errorConfiguration = [FBSDKServerConfigurationManager cachedServerConfiguration].errorConfiguration ?: g_errorConfiguration; + + if (self.state != kStateCreated && self.state != kStateSerialized) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + formatString:@"FBSDKGraphRequestConnection cannot be started again."]; + return; + } + [FBSDKGraphRequestPiggybackManager addPiggybackRequests:self]; + NSMutableURLRequest *request = [self requestWithBatch:self.requests timeout:_timeout]; + + self.state = kStateStarted; + + [self logRequest:request bodyLength:0 bodyLogger:nil attachmentLogger:nil]; + _requestStartTime = [FBSDKInternalUtility currentTimeInMilliseconds]; + + FBSDKURLConnectionHandler handler = + ^(FBSDKURLConnection *connection, + NSError *error, + NSURLResponse *response, + NSData *responseData) { + [self completeFBSDKURLConnectionWithResponse:response + data:responseData + networkError:error]; + }; + + FBSDKURLConnection *connection = [[FBSDKURLConnection alloc] initWithRequest:request + completionHandler:handler]; + if (_delegateQueue) { + [connection setDelegateQueue:_delegateQueue]; + } + connection.delegate = self; + self.connection = connection; + [connection start]; + + id delegate = self.delegate; + if ([delegate respondsToSelector:@selector(requestConnectionWillBeginLoading:)]) { + if (_delegateQueue) { + [_delegateQueue addOperationWithBlock:^{ + [delegate requestConnectionWillBeginLoading:self]; + }]; + } else { + [delegate requestConnectionWillBeginLoading:self]; + } + } +} + +- (void)setDelegateQueue:(NSOperationQueue *)queue +{ + _delegateQueue = queue; +} + +#pragma mark - Private methods (request generation) + +// +// Adds request data to a batch in a format expected by the JsonWriter. +// Binary attachments are referenced by name in JSON and added to the +// attachments dictionary. +// +- (void)addRequest:(FBSDKGraphRequestMetadata *)metadata + toBatch:(NSMutableArray *)batch + attachments:(NSMutableDictionary *)attachments + batchToken:(NSString *)batchToken +{ + NSMutableDictionary *requestElement = [[NSMutableDictionary alloc] init]; + + if (metadata.batchParameters) { + [requestElement addEntriesFromDictionary:metadata.batchParameters]; + } + + if (batchToken) { + metadata.request.parameters[kAccessTokenKey] = batchToken; + [self registerTokenToOmitFromLog:batchToken]; + } + + NSString *urlString = [self urlStringForSingleRequest:metadata.request forBatch:YES]; + requestElement[kBatchRelativeURLKey] = urlString; + requestElement[kBatchMethodKey] = metadata.request.HTTPMethod; + + NSMutableArray *attachmentNames = [NSMutableArray array]; + + [metadata.request.parameters enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + if ([FBSDKGraphRequest isAttachment:value]) { + NSString *name = [NSString stringWithFormat:@"%@%lu", + kBatchFileNamePrefix, + (unsigned long)[attachments count]]; + [attachmentNames addObject:name]; + attachments[name] = value; + } + }]; + + if ([attachmentNames count]) { + requestElement[kBatchAttachmentKey] = [attachmentNames componentsJoinedByString:@","]; + } + + [batch addObject:requestElement]; +} + +- (void)appendAttachments:(NSDictionary *)attachments + toBody:(FBSDKGraphRequestBody *)body + addFormData:(BOOL)addFormData + logger:(FBSDKLogger *)logger +{ + [attachments enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + value = [FBSDKInternalUtility convertRequestValue:value]; + if ([value isKindOfClass:[NSString class]]) { + if (addFormData) { + [body appendWithKey:key formValue:(NSString *)value logger:logger]; + } + } else if ([value isKindOfClass:[UIImage class]]) { + [body appendWithKey:key imageValue:(UIImage *)value logger:logger]; + } else if ([value isKindOfClass:[NSData class]]) { + [body appendWithKey:key dataValue:(NSData *)value logger:logger]; + } else if ([value isKindOfClass:[FBSDKGraphRequestDataAttachment class]]) { + [body appendWithKey:key dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)value logger:logger]; + } else { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors formatString:@"Unsupported FBSDKGraphRequest attachment:%@, skipping.", value]; + } + }]; +} + +// +// Serializes all requests in the batch to JSON and appends the result to +// body. Also names all attachments that need to go as separate blocks in +// the body of the request. +// +// All the requests are serialized into JSON, with any binary attachments +// named and referenced by name in the JSON. +// +- (void)appendJSONRequests:(NSArray *)requests + toBody:(FBSDKGraphRequestBody *)body + andNameAttachments:(NSMutableDictionary *)attachments + logger:(FBSDKLogger *)logger +{ + NSMutableArray *batch = [[NSMutableArray alloc] init]; + NSString *batchToken = nil; + for (FBSDKGraphRequestMetadata *metadata in requests) { + NSString *individualToken = [self accessTokenWithRequest:metadata.request]; + BOOL isClientToken = [FBSDKSettings clientToken] && [individualToken hasSuffix:[FBSDKSettings clientToken]]; + if (!batchToken && + !isClientToken) { + batchToken = individualToken; + } + [self addRequest:metadata + toBatch:batch + attachments:attachments + batchToken:[batchToken isEqualToString:individualToken] ? nil : individualToken]; + } + + NSString *jsonBatch = [FBSDKInternalUtility JSONStringForObject:batch error:NULL invalidObjectHandler:NULL]; + + [body appendWithKey:kBatchKey formValue:jsonBatch logger:logger]; + if (batchToken) { + [body appendWithKey:kAccessTokenKey formValue:batchToken logger:logger]; + } +} + +- (BOOL)_shouldWarnOnMissingFieldsParam:(FBSDKGraphRequest *)request +{ + NSString *minVersion = @"2.4"; + NSString *version = request.version; + if (!version) { + return YES; + } + if ([version hasPrefix:@"v"]) { + version = [version substringFromIndex:1]; + } + + NSComparisonResult result = [version compare:minVersion options:NSNumericSearch]; + + // if current version is the same as minVersion, or if the current version is > minVersion + return (result == NSOrderedSame) || (result == NSOrderedDescending); +} + +// Validate that all GET requests after v2.4 have a "fields" param +- (void)_validateFieldsParamForGetRequests:(NSArray *)requests +{ + for (FBSDKGraphRequestMetadata *metadata in requests) { + FBSDKGraphRequest *request = metadata.request; + if ([request.HTTPMethod.uppercaseString isEqualToString:@"GET"] && + [self _shouldWarnOnMissingFieldsParam:request] && + !request.parameters[@"fields"] && + [request.graphPath rangeOfString:@"fields="].location == NSNotFound) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + formatString:@"starting with Graph API v2.4, GET requests for /%@ should contain an explicit \"fields\" parameter", request.graphPath]; + } + } +} + +// +// Generates a NSURLRequest based on the contents of self.requests, and sets +// options on the request. Chooses between URL-based request for a single +// request and JSON-based request for batches. +// +- (NSMutableURLRequest *)requestWithBatch:(NSArray *)requests + timeout:(NSTimeInterval)timeout +{ + FBSDKGraphRequestBody *body = [[FBSDKGraphRequestBody alloc] init]; + FBSDKLogger *bodyLogger = [[FBSDKLogger alloc] initWithLoggingBehavior:_logger.loggingBehavior]; + FBSDKLogger *attachmentLogger = [[FBSDKLogger alloc] initWithLoggingBehavior:_logger.loggingBehavior]; + + NSMutableURLRequest *request; + + if (requests.count == 0) { + [[NSException exceptionWithName:NSInvalidArgumentException + reason:@"FBSDKGraphRequestConnection: Must have at least one request or urlRequest not specified." + userInfo:nil] + raise]; + + } + + [self _validateFieldsParamForGetRequests:requests]; + + if ([requests count] == 1) { + FBSDKGraphRequestMetadata *metadata = [requests objectAtIndex:0]; + NSURL *url = [NSURL URLWithString:[self urlStringForSingleRequest:metadata.request forBatch:NO]]; + request = [NSMutableURLRequest requestWithURL:url + cachePolicy:NSURLRequestUseProtocolCachePolicy + timeoutInterval:timeout]; + + // HTTP methods are case-sensitive; be helpful in case someone provided a mixed case one. + NSString *httpMethod = [metadata.request.HTTPMethod uppercaseString]; + [request setHTTPMethod:httpMethod]; + [self appendAttachments:metadata.request.parameters + toBody:body + addFormData:[httpMethod isEqualToString:@"POST"] + logger:attachmentLogger]; + } else { + // Find the session with an app ID and use that as the batch_app_id. If we can't + // find one, try to load it from the plist. As a last resort, pass 0. + NSString *batchAppID = [FBSDKSettings appID]; + if (!batchAppID || batchAppID.length == 0) { + // The Graph API batch method requires either an access token or batch_app_id. + // If we can't determine an App ID to use for the batch, we can't issue it. + [[NSException exceptionWithName:NSInternalInconsistencyException + reason:@"FBSDKGraphRequestConnection: [FBSDKSettings appID] must be specified for batch requests" + userInfo:nil] + raise]; + } + + [body appendWithKey:@"batch_app_id" formValue:batchAppID logger:bodyLogger]; + + NSMutableDictionary *attachments = [[NSMutableDictionary alloc] init]; + + [self appendJSONRequests:requests + toBody:body + andNameAttachments:attachments + logger:bodyLogger]; + + [self appendAttachments:attachments + toBody:body + addFormData:NO + logger:attachmentLogger]; + + NSURL *url = [FBSDKInternalUtility facebookURLWithHostPrefix:kGraphURLPrefix path:nil queryParameters:nil defaultVersion:_overrideVersionPart error:NULL]; + request = [NSMutableURLRequest requestWithURL:url + cachePolicy:NSURLRequestUseProtocolCachePolicy + timeoutInterval:timeout]; + [request setHTTPMethod:@"POST"]; + } + + [request setHTTPBody:[body data]]; + NSUInteger bodyLength = [[body data] length] / 1024; + + [request setValue:[FBSDKGraphRequestConnection userAgent] forHTTPHeaderField:@"User-Agent"]; + [request setValue:[FBSDKGraphRequestBody mimeContentType] forHTTPHeaderField:@"Content-Type"]; + [request setHTTPShouldHandleCookies:NO]; + + [self logRequest:request bodyLength:bodyLength bodyLogger:bodyLogger attachmentLogger:attachmentLogger]; + + return request; +} + +// +// Generates a URL for a batch containing only a single request, +// and names all attachments that need to go in the body of the +// request. +// +// The URL contains all parameters that are not body attachments, +// including the session key if present. +// +// Attachments are named and referenced by name in the URL. +// +- (NSString *)urlStringForSingleRequest:(FBSDKGraphRequest *)request forBatch:(BOOL)forBatch +{ + request.parameters[@"format"] = @"json"; + request.parameters[@"sdk"] = kSDK; + request.parameters[@"include_headers"] = @"false"; + + NSString *baseURL; + if (forBatch) { + baseURL = request.graphPath; + } else { + NSString *token = [self accessTokenWithRequest:request]; + if (token) { + [request.parameters setValue:token forKey:kAccessTokenKey]; + [self registerTokenToOmitFromLog:token]; + } + + NSString *prefix = kGraphURLPrefix; + // We special case a graph post to /videos and send it to graph-video.facebook.com + // We only do this for non batch post requests + NSString *graphPath = [request.graphPath lowercaseString]; + if ([[request.HTTPMethod uppercaseString] isEqualToString:@"POST"] && + [graphPath hasSuffix:@"/videos"]) { + graphPath = [graphPath stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]]; + NSArray *components = [graphPath componentsSeparatedByString:@"/"]; + if ([components count] == 2) { + prefix = kGraphVideoURLPrefix; + } + } + + baseURL = [[FBSDKInternalUtility facebookURLWithHostPrefix:prefix path:request.graphPath queryParameters:nil defaultVersion:request.version error:NULL] absoluteString]; + } + + NSString *url = [FBSDKGraphRequest serializeURL:baseURL + params:request.parameters + httpMethod:request.HTTPMethod]; + return url; +} + +#pragma mark - Private methods (response parsing) + +- (void)completeFBSDKURLConnectionWithResponse:(NSURLResponse *)response + data:(NSData *)data + networkError:(NSError *)error +{ + if (self.state != kStateCancelled) { + NSAssert(self.state == kStateStarted, + @"Unexpected state %lu in completeWithResponse", + (unsigned long)self.state); + self.state = kStateCompleted; + } + + NSArray *results = nil; + _URLResponse = (NSHTTPURLResponse *)response; + if (response) { + NSAssert([response isKindOfClass:[NSHTTPURLResponse class]], + @"Expected NSHTTPURLResponse, got %@", + response); + + NSInteger statusCode = _URLResponse.statusCode; + + if (!error && [response.MIMEType hasPrefix:@"image"]) { + error = [FBSDKError errorWithCode:FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode + message:@"Response is a non-text MIME type; endpoints that return images and other " + @"binary data should be fetched using NSURLRequest and NSURLConnection"]; + } else { + results = [self parseJSONResponse:data + error:&error + statusCode:statusCode]; + } + } else if (!error) { + error = [FBSDKError errorWithCode:FBSDKUnknownErrorCode + message:@"Missing NSURLResponse"]; + } + + if (!error) { + if ([self.requests count] != [results count]) { + error = [FBSDKError errorWithCode:FBSDKGraphRequestProtocolMismatchErrorCode + message:@"Unexpected number of results returned from server."]; + } else { + [_logger appendFormat:@"Response <#%lu>\nDuration: %lu msec\nSize: %lu kB\nResponse Body:\n%@\n\n", + (unsigned long)[_logger loggerSerialNumber], + [FBSDKInternalUtility currentTimeInMilliseconds] - _requestStartTime, + (unsigned long)[data length], + results]; + } + } + + if (error) { + [_logger appendFormat:@"Response <#%lu> :\n%@\n%@\n", + (unsigned long)[_logger loggerSerialNumber], + [error localizedDescription], + [error userInfo]]; + } + [_logger emitToNSLog]; + + [self completeWithResults:results networkError:error]; + + self.connection = nil; +} + +// +// If there is one request, the JSON is the response. +// If there are multiple requests, the JSON has an array of dictionaries whose +// body property is the response. +// [{ "code":200, +// "body":"JSON-response-as-a-string" }, +// { "code":200, +// "body":"JSON-response-as-a-string" }] +// +// In both cases, this function returns an NSArray containing the results. +// The NSArray looks just like the multiple request case except the body +// value is converted from a string to parsed JSON. +// +- (NSArray *)parseJSONResponse:(NSData *)data + error:(NSError **)error + statusCode:(NSInteger)statusCode; +{ + // Graph API can return "true" or "false", which is not valid JSON. + // Translate that before asking JSON parser to look at it. + NSString *responseUTF8 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSMutableArray *results = [[NSMutableArray alloc] init];; + id response = [self parseJSONOrOtherwise:responseUTF8 error:error]; + + if (responseUTF8 == nil) { + NSString *base64Data = [data length] != 0 ? [data base64EncodedStringWithOptions:0] : @""; + if (base64Data != nil) { + [FBSDKAppEvents logImplicitEvent:@"fb_response_invalid_utf8" + valueToSum:nil + parameters:nil + accessToken:nil]; + } + } + + NSDictionary *responseError = nil; + if (!response) { + if ((error != NULL) && (*error == nil)) { + *error = [self errorWithCode:FBSDKUnknownErrorCode + statusCode:statusCode + parsedJSONResponse:nil + innerError:nil + message:@"The server returned an unexpected response."]; + } + } else if ([self.requests count] == 1) { + // response is the entry, so put it in a dictionary under "body" and add + // that to array of responses. + [results addObject:@{ + @"code":@(statusCode), + @"body":response + }]; + } else if ([response isKindOfClass:[NSArray class]]) { + // response is the array of responses, but the body element of each needs + // to be decoded from JSON. + for (id item in response) { + // Don't let errors parsing one response stop us from parsing another. + NSError *batchResultError = nil; + if (![item isKindOfClass:[NSDictionary class]]) { + [results addObject:item]; + } else { + NSMutableDictionary *result = [((NSDictionary *)item) mutableCopy]; + if (result[@"body"]) { + result[@"body"] = [self parseJSONOrOtherwise:result[@"body"] error:&batchResultError]; + } + [results addObject:result]; + } + if (batchResultError) { + // We'll report back the last error we saw. + *error = batchResultError; + } + } + } else if ([response isKindOfClass:[NSDictionary class]] && + (responseError = [FBSDKTypeUtility dictionaryValue:response[@"error"]]) != nil && + [responseError[@"type"] isEqualToString:@"OAuthException"]) { + // if there was one request then return the only result. if there were multiple requests + // but only one error then the server rejected the batch access token + NSDictionary *result = @{ + @"code":@(statusCode), + @"body":response + }; + + for (NSUInteger resultIndex = 0, resultCount = self.requests.count; resultIndex < resultCount; ++resultIndex) { + [results addObject:result]; + } + } else if (error != NULL) { + *error = [self errorWithCode:FBSDKGraphRequestProtocolMismatchErrorCode + statusCode:statusCode + parsedJSONResponse:results + innerError:nil + message:nil]; + } + + return results; +} + +- (id)parseJSONOrOtherwise:(NSString *)utf8 + error:(NSError **)error +{ + id parsed = nil; + if (!(*error)) { + parsed = [FBSDKInternalUtility objectForJSONString:utf8 error:error]; + // if we fail parse we attemp a reparse of a modified input to support results in the form "foo=bar", "true", etc. + // which is shouldn't be necessary since Graph API v2.1. + if (*error) { + // we round-trip our hand-wired response through the parser in order to remain + // consistent with the rest of the output of this function (note, if perf turns out + // to be a problem -- unlikely -- we can return the following dictionary outright) + NSDictionary *original = @{ FBSDKNonJSONResponseProperty : utf8 }; + NSString *jsonrep = [FBSDKInternalUtility JSONStringForObject:original error:NULL invalidObjectHandler:NULL]; + NSError *reparseError = nil; + parsed = [FBSDKInternalUtility objectForJSONString:jsonrep error:&reparseError]; + if (!reparseError) { + *error = nil; + } + } + } + return parsed; +} + +- (void)completeWithResults:(NSArray *)results + networkError:(NSError *)networkError +{ + NSUInteger count = [self.requests count]; + _expectingResults = count; + NSUInteger disabledRecoveryCount = 0; + for (FBSDKGraphRequestMetadata *metadata in self.requests) { + if ([metadata.request isGraphErrorRecoveryDisabled]) { + disabledRecoveryCount++; + } + } + BOOL isSingleRequestToRecover = (count - disabledRecoveryCount == 1); + + [self.requests enumerateObjectsUsingBlock:^(FBSDKGraphRequestMetadata *metadata, NSUInteger i, BOOL *stop) { + id result = networkError ? nil : [results objectAtIndex:i]; + NSError *resultError = networkError ?: [self errorFromResult:result request:metadata.request]; + + id body = nil; + if (!resultError && [result isKindOfClass:[NSDictionary class]]) { + NSDictionary *resultDictionary = [FBSDKTypeUtility dictionaryValue:result]; + body = [FBSDKTypeUtility dictionaryValue:resultDictionary[@"body"]]; + } + + if (resultError && ![metadata.request isGraphErrorRecoveryDisabled] && isSingleRequestToRecover) { + _recoveringRequestMetadata = metadata; + _errorRecoveryProcessor = [[FBSDKGraphErrorRecoveryProcessor alloc] init]; + if ([_errorRecoveryProcessor processError:resultError request:metadata.request delegate:self]) { + return; + } + } + + [self processResultBody:body error:resultError metadata:metadata canNotifyDelegate:(networkError ? NO : YES)]; + }]; + + if (networkError) { + if ([_delegate respondsToSelector:@selector(requestConnection:didFailWithError:)]) { + [_delegate requestConnection:self didFailWithError:networkError]; + } + } +} + +- (void)processResultBody:(NSDictionary *)body error:(NSError *)error metadata:(FBSDKGraphRequestMetadata *)metadata canNotifyDelegate:(BOOL)canNotifyDelegate +{ + void (^clearToken)(void) = ^{ + if (!(metadata.request.flags & FBSDKGraphRequestFlagDoNotInvalidateTokenOnError)) { + [FBSDKAccessToken setCurrentAccessToken:nil]; + } + }; + void (^finishAndInvokeCompletionHandler)(void) = ^{ + NSDictionary *graphDebugDict = [body objectForKey:@"__debug__"]; + if ([graphDebugDict isKindOfClass:[NSDictionary class]]) { + [self processResultDebugDictionary: graphDebugDict]; + } + [metadata invokeCompletionHandlerForConnection:self withResults:body error:error]; + + if (--_expectingResults == 0) { + if (canNotifyDelegate && [_delegate respondsToSelector:@selector(requestConnectionDidFinishLoading:)]) { + [_delegate requestConnectionDidFinishLoading:self]; + } + } + }; + + FBSDKSystemAccountStoreAdapter *adapter = [FBSDKSystemAccountStoreAdapter sharedInstance]; + NSString *metadataTokenString = metadata.request.tokenString; + NSString *currentTokenString = [FBSDKAccessToken currentAccessToken].tokenString; + NSString *accountStoreTokenString = adapter.accessTokenString; + BOOL isAccountStoreLogin = [metadataTokenString isEqualToString:accountStoreTokenString]; + + if ([metadataTokenString isEqualToString:currentTokenString] || isAccountStoreLogin) { + NSInteger errorCode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue]; + NSInteger errorSubcode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorSubcode] integerValue]; + if (errorCode == 190 || errorCode == 102) { + if (isAccountStoreLogin) { + if (errorSubcode == 460) { + // For iOS6, when the password is changed on the server, the system account store + // will continue to issue the old token until the user has changed the + // password AND _THEN_ a renew call is made. To prevent opening + // with an old token which would immediately be closed, we tell our adapter + // that we want to force a blocking renew until success. + adapter.forceBlockingRenew = YES; + } else { + [adapter renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *renewError) { + NSOperationQueue *queue = _delegateQueue ?: [NSOperationQueue mainQueue]; + [queue addOperationWithBlock:^{ + clearToken(); + finishAndInvokeCompletionHandler(); + }]; + }]; + return; + } + } + clearToken(); + } else if (errorCode >= 200 && errorCode < 300) { + // permission error + [adapter renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *renewError) { + NSOperationQueue *queue = _delegateQueue ?: [NSOperationQueue mainQueue]; + [queue addOperationWithBlock:finishAndInvokeCompletionHandler]; + }]; + return; + } + } + // this is already on the queue since we are currently in the NSURLConnection callback. + finishAndInvokeCompletionHandler(); +} + +- (void)processResultDebugDictionary:(NSDictionary *)dict +{ + NSArray *messages = [FBSDKTypeUtility arrayValue:dict[@"messages"]]; + if (![messages count]) { + return; + } + + [messages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + NSDictionary *messageDict = [FBSDKTypeUtility dictionaryValue:obj]; + NSString *message = [FBSDKTypeUtility stringValue:messageDict[@"message"]]; + NSString *type = [FBSDKTypeUtility stringValue:messageDict[@"type"]]; + NSString *link = [FBSDKTypeUtility stringValue:messageDict[@"link"]]; + if (!message || !type) { + return; + } + + NSString *loggingBehavior = FBSDKLoggingBehaviorGraphAPIDebugInfo; + if ([type isEqualToString:@"warning"]) { + loggingBehavior = FBSDKLoggingBehaviorGraphAPIDebugWarning; + } + if (link) { + message = [message stringByAppendingFormat:@" Link: %@", link]; + } + + [FBSDKLogger singleShotLogEntry:loggingBehavior logEntry:message]; + }]; + +} + +- (NSError *)errorFromResult:(id)result request:(FBSDKGraphRequest *)request +{ + if ([result isKindOfClass:[NSDictionary class]]) { + NSDictionary *errorDictionary = [FBSDKTypeUtility dictionaryValue:result[@"body"]][@"error"]; + + if (errorDictionary) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"code"] forKey:FBSDKGraphRequestErrorGraphErrorCode]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_subcode"] forKey:FBSDKGraphRequestErrorGraphErrorSubcode]; + //"message" is preferred over error_msg or error_reason. + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_msg"] forKey:FBSDKErrorDeveloperMessageKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_reason"] forKey:FBSDKErrorDeveloperMessageKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"message"] forKey:FBSDKErrorDeveloperMessageKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_user_title"] forKey:FBSDKErrorLocalizedTitleKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_user_msg"] forKey:FBSDKErrorLocalizedDescriptionKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_user_msg"] forKey:NSLocalizedDescriptionKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:result[@"code"] forKey:FBSDKGraphRequestErrorHTTPStatusCodeKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:result forKey:FBSDKGraphRequestErrorParsedJSONResponseKey]; + + FBSDKErrorRecoveryConfiguration *recoveryConfiguration = [g_errorConfiguration + recoveryConfigurationForCode:[userInfo[FBSDKGraphRequestErrorGraphErrorCode] stringValue] + subcode:[userInfo[FBSDKGraphRequestErrorGraphErrorSubcode] stringValue] + request:request]; + if ([errorDictionary[@"is_transient"] boolValue]) { + userInfo[FBSDKGraphRequestErrorCategoryKey] = @(FBSDKGraphRequestErrorCategoryTransient); + } else { + [FBSDKInternalUtility dictionary:userInfo setObject:@(recoveryConfiguration.errorCategory) forKey:FBSDKGraphRequestErrorCategoryKey]; + } + [FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryDescription forKey:NSLocalizedRecoverySuggestionErrorKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryOptionDescriptions forKey:NSLocalizedRecoveryOptionsErrorKey]; + FBSDKErrorRecoveryAttempter *attempter = [FBSDKErrorRecoveryAttempter recoveryAttempterFromConfiguration:recoveryConfiguration]; + [FBSDKInternalUtility dictionary:userInfo setObject:attempter forKey:NSRecoveryAttempterErrorKey]; + + return [FBSDKError errorWithCode:FBSDKGraphRequestGraphAPIErrorCode + userInfo:userInfo + message:nil + underlyingError:nil]; + } + } + + return nil; +} + +- (NSError *)errorWithCode:(FBSDKErrorCode)code + statusCode:(NSInteger)statusCode + parsedJSONResponse:(id)response + innerError:(NSError *)innerError + message:(NSString *)message { + NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; + userInfo[FBSDKGraphRequestErrorHTTPStatusCodeKey] = @(statusCode); + + if (response) { + userInfo[FBSDKGraphRequestErrorParsedJSONResponseKey] = response; + } + + if (innerError) { + userInfo[FBSDKGraphRequestErrorParsedJSONResponseKey] = innerError; + } + + if (message) { + userInfo[FBSDKErrorDeveloperMessageKey] = message; + } + + NSError *error = [[NSError alloc] + initWithDomain:FBSDKErrorDomain + code:code + userInfo:userInfo]; + + return error; +} + +#pragma mark - Private methods (miscellaneous) + +- (void)logRequest:(NSMutableURLRequest *)request + bodyLength:(NSUInteger)bodyLength + bodyLogger:(FBSDKLogger *)bodyLogger + attachmentLogger:(FBSDKLogger *)attachmentLogger +{ + if (_logger.isActive) { + [_logger appendFormat:@"Request <#%lu>:\n", (unsigned long)_logger.loggerSerialNumber]; + [_logger appendKey:@"URL" value:[[request URL] absoluteString]]; + [_logger appendKey:@"Method" value:[request HTTPMethod]]; + [_logger appendKey:@"UserAgent" value:[request valueForHTTPHeaderField:@"User-Agent"]]; + [_logger appendKey:@"MIME" value:[request valueForHTTPHeaderField:@"Content-Type"]]; + + if (bodyLength != 0) { + [_logger appendKey:@"Body Size" value:[NSString stringWithFormat:@"%lu kB", (unsigned long)bodyLength / 1024]]; + } + + if (bodyLogger != nil) { + [_logger appendKey:@"Body (w/o attachments)" value:bodyLogger.contents]; + } + + if (attachmentLogger != nil) { + [_logger appendKey:@"Attachments" value:attachmentLogger.contents]; + } + + [_logger appendString:@"\n"]; + + [_logger emitToNSLog]; + } +} + +- (NSString *)accessTokenWithRequest:(FBSDKGraphRequest *)request +{ + NSString *token = request.tokenString ?: request.parameters[kAccessTokenKey]; + if (!token && !(request.flags & FBSDKGraphRequestFlagSkipClientToken) && [FBSDKSettings clientToken].length > 0) { + return [NSString stringWithFormat:@"%@|%@", [FBSDKSettings appID], [FBSDKSettings clientToken]]; + } + return token; +} + +- (void)registerTokenToOmitFromLog:(NSString *)token +{ + if (![[FBSDKSettings loggingBehavior] containsObject:FBSDKLoggingBehaviorAccessTokens]) { + [FBSDKLogger registerStringToReplace:token replaceWith:@"ACCESS_TOKEN_REMOVED"]; + } +} + ++ (NSString *)userAgent +{ + static NSString *agent = nil; + + if (!agent) { + agent = [NSString stringWithFormat:@"%@.%@", kUserAgentBase, FBSDK_VERSION_STRING]; + } + if ([FBSDKSettings userAgentSuffix]) { + return [NSString stringWithFormat:@"%@/%@", agent, [FBSDKSettings userAgentSuffix]]; + } + return agent; +} + +- (void)setConnection:(FBSDKURLConnection *)connection +{ + if (_connection != connection) { + _connection.delegate = nil; + _connection = connection; + } +} + +#pragma mark - FBSDKURLConnectionDelegate + +- (void)facebookURLConnection:(FBSDKURLConnection *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten + totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { + id delegate = [self delegate]; + + if ([delegate respondsToSelector:@selector(requestConnection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)]) { + [delegate requestConnection:self + didSendBodyData:bytesWritten + totalBytesWritten:totalBytesWritten + totalBytesExpectedToWrite:totalBytesExpectedToWrite]; + } +} + +#pragma mark - FBSDKGraphErrorRecoveryProcessorDelegate + +- (void)processorDidAttemptRecovery:(FBSDKGraphErrorRecoveryProcessor *)processor didRecover:(BOOL)didRecover error:(NSError *)error +{ + if (didRecover) { + FBSDKGraphRequest *originalRequest = _recoveringRequestMetadata.request; + FBSDKGraphRequest *retryRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:originalRequest.graphPath + parameters:originalRequest.parameters + tokenString:[FBSDKAccessToken currentAccessToken].tokenString + version:originalRequest.version + HTTPMethod:originalRequest.HTTPMethod]; + // prevent further attempts at recovery (i.e., additional retries). + [retryRequest setGraphErrorRecoveryDisabled:YES]; + FBSDKGraphRequestMetadata *retryMetadata = [[FBSDKGraphRequestMetadata alloc] initWithRequest:retryRequest completionHandler:_recoveringRequestMetadata.completionHandler batchParameters:_recoveringRequestMetadata.batchParameters]; + [retryRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *retriedError) { + [self processResultBody:result error:retriedError metadata:retryMetadata canNotifyDelegate:YES]; + _errorRecoveryProcessor = nil; + _recoveringRequestMetadata = nil; + }]; + } else { + [self processResultBody:nil error:error metadata:_recoveringRequestMetadata canNotifyDelegate:YES]; + _errorRecoveryProcessor = nil; + _recoveringRequestMetadata = nil; + } +} + +#pragma mark - Debugging helpers + +- (NSString *)description +{ + NSMutableString *result = [NSMutableString stringWithFormat:@"<%@: %p, %lu request(s): (\n", + NSStringFromClass([self class]), + self, + (unsigned long)self.requests.count]; + BOOL comma = NO; + for (FBSDKGraphRequestMetadata *metadata in self.requests) { + FBSDKGraphRequest *request = metadata.request; + if (comma) { + [result appendString:@",\n"]; + } + [result appendString:[request description]]; + comma = YES; + } + [result appendString:@"\n)>"]; + return result; + +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h new file mode 100644 index 0000000..c179e29 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h @@ -0,0 +1,52 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @abstract A container class for data attachments so that additional metadata can be provided about the attachment. + */ +@interface FBSDKGraphRequestDataAttachment : NSObject + +/*! + @abstract Initializes the receiver with the attachment data and metadata. + @param data The attachment data (retained, not copied) + @param filename The filename for the attachment + @param contentType The content type for the attachment + */ +- (instancetype)initWithData:(NSData *)data + filename:(NSString *)filename + contentType:(NSString *)contentType +NS_DESIGNATED_INITIALIZER; + +/*! + @abstract The content type for the attachment. + */ +@property (nonatomic, copy, readonly) NSString *contentType; + +/*! + @abstract The attachment data. + */ +@property (nonatomic, strong, readonly) NSData *data; + +/*! + @abstract The filename for the attachment. + */ +@property (nonatomic, copy, readonly) NSString *filename; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m new file mode 100644 index 0000000..d5ec04d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m @@ -0,0 +1,41 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGraphRequestDataAttachment.h" + +#import "FBSDKMacros.h" + +@implementation FBSDKGraphRequestDataAttachment + +- (instancetype)initWithData:(NSData *)data filename:(NSString *)filename contentType:(NSString *)contentType +{ + if ((self = [super init])) { + _data = data; + _filename = [filename copy]; + _contentType = [contentType copy]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithData:filename:contentType:); + return [self initWithData:nil filename:nil contentType:nil]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h new file mode 100644 index 0000000..fd2e2ff --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h @@ -0,0 +1,39 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#ifdef __cplusplus +#define FBSDK_EXTERN extern "C" __attribute__((visibility ("default"))) +#else +#define FBSDK_EXTERN extern __attribute__((visibility ("default"))) +#endif + +#define FBSDK_STATIC_INLINE static inline + +#define FBSDK_NO_DESIGNATED_INITIALIZER() \ +@throw [NSException exceptionWithName:NSInvalidArgumentException \ + reason:[NSString stringWithFormat:@"unrecognized selector sent to instance %p", self] \ + userInfo:nil] + +#define FBSDK_NOT_DESIGNATED_INITIALIZER(DESIGNATED_INITIALIZER) \ +@throw [NSException exceptionWithName:NSInvalidArgumentException \ + reason:[NSString stringWithFormat:@"Please use the designated initializer [%p %@]", \ + self, \ + NSStringFromSelector(@selector(DESIGNATED_INITIALIZER))] \ + userInfo:nil] diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h new file mode 100644 index 0000000..621fac9 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract Extension protocol for NSMutableCopying that adds the mutableCopy method, which is implemented on NSObject. + @discussion NSObject implicitly conforms to this protocol. + */ +@protocol FBSDKMutableCopying + +/*! + @abstract Implemented by NSObject as a convenience to mutableCopyWithZone:. + @return A mutable copy of the receiver. + */ +- (id)mutableCopy; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h new file mode 100644 index 0000000..11da3d9 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h @@ -0,0 +1,148 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKMacros.h" +#import "FBSDKProfilePictureView.h" + +/*! + @abstract Notification indicating that the `currentProfile` has changed. + @discussion the userInfo dictionary of the notification will contain keys + `FBSDKProfileChangeOldKey` and + `FBSDKProfileChangeNewKey`. + */ +FBSDK_EXTERN NSString *const FBSDKProfileDidChangeNotification; + +/* @abstract key in notification's userInfo object for getting the old profile. + @discussion If there was no old profile, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKProfileChangeOldKey; + +/* @abstract key in notification's userInfo object for getting the new profile. + @discussion If there is no new profile, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey; + +/*! + @abstract Represents an immutable Facebook profile + @discussion This class provides a global "currentProfile" instance to more easily + add social context to your application. When the profile changes, a notification is + posted so that you can update relevant parts of your UI and is persisted to NSUserDefaults. + + Typically, you will want to call `enableUpdatesOnAccessTokenChange:YES` so that + it automatically observes changes to the `[FBSDKAccessToken currentAccessToken]`. + + You can use this class to build your own `FBSDKProfilePictureView` or in place of typical requests to "/me". + */ +@interface FBSDKProfile : NSObject + +/*! + @abstract initializes a new instance. + @param userID the user ID + @param firstName the user's first name + @param middleName the user's middle name + @param lastName the user's last name + @param name the user's complete name + @param linkURL the link for this profile + @param refreshDate the optional date this profile was fetched. Defaults to [NSDate date]. + */ +- (instancetype)initWithUserID:(NSString *)userID + firstName:(NSString *)firstName + middleName:(NSString *)middleName + lastName:(NSString *)lastName + name:(NSString *)name + linkURL:(NSURL *)linkURL + refreshDate:(NSDate *)refreshDate NS_DESIGNATED_INITIALIZER; +/*! + @abstract The user id + */ +@property (nonatomic, readonly) NSString *userID; +/*! + @abstract The user's first name + */ +@property (nonatomic, readonly) NSString *firstName; +/*! + @abstract The user's middle name + */ +@property (nonatomic, readonly) NSString *middleName; +/*! + @abstract The user's last name + */ +@property (nonatomic, readonly) NSString *lastName; +/*! + @abstract The user's complete name + */ +@property (nonatomic, readonly) NSString *name; +/*! + @abstract A URL to the user's profile. + @discussion Consider using Bolts and `FBSDKAppLinkResolver` to resolve this + to an app link to link directly to the user's profile in the Facebook app. + */ +@property (nonatomic, readonly) NSURL *linkURL; + +/*! + @abstract The last time the profile data was fetched. + */ +@property (nonatomic, readonly) NSDate *refreshDate; + +/*! + @abstract Gets the current FBSDKProfile instance. + */ ++ (FBSDKProfile *)currentProfile; + +/*! + @abstract Sets the current instance and posts the appropriate notification if the profile parameter is different + than the receiver. + @param profile the profile to set + @discussion This persists the profile to NSUserDefaults. + */ ++ (void)setCurrentProfile:(FBSDKProfile *)profile; + +/*! + @abstract Indicates if `currentProfile` will automatically observe `FBSDKAccessTokenDidChangeNotification` notifications + @param enable YES is observing + @discussion If observing, this class will issue a graph request for public profile data when the current token's userID + differs from the current profile. You can observe `FBSDKProfileDidChangeNotification` for when the profile is updated. + + Note that if `[FBSDKAccessToken currentAccessToken]` is unset, the `currentProfile` instance remains. It's also possible + for `currentProfile` to return nil until the data is fetched. + */ ++ (void)enableUpdatesOnAccessTokenChange:(BOOL)enable; + +/*! + @abstract A convenience method for returning a complete `NSURL` for retrieving the user's profile image. + @param mode The picture mode + @param size The height and width. This will be rounded to integer precision. + */ +- (NSURL *)imageURLForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size; + +/*! + @abstract A convenience method for returning a Graph API path for retrieving the user's profile image. + @deprecated use `imageURLForPictureMode:size:` instead + @discussion You can pass this to a `FBSDKGraphRequest` instance to download the image. + @param mode The picture mode + @param size The height and width. This will be rounded to integer precision. + */ +- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size +__attribute__ ((deprecated("use imageURLForPictureMode:size: instead"))); + +/*! + @abstract Returns YES if the profile is equivalent to the receiver. + @param profile the profile to compare to. + */ +- (BOOL)isEqualToProfile:(FBSDKProfile *)profile; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m new file mode 100644 index 0000000..b57b253 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m @@ -0,0 +1,268 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKProfile+Internal.h" + +#import "FBSDKCoreKit+Internal.h" + +NSString *const FBSDKProfileDidChangeNotification = @"com.facebook.sdk.FBSDKProfile.FBSDKProfileDidChangeNotification";; +NSString *const FBSDKProfileChangeOldKey = @"FBSDKProfileOld"; +NSString *const FBSDKProfileChangeNewKey = @"FBSDKProfileNew"; +static NSString *const FBSDKProfileUserDefaultsKey = @"com.facebook.sdk.FBSDKProfile.currentProfile"; +static FBSDKProfile *g_currentProfile; + +#define FBSDKPROFILE_USERID_KEY @"userID" +#define FBSDKPROFILE_FIRSTNAME_KEY @"firstName" +#define FBSDKPROFILE_MIDDLENAME_KEY @"middleName" +#define FBSDKPROFILE_LASTNAME_KEY @"lastName" +#define FBSDKPROFILE_NAME_KEY @"name" +#define FBSDKPROFILE_LINKURL_KEY @"linkURL" +#define FBSDKPROFILE_REFRESHDATE_KEY @"refreshDate" + +// Once a day +#define FBSDKPROFILE_STALE_IN_SECONDS (60 * 60 * 24) + +@implementation FBSDKProfile + +- (instancetype)init NS_UNAVAILABLE +{ + assert(0); +} + +- (instancetype)initWithUserID:(NSString *)userID + firstName:(NSString *)firstName + middleName:(NSString *)middleName + lastName:(NSString *)lastName + name:(NSString *)name + linkURL:(NSURL *)linkURL + refreshDate:(NSDate *)refreshDate +{ + if ((self = [super init])) { + _userID = [userID copy]; + _firstName = [firstName copy]; + _middleName = [middleName copy]; + _lastName = [lastName copy]; + _name = [name copy]; + _linkURL = [linkURL copy]; + _refreshDate = [refreshDate copy] ?: [NSDate date]; + } + return self; +} + ++ (FBSDKProfile *)currentProfile +{ + return g_currentProfile; +} + ++ (void)setCurrentProfile:(FBSDKProfile *)profile +{ + if (profile != g_currentProfile && ![profile isEqualToProfile:g_currentProfile]) { + [[self class] cacheProfile:profile]; + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + + [FBSDKInternalUtility dictionary:userInfo setObject:profile forKey:FBSDKProfileChangeNewKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:g_currentProfile forKey:FBSDKProfileChangeOldKey]; + g_currentProfile = profile; + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKProfileDidChangeNotification + object:[self class] + userInfo:userInfo]; + } +} + +- (NSURL *)imageURLForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSString *path = [self imagePathForPictureMode:FBSDKProfilePictureModeNormal size:size]; +#pragma clang diagnostic pop + return [FBSDKInternalUtility facebookURLWithHostPrefix:@"graph" + path:path + queryParameters:nil + error:NULL]; +} + +- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size +{ + NSString *type; + switch (mode) { + case FBSDKProfilePictureModeNormal: type = @"normal"; break; + case FBSDKProfilePictureModeSquare: type = @"square"; break; + } + return [NSString stringWithFormat:@"%@/picture?type=%@&width=%d&height=%d", + _userID, + type, + (int) roundf(size.width), + (int) roundf(size.height)]; +} + ++ (void)enableUpdatesOnAccessTokenChange:(BOOL)enable +{ + if (enable) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(observeChangeAccessTokenChange:) + name:FBSDKAccessTokenDidChangeNotification + object:nil]; + } else { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + } +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + //immutable + return self; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [self.userID hash], + [self.firstName hash], + [self.middleName hash], + [self.lastName hash], + [self.name hash], + [self.linkURL hash], + [self.refreshDate hash] + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKProfile class]]){ + return NO; + } + return [self isEqualToProfile:object]; +} + +- (BOOL)isEqualToProfile:(FBSDKProfile *)profile +{ + return ([_userID isEqualToString:profile.userID] && + [_firstName isEqualToString:profile.firstName] && + [_middleName isEqualToString:profile.middleName] && + [_lastName isEqualToString:profile.lastName] && + [_name isEqualToString:profile.name] && + [_linkURL isEqual:profile.linkURL] && + [_refreshDate isEqualToDate:profile.refreshDate]); +} +#pragma mark NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *userID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_USERID_KEY]; + NSString *firstName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_FIRSTNAME_KEY]; + NSString *middleName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_MIDDLENAME_KEY]; + NSString *lastName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_LASTNAME_KEY]; + NSString *name = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_NAME_KEY]; + NSURL *linkURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDKPROFILE_LINKURL_KEY]; + NSDate *refreshDate = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDKPROFILE_REFRESHDATE_KEY]; + return [self initWithUserID:userID + firstName:firstName + middleName:middleName + lastName:lastName + name:name + linkURL:linkURL + refreshDate:refreshDate]; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:self.userID forKey:FBSDKPROFILE_USERID_KEY]; + [encoder encodeObject:self.firstName forKey:FBSDKPROFILE_FIRSTNAME_KEY]; + [encoder encodeObject:self.middleName forKey:FBSDKPROFILE_MIDDLENAME_KEY]; + [encoder encodeObject:self.lastName forKey:FBSDKPROFILE_LASTNAME_KEY]; + [encoder encodeObject:self.name forKey:FBSDKPROFILE_NAME_KEY]; + [encoder encodeObject:self.linkURL forKey:FBSDKPROFILE_LINKURL_KEY]; + [encoder encodeObject:self.refreshDate forKey:FBSDKPROFILE_REFRESHDATE_KEY]; +} + +#pragma mark - Private + ++ (void)observeChangeAccessTokenChange:(NSNotification *)notification +{ + FBSDKAccessToken *token = notification.userInfo[FBSDKAccessTokenChangeNewKey]; + static FBSDKGraphRequestConnection *executingRequestConnection = nil; + + BOOL isStale = [[NSDate date] timeIntervalSinceDate:g_currentProfile.refreshDate] > FBSDKPROFILE_STALE_IN_SECONDS; + if (token && + (isStale || ![g_currentProfile.userID isEqualToString:token.userID])) { + FBSDKProfile *expectedCurrentProfile = g_currentProfile; + + NSString *graphPath = @"me?fields=id,first_name,middle_name,last_name,name,link"; + [executingRequestConnection cancel]; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:nil + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + executingRequestConnection = [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (expectedCurrentProfile != g_currentProfile) { + // current profile has already changed since request was started. Let's not overwrite. + return; + } + FBSDKProfile *profile = nil; + if (!error) { + profile = [[FBSDKProfile alloc] initWithUserID:result[@"id"] + firstName:result[@"first_name"] + middleName:result[@"middle_name"] + lastName:result[@"last_name"] + name:result[@"name"] + linkURL:[NSURL URLWithString:result[@"link"]] + refreshDate:[NSDate date]]; + } + [[self class] setCurrentProfile:profile]; + }]; + } +} + +@end + +@implementation FBSDKProfile(Internal) + ++ (void)cacheProfile:(FBSDKProfile *) profile +{ + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + if (profile) { + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:profile]; + [userDefaults setObject:data forKey:FBSDKProfileUserDefaultsKey]; + } else { + [userDefaults removeObjectForKey:FBSDKProfileUserDefaultsKey]; + } + [userDefaults synchronize]; +} + ++ (FBSDKProfile *)fetchCachedProfile +{ + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + NSData *data = [userDefaults objectForKey:FBSDKProfileUserDefaultsKey]; + return (data != nil) + ? [NSKeyedUnarchiver unarchiveObjectWithData:data] + : nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h new file mode 100644 index 0000000..f1f64cb --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h @@ -0,0 +1,59 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @typedef FBSDKProfilePictureMode enum + @abstract Defines the aspect ratio mode for the source image of the profile picture. + */ +typedef NS_ENUM(NSUInteger, FBSDKProfilePictureMode) +{ + /*! + @abstract A square cropped version of the image will be included in the view. + */ + FBSDKProfilePictureModeSquare, + /*! + @abstract The original picture's aspect ratio will be used for the source image in the view. + */ + FBSDKProfilePictureModeNormal, +}; + +/*! + @abstract A view to display a profile picture. + */ +@interface FBSDKProfilePictureView : UIView + +/*! + @abstract The mode for the receiver to determine the aspect ratio of the source image. + */ +@property (nonatomic, assign) FBSDKProfilePictureMode pictureMode; + +/*! + @abstract The profile ID to show the picture for. + */ +@property (nonatomic, copy) NSString *profileID; + +/*! + @abstract Explicitly marks the receiver as needing to update the image. + @discussion This method is called whenever any properties that affect the source image are modified, but this can also + be used to trigger a manual update of the image if it needs to be re-downloaded. + */ +- (void)setNeedsImageUpdate; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m new file mode 100644 index 0000000..f107de3 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m @@ -0,0 +1,368 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKProfilePictureView.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKMaleSilhouetteIcon.h" +#import "FBSDKMath.h" +#import "FBSDKURLConnection.h" +#import "FBSDKUtility.h" + +@interface FBSDKProfilePictureViewState : NSObject + +- (instancetype)initWithProfileID:(NSString *)profileID + size:(CGSize)size + scale:(CGFloat)scale + pictureMode:(FBSDKProfilePictureMode)pictureMode + imageShouldFit:(BOOL)imageShouldFit; + +@property (nonatomic, assign, readonly) BOOL imageShouldFit; +@property (nonatomic, assign, readonly) FBSDKProfilePictureMode pictureMode; +@property (nonatomic, copy, readonly) NSString *profileID; +@property (nonatomic, assign, readonly) CGFloat scale; +@property (nonatomic, assign, readonly) CGSize size; + +- (BOOL)isEqualToState:(FBSDKProfilePictureViewState *)other; +- (BOOL)isValidForState:(FBSDKProfilePictureViewState *)other; + +@end + +@implementation FBSDKProfilePictureViewState + +- (instancetype)initWithProfileID:(NSString *)profileID + size:(CGSize)size + scale:(CGFloat)scale + pictureMode:(FBSDKProfilePictureMode)pictureMode + imageShouldFit:(BOOL)imageShouldFit +{ + if ((self = [super init])) { + _profileID = [profileID copy]; + _size = size; + _scale = scale; + _pictureMode = pictureMode; + _imageShouldFit = imageShouldFit; + } + return self; +} + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + (NSUInteger)_imageShouldFit, + (NSUInteger)_size.width, + (NSUInteger)_size.height, + (NSUInteger)_scale, + (NSUInteger)_pictureMode, + [_profileID hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (![object isKindOfClass:[FBSDKProfilePictureViewState class]]) { + return NO; + } + FBSDKProfilePictureViewState *other = (FBSDKProfilePictureViewState *)object; + return [self isEqualToState:other]; +} + +- (BOOL)isEqualToState:(FBSDKProfilePictureViewState *)other +{ + return ([self isValidForState:other] && + CGSizeEqualToSize(_size, other->_size) && + (_scale == other->_scale)); +} + +- (BOOL)isValidForState:(FBSDKProfilePictureViewState *)other +{ + return (other != nil && + (_imageShouldFit == other->_imageShouldFit) && + (_pictureMode == other->_pictureMode) && + [FBSDKInternalUtility object:_profileID isEqualToObject:other->_profileID]); +} + +@end + +@implementation FBSDKProfilePictureView +{ + BOOL _hasProfileImage; + UIImageView *_imageView; + FBSDKProfilePictureViewState *_lastState; + BOOL _needsImageUpdate; + BOOL _placeholderImageIsValid; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + [self _configureProfilePictureView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [super initWithCoder:decoder])) { + [self _configureProfilePictureView]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Properties + +- (void)setBounds:(CGRect)bounds +{ + CGRect currentBounds = self.bounds; + if (!CGRectEqualToRect(currentBounds, bounds)) { + [super setBounds:bounds]; + if (!CGSizeEqualToSize(currentBounds.size, bounds.size)) { + _placeholderImageIsValid = NO; + [self setNeedsImageUpdate]; + } + } +} + +- (UIViewContentMode)contentMode +{ + return _imageView.contentMode; +} + +- (void)setContentMode:(UIViewContentMode)contentMode +{ + if (_imageView.contentMode != contentMode) { + _imageView.contentMode = contentMode; + [super setContentMode:contentMode]; + [self setNeedsImageUpdate]; + } +} + +- (void)setMode:(FBSDKProfilePictureMode)pictureMode +{ + if (_pictureMode != pictureMode) { + _pictureMode = pictureMode; + [self setNeedsImageUpdate]; + } +} + +- (void)setProfileID:(NSString *)profileID +{ + if (![FBSDKInternalUtility object:_profileID isEqualToObject:profileID]) { + _profileID = [profileID copy]; + _placeholderImageIsValid = NO; + [self setNeedsImageUpdate]; + } +} + +#pragma mark - Public Methods + +- (void)setNeedsImageUpdate +{ + if (!_imageView || CGRectIsEmpty(self.bounds)) { + // we can't do anything with an empty view, so just bail out until we have a size + return; + } + + // ensure that we have an image. do this here so we can draw the placeholder image synchronously if we don't have one + if (!_placeholderImageIsValid && !_hasProfileImage) { + [self _setPlaceholderImage]; + } + + // debounce calls to needsImage against the main runloop + if (_needsImageUpdate) { + return; + } + _needsImageUpdate = YES; + __weak FBSDKProfilePictureView *weakSelf = self; + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf _needsImageUpdate]; + }); +} + +#pragma mark - Helper Methods + ++ (void)_downloadImageWithState:(FBSDKProfilePictureViewState *)state + completionBlock:(void(^)(NSData *data))completionBlock; +{ + NSURL *imageURL = [self _imageURLWithState:state]; + if (!imageURL) { + return; + } + FBSDKURLConnectionHandler completionHandler = ^(FBSDKURLConnection *connection, + NSError *error, + NSURLResponse *response, + NSData *responseData) { + if (!error && [responseData length]) { + completionBlock(responseData); + } + }; + NSURLRequest *request = [[NSURLRequest alloc] initWithURL:imageURL]; + [[[FBSDKURLConnection alloc] initWithRequest:request completionHandler:completionHandler] start]; +} + ++ (NSURL *)_imageURLWithState:(FBSDKProfilePictureViewState *)state +{ + FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; + if ([state.profileID isEqualToString:@"me"] && !accessToken) { + return nil; + } + NSString *path = [[NSString alloc] initWithFormat:@"/%@/picture", [FBSDKUtility URLEncode:state.profileID]]; + CGSize size = state.size; + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + parameters[@"width"] = @(size.width); + parameters[@"height"] = @(size.height); + [FBSDKInternalUtility dictionary:parameters setObject:accessToken.tokenString forKey:@"access_token"]; + return [FBSDKInternalUtility facebookURLWithHostPrefix:@"graph" path:path queryParameters:parameters error:NULL]; +} + +- (void)_accessTokenDidChangeNotification:(NSNotification *)notification +{ + if (![_profileID isEqualToString:@"me"] || !notification.userInfo[FBSDKAccessTokenDidChangeUserID]) { + return; + } + _lastState = nil; + [self setNeedsImageUpdate]; +} + +- (void)_configureProfilePictureView +{ + _imageView = [[UIImageView alloc] initWithFrame:self.bounds]; + _imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); + [self addSubview:_imageView]; + + _profileID = @"me"; + self.backgroundColor = [UIColor whiteColor]; + self.contentMode = UIViewContentModeScaleAspectFit; + self.userInteractionEnabled = NO; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(_accessTokenDidChangeNotification:) + name:FBSDKAccessTokenDidChangeNotification + object:nil]; + + [self setNeedsImageUpdate]; +} + +- (BOOL)_imageShouldFit +{ + switch (self.contentMode) { + case UIViewContentModeBottom: + case UIViewContentModeBottomLeft: + case UIViewContentModeBottomRight: + case UIViewContentModeCenter: + case UIViewContentModeLeft: + case UIViewContentModeRedraw: + case UIViewContentModeRight: + case UIViewContentModeScaleAspectFit: + case UIViewContentModeTop: + case UIViewContentModeTopLeft: + case UIViewContentModeTopRight: + return YES; + case UIViewContentModeScaleAspectFill: + case UIViewContentModeScaleToFill: + return NO; + } +} + +- (CGSize)_imageSize:(BOOL)imageShouldFit scale:(CGFloat)scale +{ + // get the image size based on the contentMode and pictureMode + CGSize size = self.bounds.size; + switch (_pictureMode) { + case FBSDKProfilePictureModeSquare:{ + CGFloat imageSize; + if (imageShouldFit) { + imageSize = MIN(size.width, size.height); + } else { + imageSize = MAX(size.width, size.height); + } + size = CGSizeMake(imageSize, imageSize); + break; + } + case FBSDKProfilePictureModeNormal: + // use the bounds size + break; + } + + // adjust for the screen scale + size = CGSizeMake(size.width * scale, size.height * scale); + + return size; +} + +- (void)_needsImageUpdate +{ + _needsImageUpdate = NO; + + if (!_profileID) { + if (!_placeholderImageIsValid) { + [self _setPlaceholderImage]; + } + return; + } + + // if the current image is no longer representative of the current state, clear the current value out; otherwise, + // leave the current value until the new resolution image is downloaded + BOOL imageShouldFit = [self _imageShouldFit]; + UIScreen *screen = self.window.screen ?: [UIScreen mainScreen]; + CGFloat scale = [screen scale]; + CGSize imageSize = [self _imageSize:imageShouldFit scale:scale]; + FBSDKProfilePictureViewState *state = [[FBSDKProfilePictureViewState alloc] initWithProfileID:_profileID + size:imageSize + scale:scale + pictureMode:_pictureMode + imageShouldFit:imageShouldFit]; + if (![_lastState isValidForState:state]) { + [self _setPlaceholderImage]; + } + _lastState = state; + + __weak FBSDKProfilePictureView *weakSelf = self; + [[self class] _downloadImageWithState:state completionBlock:^(NSData *data) { + [weakSelf _updateImageWithData:data state:state]; + }]; +} + +- (void)_setPlaceholderImage +{ + UIColor *fillColor = [UIColor colorWithRed:157.0/255.0 green:177.0/255.0 blue:204.0/255.0 alpha:1.0]; + _imageView.image = [[[FBSDKMaleSilhouetteIcon alloc] initWithColor:fillColor] imageWithSize:_imageView.bounds.size]; + _placeholderImageIsValid = YES; + _hasProfileImage = NO; +} + +- (void)_updateImageWithData:(NSData *)data state:(FBSDKProfilePictureViewState *)state +{ + // make sure we haven't updated the state since we began fetching the image + if (![state isValidForState:_lastState]) { + return; + } + UIImage *image = [[UIImage alloc] initWithData:data scale:state.scale]; + _imageView.image = image; + _hasProfileImage = YES; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h new file mode 100644 index 0000000..edc0040 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h @@ -0,0 +1,209 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/* + * Constants defining logging behavior. Use with <[FBSDKSettings setLoggingBehavior]>. + */ + +/*! Include access token in logging. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAccessTokens; + +/*! Log performance characteristics */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics; + +/*! Log FBSDKAppEvents interactions */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAppEvents; + +/*! Log Informational occurrences */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorInformational; + +/*! Log cache errors. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorCacheErrors; + +/*! Log errors from SDK UI controls */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorUIControlErrors; + +/*! Log debug warnings from API response, i.e. when friends fields requested, but user_friends permission isn't granted. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning; + +/*! Log warnings from API response, i.e. when requested feature will be deprecated in next version of API. + Info is the lowest level of severity, using it will result in logging all previously mentioned levels. + */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo; + +/*! Log errors from SDK network requests */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorNetworkRequests; + +/*! Log errors likely to be preventable by the developer. This is in the default set of enabled logging behaviors. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorDeveloperErrors; + +@interface FBSDKSettings : NSObject + +/*! + @abstract Get the Facebook App ID used by the SDK. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookAppID). + */ ++ (NSString *)appID; + +/*! + @abstract Set the Facebook App ID to be used by the SDK. + @param appID The Facebook App ID to be used by the SDK. + */ ++ (void)setAppID:(NSString *)appID; + +/*! + @abstract Get the default url scheme suffix used for sessions. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookUrlSchemeSuffix). + */ ++ (NSString *)appURLSchemeSuffix; + +/*! + @abstract Set the app url scheme suffix used by the SDK. + @param appURLSchemeSuffix The url scheme suffix to be used by the SDK. + */ ++ (void)setAppURLSchemeSuffix:(NSString *)appURLSchemeSuffix; + +/*! + @abstract Retrieve the Client Token that has been set via [FBSDKSettings setClientToken]. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookClientToken). + */ ++ (NSString *)clientToken; + +/*! + @abstract Sets the Client Token for the Facebook App. + @discussion This is needed for certain API calls when made anonymously, without a user-based access token. + @param clientToken The Facebook App's "client token", which, for a given appid can be found in the Security + section of the Advanced tab of the Facebook App settings found at + */ ++ (void)setClientToken:(NSString *)clientToken; + +/*! + @abstract A convenient way to toggle error recovery for all FBSDKGraphRequest instances created after this is set. + @param disableGraphErrorRecovery YES or NO. + */ ++ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery; + +/*! + @abstract Get the Facebook Display Name used by the SDK. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookDisplayName). + */ ++ (NSString *)displayName; + +/*! + @abstract Set the default Facebook Display Name to be used by the SDK. + @discussion This should match the Display Name that has been set for the app with the corresponding Facebook App ID, + in the Facebook App Dashboard. + @param displayName The Facebook Display Name to be used by the SDK. + */ ++ (void)setDisplayName:(NSString *)displayName; + +/*! + @abstract Get the Facebook domain part. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookDomainPart). + */ ++ (NSString *)facebookDomainPart; + +/*! + @abstract Set the subpart of the Facebook domain. + @discussion This can be used to change the Facebook domain (e.g. @"beta") so that requests will be sent to + graph.beta.facebook.com + @param facebookDomainPart The domain part to be inserted into facebook.com. + */ ++ (void)setFacebookDomainPart:(NSString *)facebookDomainPart; + +/*! + @abstract The quality of JPEG images sent to Facebook from the SDK. + @discussion If not explicitly set, the default is 0.9. + @see [UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ ++ (CGFloat)JPEGCompressionQuality; + +/*! + @abstract Set the quality of JPEG images sent to Facebook from the SDK. + @param JPEGCompressionQuality The quality for JPEG images, expressed as a value from 0.0 to 1.0. + @see [UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ ++ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality; + +/*! + @abstract + Gets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. + */ ++ (BOOL)limitEventAndDataUsage; + +/*! + @abstract + Sets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. + + @param limitEventAndDataUsage The desired value. + */ ++ (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage; + +/*! + @abstract Retrieve the current iOS SDK version. + */ ++ (NSString *)sdkVersion; + +/*! + @abstract Retrieve the current Facebook SDK logging behavior. + */ ++ (NSSet *)loggingBehavior; + +/*! + @abstract Set the current Facebook SDK logging behavior. This should consist of strings defined as + constants with FBSDKLoggingBehavior*. + + @param loggingBehavior A set of strings indicating what information should be logged. If nil is provided, the logging + behavior is reset to the default set of enabled behaviors. Set to an empty set in order to disable all logging. + + @discussion You can also define this via an array in your app plist with key "FacebookLoggingBehavior" or add and remove individual values via enableLoggingBehavior: or disableLogginBehavior: + */ ++ (void)setLoggingBehavior:(NSSet *)loggingBehavior; + +/*! + @abstract Enable a particular Facebook SDK logging behavior. + + @param loggingBehavior The LoggingBehavior to enable. This should be a string defined as a constant with FBSDKLoggingBehavior*. + */ ++ (void)enableLoggingBehavior:(NSString *)loggingBehavior; + +/*! + @abstract Disable a particular Facebook SDK logging behavior. + + @param loggingBehavior The LoggingBehavior to disable. This should be a string defined as a constant with FBSDKLoggingBehavior*. + */ ++ (void)disableLoggingBehavior:(NSString *)loggingBehavior; + +/*! + @abstract Set the user defaults key used by legacy token caches. + + @param tokenInformationKeyName the key used by legacy token caches. + + @discussion Use this only if you customized FBSessionTokenCachingStrategy in v3.x of + the Facebook SDK for iOS. +*/ ++ (void)setLegacyUserDefaultTokenInformationKeyName:(NSString *)tokenInformationKeyName; + +/*! + @abstract Get the user defaults key used by legacy token caches. +*/ ++ (NSString *)legacyUserDefaultTokenInformationKeyName; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m new file mode 100644 index 0000000..8476827 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m @@ -0,0 +1,223 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKSettings+Internal.h" + +#import "FBSDKCoreKit.h" + +#define FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(TYPE, PLIST_KEY, GETTER, SETTER, DEFAULT_VALUE) \ +static TYPE *g_##PLIST_KEY = nil; \ ++ (TYPE *)GETTER \ +{ \ + if (!g_##PLIST_KEY) { \ + g_##PLIST_KEY = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@#PLIST_KEY] copy] ?: DEFAULT_VALUE; \ + } \ + return g_##PLIST_KEY; \ +} \ ++ (void)SETTER:(TYPE *)value { \ + g_##PLIST_KEY = [value copy]; \ +} + +NSString *const FBSDKLoggingBehaviorAccessTokens = @"include_access_tokens"; +NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics = @"perf_characteristics"; +NSString *const FBSDKLoggingBehaviorAppEvents = @"app_events"; +NSString *const FBSDKLoggingBehaviorInformational = @"informational"; +NSString *const FBSDKLoggingBehaviorCacheErrors = @"cache_errors"; +NSString *const FBSDKLoggingBehaviorUIControlErrors = @"ui_control_errors"; +NSString *const FBSDKLoggingBehaviorDeveloperErrors = @"developer_errors"; +NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning = @"graph_api_debug_warning"; +NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo = @"graph_api_debug_info"; +NSString *const FBSDKLoggingBehaviorNetworkRequests = @"network_requests"; + +static FBSDKAccessTokenCache *g_tokenCache; +static NSMutableSet *g_loggingBehavior; +static NSString *g_legacyUserDefaultTokenInformationKeyName = @"FBAccessTokenInformationKey"; +static NSString *const FBSDKSettingsLimitEventAndDataUsage = @"com.facebook.sdk:FBSDKSettingsLimitEventAndDataUsage"; +static BOOL g_disableErrorRecovery; +static NSString *g_userAgentSuffix; + +@implementation FBSDKSettings + ++ (void)initialize +{ + if (self == [FBSDKSettings class]) { + g_tokenCache = [[FBSDKAccessTokenCache alloc] init]; + } +} + +#pragma mark - Plist Configuration Settings + +FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookAppID, appID, setAppID, nil); +FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookUrlSchemeSuffix, appURLSchemeSuffix, setAppURLSchemeSuffix, nil); +FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookClientToken, clientToken, setClientToken, nil); +FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookDisplayName, displayName, setDisplayName, nil); +FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookDomainPart, facebookDomainPart, setFacebookDomainPart, nil); +FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookJpegCompressionQuality, _JPEGCompressionQualityNumber, _setJPEGCompressionQualityNumber, @(0.9)); + ++ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery { + g_disableErrorRecovery = disableGraphErrorRecovery; +} + ++ (BOOL)isGraphErrorRecoveryDisabled { + return g_disableErrorRecovery; +} + ++ (CGFloat)JPEGCompressionQuality +{ + return [[self _JPEGCompressionQualityNumber] floatValue]; +} + ++ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality +{ + [self _setJPEGCompressionQualityNumber:@(JPEGCompressionQuality)]; +} + ++ (BOOL)limitEventAndDataUsage +{ + NSNumber *storedValue = [[NSUserDefaults standardUserDefaults] objectForKey:FBSDKSettingsLimitEventAndDataUsage]; + if (storedValue == nil) { + return NO; + } + return storedValue.boolValue; +} + ++ (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:@(limitEventAndDataUsage) forKey:FBSDKSettingsLimitEventAndDataUsage]; + [defaults synchronize]; +} + ++ (NSSet *)loggingBehavior +{ + if (!g_loggingBehavior) { + NSArray *bundleLoggingBehaviors = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"FacebookLoggingBehavior"]; + if (bundleLoggingBehaviors) { + g_loggingBehavior = [[NSMutableSet alloc] initWithArray:bundleLoggingBehaviors]; + } else { + // Establish set of default enabled logging behaviors. You can completely disable logging by + // specifying an empty array for FacebookLoggingBehavior in your Info.plist. + g_loggingBehavior = [[NSMutableSet alloc] initWithObjects:FBSDKLoggingBehaviorDeveloperErrors, nil]; + } + } + return [g_loggingBehavior copy]; +} + ++ (void)setLoggingBehavior:(NSSet *)loggingBehavior +{ + if (![g_loggingBehavior isEqualToSet:loggingBehavior]) { + g_loggingBehavior = [loggingBehavior mutableCopy]; + + [self updateGraphAPIDebugBehavior]; + } +} + ++ (void)enableLoggingBehavior:(NSString *)loggingBehavior +{ + if (!g_loggingBehavior) { + [self loggingBehavior]; + } + [g_loggingBehavior addObject:loggingBehavior]; + [self updateGraphAPIDebugBehavior]; +} + ++ (void)disableLoggingBehavior:(NSString *)loggingBehavior +{ + if (!g_loggingBehavior) { + [self loggingBehavior]; + } + [g_loggingBehavior removeObject:loggingBehavior]; + [self updateGraphAPIDebugBehavior]; +} + ++ (void)setLegacyUserDefaultTokenInformationKeyName:(NSString *)tokenInformationKeyName +{ + if (![g_legacyUserDefaultTokenInformationKeyName isEqualToString:tokenInformationKeyName]) { + g_legacyUserDefaultTokenInformationKeyName = tokenInformationKeyName; + } +} + ++ (NSString *)legacyUserDefaultTokenInformationKeyName +{ + return g_legacyUserDefaultTokenInformationKeyName; +} + +#pragma mark - Readonly Configuration Settings + ++ (NSString *)sdkVersion +{ + return FBSDK_VERSION_STRING; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +#pragma mark - Internal + ++ (FBSDKAccessTokenCache *)accessTokenCache +{ + return g_tokenCache; +} + +- (void)setAccessTokenCache:(FBSDKAccessTokenCache *)cache +{ + if (g_tokenCache != cache) { + g_tokenCache = cache; + } +} + ++ (NSString *)userAgentSuffix +{ + return g_userAgentSuffix; +} + ++ (void)setUserAgentSuffix:(NSString *)suffix +{ + if (![g_userAgentSuffix isEqualToString:suffix]) { + g_userAgentSuffix = suffix; + } +} + +#pragma mark - Internal - Graph API Debug + ++ (void)updateGraphAPIDebugBehavior +{ + // Enable Warnings everytime Info is enabled + if ([g_loggingBehavior containsObject:FBSDKLoggingBehaviorGraphAPIDebugInfo] + && ![g_loggingBehavior containsObject:FBSDKLoggingBehaviorGraphAPIDebugWarning]) { + [g_loggingBehavior addObject:FBSDKLoggingBehaviorGraphAPIDebugWarning]; + } +} + ++ (NSString *)graphAPIDebugParamValue +{ + if ([[self loggingBehavior] containsObject:FBSDKLoggingBehaviorGraphAPIDebugInfo]) { + return @"info"; + } else if ([[self loggingBehavior] containsObject:FBSDKLoggingBehaviorGraphAPIDebugWarning]) { + return @"warning"; + } + + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h new file mode 100644 index 0000000..7d2e0ac --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h @@ -0,0 +1,102 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKAccessToken; + +/*! + @typedef + + @abstract Callback block for returning an array of FBSDKAccessToken instances (and possibly `NSNull` instances); or an error. + */ +typedef void (^FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)(NSArray *tokens, NSError *error) ; + +/*! + @typedef + + @abstract Callback block for removing a test user. + */ +typedef void (^FBSDKTestUsersManagerRemoveTestAccountHandler)(NSError *error) ; + + +/*! + @class FBSDKTestUsersManager + @abstract Provides methods for managing test accounts for testing Facebook integration. + + @discussion Facebook allows developers to create test accounts for testing their applications' + Facebook integration (see https://developers.facebook.com/docs/test_users/). This class + simplifies use of these accounts for writing tests. It is not designed for use in + production application code. + + This class will make Graph API calls on behalf of your app to manage test accounts and requires + an app id and app secret. You will typically use this class to write unit or integration tests. + Make sure you NEVER include your app secret in your production app. + */ +@interface FBSDKTestUsersManager : NSObject + +/*! + @abstract construct or return the shared instance + @param appID the Facebook app id + @param appSecret the Facebook app secret + */ ++ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret; + +/*! + @abstract retrieve FBSDKAccessToken instances for test accounts with the specific permissions. + @param arraysOfPermissions an array of permissions sets, such as @[ [NSSet setWithObject:@"email"], [NSSet setWithObject:@"user_birthday"]] + if you needed two test accounts with email and birthday permissions, respectively. You can pass in empty nested sets + if you need two arbitrary test accounts. For convenience, passing nil is treated as @[ [NSSet set] ] + for fetching a single test user. + @param createIfNotFound if YES, new test accounts are created if no test accounts existed that fit the permissions + requirement + @param handler the callback to invoke which will return an array of `FBAccessTokenData` instances or an `NSError`. + If param `createIfNotFound` is NO, the array may contain `[NSNull null]` instances. + + @discussion If you are requesting test accounts with differing number of permissions, try to order + `arrayOfPermissionsArrays` so that the most number of permissions come first to minimize creation of new + test accounts. + */ +- (void)requestTestAccountTokensWithArraysOfPermissions:(NSArray *)arraysOfPermissions + createIfNotFound:(BOOL)createIfNotFound + completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; + +/*! + @abstract add a test account with the specified permissions + @param permissions the set of permissions, e.g., [NSSet setWithObjects:@"email", @"user_friends"] + @param handler the callback handler + */ +- (void)addTestAccountWithPermissions:(NSSet *)permissions + completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; + +/*! + @abstract remove a test account for the given user id + @param userId the user id + @param handler the callback handler + */ +- (void)removeTestAccount:(NSString *)userId completionHandler:(FBSDKTestUsersManagerRemoveTestAccountHandler)handler; + +/*! + @abstract Make two test users friends with each other. + @param first the token of the first user + @param second the token of the second user + @param callback the callback handler + */ +- (void)makeFriendsWithFirst:(FBSDKAccessToken *)first second:(FBSDKAccessToken *)second callback:(void (^)(NSError *))callback; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m new file mode 100644 index 0000000..71fb8df --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m @@ -0,0 +1,328 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKTestUsersManager.h" + +#import "FBSDKCoreKit+Internal.h" + +static NSString *const kFBGraphAPITestUsersPathFormat = @"%@/accounts/test-users"; +static NSString *const kAccountsDictionaryTokenKey = @"access_token"; +static NSString *const kAccountsDictionaryPermissionsKey = @"permissions"; +static NSMutableDictionary *gInstancesDictionary; + +@interface FBSDKTestUsersManager() +- (instancetype)initWithAppID:(NSString *)appID appSecret:(NSString *)appSecret NS_DESIGNATED_INITIALIZER; +@end + +@implementation FBSDKTestUsersManager +{ + NSString *_appID; + NSString *_appSecret; + // dictionary with format like: + // { user_id : { kAccountsDictionaryTokenKey : "token", + // kAccountsDictionaryPermissionsKey : [ permissions ] } + NSMutableDictionary *_accounts; +} + +- (instancetype)initWithAppID:(NSString *)appID appSecret:(NSString *)appSecret { + if ((self = [super init])) { + _appID = [appID copy]; + _appSecret = [appSecret copy]; + _accounts = [NSMutableDictionary dictionary]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAppID:appSecret:); + return [self initWithAppID:nil appSecret:nil]; +} + ++ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gInstancesDictionary = [NSMutableDictionary dictionary]; + }); + + NSString *instanceKey = [NSString stringWithFormat:@"%@|%@", appID, appSecret]; + if (!gInstancesDictionary[instanceKey]) { + gInstancesDictionary[instanceKey] = [[FBSDKTestUsersManager alloc] initWithAppID:appID appSecret:appSecret]; + } + return gInstancesDictionary[instanceKey]; +} + +- (void)requestTestAccountTokensWithArraysOfPermissions:(NSArray *)arraysOfPermissions + createIfNotFound:(BOOL)createIfNotFound + completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler { + arraysOfPermissions = arraysOfPermissions ?: @[[NSSet set]]; + + // wrap work in a block so that we can chain it to after a fetch of existing accounts if we need to. + void (^helper)(NSError *) = ^(NSError *error){ + if (error) { + if (handler) { + handler(nil, error); + } + return; + } + NSMutableArray *tokenDatum = [NSMutableArray arrayWithCapacity:arraysOfPermissions.count]; + NSMutableSet *collectedUserIds = [NSMutableSet setWithCapacity:arraysOfPermissions.count]; + __block BOOL canInvokeHandler = YES; + __weak id weakSelf = self; + [arraysOfPermissions enumerateObjectsUsingBlock:^(NSSet *desiredPermissions, NSUInteger idx, BOOL *stop) { + NSArray* userIdAndTokenPair = [self userIdAndTokenOfExistingAccountWithPermissions:desiredPermissions skip:collectedUserIds]; + if (!userIdAndTokenPair) { + if (createIfNotFound) { + [self addTestAccountWithPermissions:desiredPermissions + completionHandler:^(NSArray *tokens, NSError *addError) { + if (addError) { + if (handler) { + handler(nil, addError); + } + } else { + [weakSelf requestTestAccountTokensWithArraysOfPermissions:arraysOfPermissions + createIfNotFound:createIfNotFound + completionHandler:handler]; + } + }]; + // stop the enumeration (ane flag so that callback to addTestAccount* will resolve our handler now). + canInvokeHandler = NO; + *stop = YES; + return; + } else { + [tokenDatum addObject:[NSNull null]]; + } + } else { + NSString *userId = userIdAndTokenPair[0]; + NSString *tokenString = userIdAndTokenPair[1]; + [collectedUserIds addObject:userId]; + [tokenDatum addObject:[self tokenDataForTokenString:tokenString + permissions:desiredPermissions + userId:userId]]; + } + }]; + + if (canInvokeHandler && handler) { + handler(tokenDatum, nil); + } + }; + if (_accounts.count == 0) { + [self fetchExistingTestAccountsWithAfterCursor:nil handler:helper]; + } else { + helper(NULL); + } +} + +- (void)addTestAccountWithPermissions:(NSSet *)permissions + completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler { + NSDictionary *params = @{ + @"installed" : @"true", + @"permissions" : [[permissions allObjects] componentsJoinedByString:@","], + @"access_token" : self.appAccessToken + }; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:kFBGraphAPITestUsersPathFormat, _appID] + parameters:params + tokenString:[self appAccessToken] + version:nil + HTTPMethod:@"POST"]; + [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (error) { + if (handler) { + handler(nil, error); + } + } else { + NSMutableDictionary *accountData = [NSMutableDictionary dictionaryWithCapacity:2]; + accountData[kAccountsDictionaryPermissionsKey] = [NSSet setWithSet:permissions]; + accountData[kAccountsDictionaryTokenKey] = result[@"access_token"]; + _accounts[result[@"id"]] = accountData; + + if (handler) { + FBSDKAccessToken *token = [self tokenDataForTokenString:accountData[kAccountsDictionaryTokenKey] + permissions:permissions + userId:result[@"id"]]; + handler(@[token], nil); + } + } + }]; +} + +- (void)makeFriendsWithFirst:(FBSDKAccessToken *)first second:(FBSDKAccessToken *)second callback:(void (^)(NSError *))callback +{ + __block int expectedCount = 2; + void (^complete)(NSError *) = ^(NSError *error) { + // ignore if they're already friends or pending request + if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue] == 522 || + [error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue] == 520) { + error = nil; + } + if (--expectedCount == 0 || error) { + callback(error); + } + }; + FBSDKGraphRequest *one = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/friends/%@", first.userID, second.userID] + parameters:nil + tokenString:first.tokenString + version:nil + HTTPMethod:@"POST"]; + FBSDKGraphRequest *two = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/friends/%@", second.userID, first.userID] + parameters:nil + tokenString:second.tokenString + version:nil + HTTPMethod:@"POST"]; + FBSDKGraphRequestConnection *conn = [[FBSDKGraphRequestConnection alloc] init]; + [conn addRequest:one completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + complete(error); + } batchEntryName:@"first"]; + [conn addRequest:two completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + complete(error); + } batchParameters:@{ @"depends_on" : @"first"} ]; + [conn start]; +} + +- (void)removeTestAccount:(NSString *)userId completionHandler:(FBSDKTestUsersManagerRemoveTestAccountHandler)handler { + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:userId + parameters:nil + tokenString:self.appAccessToken + version:nil + HTTPMethod:@"DELETE"]; + [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (handler) { + handler(error); + } + }]; +} + +#pragma mark - private methods +- (FBSDKAccessToken *)tokenDataForTokenString:(NSString *)tokenString permissions:(NSSet *)permissions userId:(NSString *)userId{ + return [[FBSDKAccessToken alloc] initWithTokenString:tokenString + permissions:[permissions allObjects] + declinedPermissions:nil + appID:_appID + userID:userId + expirationDate:nil + refreshDate:nil]; +} + +- (NSArray *)userIdAndTokenOfExistingAccountWithPermissions:(NSSet *)permissions skip:(NSSet *)setToSkip { + __block NSString *userId = nil; + __block NSString *token = nil; + + [_accounts enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSDictionary *accountData, BOOL *stop) { + if ([setToSkip containsObject:key]) { + return; + } + NSSet *accountPermissions = accountData[kAccountsDictionaryPermissionsKey]; + if ([permissions isSubsetOfSet:accountPermissions]) { + token = accountData[kAccountsDictionaryTokenKey]; + userId = key; + *stop = YES; + } + }]; + if (userId && token) { + return @[userId, token]; + } else { + return nil; + } +} + +- (NSString *)appAccessToken { + return [NSString stringWithFormat:@"%@|%@", _appID, _appSecret]; +} + +- (void)fetchExistingTestAccountsWithAfterCursor:(NSString *)after handler:(void(^)(NSError *error))handler { + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + FBSDKGraphRequest *requestForAccountIds = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:kFBGraphAPITestUsersPathFormat, _appID] + parameters:@{@"limit" : @"50", + @"after" : after ?: @"", + @"fields": @"" + } + tokenString:self.appAccessToken + version:nil + HTTPMethod:nil]; + __block NSString *afterCursor = nil; + __block NSInteger expectedTestAccounts = 0; + FBSDKGraphRequestConnection *permissionConnection = [[FBSDKGraphRequestConnection alloc] init]; + [connection addRequest:requestForAccountIds completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + if (error) { + if (handler) { + handler(error); + } + // on errors, clear out accounts since it may be in a bad state + [_accounts removeAllObjects]; + return; + } else { + for (NSDictionary *account in result[@"data"]) { + NSString *userId = account[@"id"]; + NSString *token = account[@"access_token"]; + if (userId && token) { + _accounts[userId] = [NSMutableDictionary dictionaryWithCapacity:2]; + _accounts[userId][kAccountsDictionaryTokenKey] = token; + expectedTestAccounts++; + [permissionConnection addRequest:[[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@?fields=permissions", userId] + parameters:nil + tokenString:self.appAccessToken + version:nil + HTTPMethod:nil] + completionHandler:^(FBSDKGraphRequestConnection *innerConnection2, id innerResult, NSError *innerError) { + if (_accounts.count == 0) { + // indicates an earlier error that was already passed to handler, so just short circuit. + return; + } + if (innerError) { + if (handler) { + handler(innerError); + } + [_accounts removeAllObjects]; + return; + } else { + NSMutableSet *grantedPermissions = [NSMutableSet set]; + NSArray *resultPermissionsDictionaries = innerResult[@"permissions"][@"data"]; + [resultPermissionsDictionaries enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) { + if ([obj[@"status"] isEqualToString:@"granted"]) { + [grantedPermissions addObject:obj[@"permission"]]; + } + }]; + _accounts[userId][kAccountsDictionaryPermissionsKey] = grantedPermissions; + } + expectedTestAccounts--; + if (!expectedTestAccounts) { + if (afterCursor) { + [self fetchExistingTestAccountsWithAfterCursor:afterCursor handler:handler]; + } else if (handler) { + handler(nil); + } + } + } + ]; + } + } + afterCursor = result[@"paging"][@"cursors"][@"after"]; + } + + if (expectedTestAccounts) { + // finished fetching ids and tokens, now kick off the request for all the permissions + [permissionConnection start]; + } else { + if (handler) { + handler(nil); + } + } + }]; + [connection start]; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h new file mode 100644 index 0000000..46c490b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h @@ -0,0 +1,55 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @abstract Class to contain common utility methods. + */ +@interface FBSDKUtility : NSObject + +/*! + @abstract Parses a query string into a dictionary. + @param queryString The query string value. + @return A dictionary with the key/value pairs. + */ ++ (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString; + +/*! + @abstract Constructs a query string from a dictionary. + @param dictionary The dictionary with key/value pairs for the query string. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @result Query string representation of the parameters. + */ ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract Decodes a value from an URL. + @param value The value to decode. + @result The decoded value. + */ ++ (NSString *)URLDecode:(NSString *)value; + +/*! + @abstract Encodes a value for an URL. + @param value The value to encode. + @result The encoded value. + */ ++ (NSString *)URLEncode:(NSString *)value; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m new file mode 100644 index 0000000..e140d16 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m @@ -0,0 +1,90 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKUtility.h" + +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" + +@implementation FBSDKUtility + ++ (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString +{ + NSMutableDictionary *result = [[NSMutableDictionary alloc] init]; + NSArray *parts = [queryString componentsSeparatedByString:@"&"]; + + for (NSString *part in parts) { + if ([part length] == 0) { + continue; + } + + NSRange index = [part rangeOfString:@"="]; + NSString *key; + NSString *value; + + if (index.location == NSNotFound) { + key = part; + value = @""; + } else { + key = [part substringToIndex:index.location]; + value = [part substringFromIndex:index.location + index.length]; + } + + key = [self URLDecode:key]; + value = [self URLDecode:value]; + if (key && value) { + result[key] = value; + } + } + return result; +} + ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary error:(NSError *__autoreleasing *)errorRef +{ + return [FBSDKInternalUtility queryStringWithDictionary:dictionary error:errorRef invalidObjectHandler:NULL]; +} + ++ (NSString *)URLDecode:(NSString *)value +{ + value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +#pragma clang diagnostic pop + return value; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" ++ (NSString *)URLEncode:(NSString *)value +{ + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, + (CFStringRef)value, + NULL, // characters to leave unescaped + CFSTR(":!*();@/&?+$,='"), + kCFStringEncodingUTF8); +} +#pragma clang diagnostic pop + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h new file mode 100644 index 0000000..1781a00 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h @@ -0,0 +1,158 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +#import "FBSDKAppEventsUtility.h" + +@class FBSDKGraphRequest; + +// Internally known event names + +FBSDK_EXTERN NSString *const FBSDKAppEventNamePurchased; + +/*! Use to log that the share dialog was launched */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameShareSheetLaunch; + +/*! Use to log that the share dialog was dismissed */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameShareSheetDismiss; + +/*! Use to log that the permissions UI was launched */ +FBSDK_EXTERN NSString *const FBSDKAppEventNamePermissionsUILaunch; + +/*! Use to log that the permissions UI was dismissed */ +FBSDK_EXTERN NSString *const FBSDKAppEventNamePermissionsUIDismiss; + +/*! Use to log that the login view was used */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameLoginViewUsage; + +// Internally known event parameters + +/*! String parameter specifying the outcome of a dialog invocation */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogOutcome; + +/*! Parameter key used to specify which application launches this application. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterLaunchSource; + +/*! Use to log the result of a call to FBDialogs presentShareDialogWithParams: */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialog; + +/*! Use to log the result of a call to FBDialogs presentShareDialogWithOpenGraphActionParams: */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogOG; + +/*! Use to log the result of a call to FBDialogs presentLikeDialogWithLikeParams: */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentLikeDialogOG; + +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogPhoto; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialog; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogPhoto; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogOG; + +/*! Use to log the start of an auth request that cannot be fulfilled by the token cache */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthStart; + +/*! Use to log the end of an auth request that was not fulfilled by the token cache */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthEnd; + +/*! Use to log the start of a specific auth method as part of an auth request */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthMethodStart; + +/*! Use to log the end of the last tried auth method as part of an auth request */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthMethodEnd; + +/*! Use to log the timestamp for the transition to the Facebook native login dialog */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogStart; + +/*! Use to log the timestamp for the transition back to the app after the Facebook native login dialog */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogEnd; + +/*! Use to log the e2e timestamp metrics for web login */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsWebLoginCompleted; + +/*! Use to log the results of a share dialog */ +FBSDK_EXTERN NSString *const FBSDLAppEventNameFBSDKEventShareDialogResult; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogResult; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult; + +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventShareDialogShow; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogShow; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow; + +FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogMode; +FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentType; + +// Internally known event parameter values + +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Completed; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Cancelled; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Failed; + +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeOpenGraph; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeStatus; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypePhoto; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeVideo; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeUnknown; + + +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeAutomatic; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeBrowser; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeNative; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeShareSheet; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeWeb; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeFeedBrowser; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeFeedWeb; +FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeUnknown; + +FBSDK_EXTERN NSString *const FBSDKAppEventsNativeLoginDialogStartTime; +FBSDK_EXTERN NSString *const FBSDKAppEventsNativeLoginDialogEndTime; + +FBSDK_EXTERN NSString *const FBSDKAppEventsWebLoginE2E; + +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeButtonImpression; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLoginButtonImpression; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSendButtonImpression; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKShareButtonImpression; + +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeButtonDidTap; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLoginButtonDidTap; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSendButtonDidTap; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKShareButtonDidTap; + +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidDisable; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidLike; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidPresentDialog; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidTap; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidUnlike; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlError; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlImpression; +FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable; + +FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogErrorMessage; + +@interface FBSDKAppEvents (Internal) + ++ (void)logImplicitEvent:(NSString *)eventName + valueToSum:(NSNumber *)valueToSum + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken; + ++ (FBSDKAppEvents *)singleton; +- (void)flushForReason:(FBSDKAppEventsFlushReason)flushReason; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h new file mode 100644 index 0000000..2de04b8 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKAppEventsDeviceInfo : NSObject + ++ (void)extendDictionaryWithDeviceInfo:(NSMutableDictionary *)dictionary; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m new file mode 100644 index 0000000..152d01d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m @@ -0,0 +1,252 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppEventsDeviceInfo.h" + +#import +#import + +#import +#import +#import +#import + +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKUtility.h" + +#define FB_ARRAY_COUNT(x) sizeof(x) / sizeof(x[0]) + +static const u_int FB_GROUP1_RECHECK_DURATION = 30 * 60; // seconds + +// Apple reports storage in binary gigabytes (1024^3) in their About menus, etc. +static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes + +@implementation FBSDKAppEventsDeviceInfo + +// Ephemeral data, may change during the lifetime of an app. We collect them in different +// 'group' frequencies - group1 may gets collected once every 30 minutes. + +// group1 +NSString *_carrierName; +NSString *_timeZoneAbbrev; +unsigned long long _remainingDiskSpaceGB; + +// Persistent data, but we maintain it to make rebuilding the device info as fast as possible. +NSString *_bundleIdentifier; +NSString *_longVersion; +NSString *_shortVersion; +NSString *_sysVersion; +NSString *_machine; +NSString *_language; +unsigned long long _totalDiskSpaceGB; +unsigned long long _coreCount; +CGFloat _width; +CGFloat _height; +CGFloat _density; + +// Other state +long _lastGroup1CheckTime; +BOOL _isEncodingDirty = YES; +NSString *_encodedDeviceInfo; +static FBSDKAppEventsDeviceInfo *g_singleton; + +#pragma mark - Public Methods + ++ (void)extendDictionaryWithDeviceInfo:(NSMutableDictionary *)dictionary +{ + dictionary[@"extinfo"] = [g_singleton encodedDeviceInfo]; +} + +#pragma mark - Internal Methods + ++ (void)initialize +{ + if (self == [FBSDKAppEventsDeviceInfo class]) { + g_singleton = [[FBSDKAppEventsDeviceInfo alloc] init]; + [g_singleton _collectPersistentData]; + } +} + +- (NSString *)encodedDeviceInfo +{ + @synchronized (self) { + + BOOL isGroup1Expired = [self _isGroup1Expired]; + BOOL isEncodingExpired = isGroup1Expired; // Can || other groups in if we add them + + // As long as group1 hasn't expired, we can just return the last generated value + if (_encodedDeviceInfo && !isEncodingExpired) { + return _encodedDeviceInfo; + } + + if (isGroup1Expired) { + [self _collectGroup1Data]; + } + + if (_isEncodingDirty) { + self.encodedDeviceInfo = [self _generateEncoding]; + _isEncodingDirty = NO; + } + + return _encodedDeviceInfo; + } +} + +- (void)setEncodedDeviceInfo:(NSString *)encodedDeviceInfo +{ + @synchronized (self) { + if (![_encodedDeviceInfo isEqualToString:encodedDeviceInfo]) { + _encodedDeviceInfo = [encodedDeviceInfo copy]; + } + } +} + +// This data need only be collected once. +- (void)_collectPersistentData +{ + // Bundle stuff + NSBundle *mainBundle = [NSBundle mainBundle]; + _bundleIdentifier = mainBundle.bundleIdentifier; + _longVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"]; + _shortVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; + + // Locale stuff + _language = [[NSLocale currentLocale] localeIdentifier]; + + // Device stuff + UIDevice *device = [UIDevice currentDevice]; + _sysVersion = device.systemVersion; + _coreCount = [FBSDKAppEventsDeviceInfo _coreCount]; + + UIScreen *sc = [UIScreen mainScreen]; + CGRect sr = sc.bounds; + _width = sr.size.width; + _height = sr.size.height; + _density = sc.scale; + + struct utsname systemInfo; + uname(&systemInfo); + _machine = @(systemInfo.machine); + + // Disk space stuff + float totalDiskSpace = [[FBSDKAppEventsDeviceInfo _getTotalDiskSpace] floatValue]; + _totalDiskSpaceGB = (unsigned long long)round(totalDiskSpace / FB_GIGABYTE); +} + +- (BOOL)_isGroup1Expired +{ + return ([FBSDKAppEventsUtility unixTimeNow] - _lastGroup1CheckTime) > FB_GROUP1_RECHECK_DURATION; +} + +// This data is collected only once every GROUP1_RECHECK_DURATION. +- (void)_collectGroup1Data +{ + // Carrier + NSString *newCarrierName = [FBSDKAppEventsDeviceInfo _getCarrier]; + if (![newCarrierName isEqualToString:_carrierName]) { + _carrierName = newCarrierName; + _isEncodingDirty = YES; + } + + // Time zone + NSString *newTimeZoneAbbrev = [[NSTimeZone systemTimeZone] abbreviation]; + if (![newTimeZoneAbbrev isEqualToString:_timeZoneAbbrev]) { + _timeZoneAbbrev = newTimeZoneAbbrev; + _isEncodingDirty = YES; + } + + // Remaining disk space + float remainingDiskSpace = [[FBSDKAppEventsDeviceInfo _getRemainingDiskSpace] floatValue]; + unsigned long long newRemainingDiskSpaceGB = (unsigned long long)round(remainingDiskSpace / FB_GIGABYTE); + if (_remainingDiskSpaceGB != newRemainingDiskSpaceGB) { + _remainingDiskSpaceGB = newRemainingDiskSpaceGB; + _isEncodingDirty = YES; + } + + _lastGroup1CheckTime = [FBSDKAppEventsUtility unixTimeNow]; +} + +- (NSString *)_generateEncoding +{ + // Keep a bit of precision on density as it's the most likely to become non-integer. + NSString *densityString = _density ? [NSString stringWithFormat:@"%.02f", _density] : @""; + + NSArray *arr = @[ + @"i2", // version - starts with 'i' for iOS, we'll use 'a' for Android + _bundleIdentifier ?: @"", + _longVersion ?: @"", + _shortVersion ?: @"", + _sysVersion ?: @"", + _machine ?: @"", + _language ?: @"", + _timeZoneAbbrev ?: @"", + _carrierName ?: @"", + _width ? @((unsigned long)_width) : @"", + _height ? @((unsigned long)_height) : @"", + densityString, + @(_coreCount) ?: @"", + @(_totalDiskSpaceGB) ?: @"", + @(_remainingDiskSpaceGB) ?: @"", + ]; + + return [FBSDKInternalUtility JSONStringForObject:arr error:NULL invalidObjectHandler:NULL]; +} + +#pragma mark - Helper Methods + ++ (NSNumber *)_getTotalDiskSpace +{ + NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory() + error:nil]; + return [attrs objectForKey:NSFileSystemSize]; +} + ++ (NSNumber *)_getRemainingDiskSpace +{ + NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory() + error:nil]; + return [attrs objectForKey:NSFileSystemFreeSize]; +} + ++ (uint)_coreCount +{ + return [FBSDKAppEventsDeviceInfo _readSysCtlUInt:CTL_HW type:HW_AVAILCPU]; +} + ++ (uint)_readSysCtlUInt:(int)ctl type:(int)type +{ + int mib[2] = {ctl, type}; + uint value; + size_t size = sizeof value; + if (0 != sysctl(mib, FB_ARRAY_COUNT(mib), &value, &size, NULL, 0)) { + return 0; + } + return value; +} + ++ (NSString *)_getCarrier +{ + // Dynamically load class for this so calling app doesn't need to link framework in. + CTTelephonyNetworkInfo *networkInfo = [[fbsdkdfl_CTTelephonyNetworkInfoClass() alloc] init]; + CTCarrier *carrier = [networkInfo subscriberCellularProvider]; + return [carrier carrierName] ?: @"NoCarrier"; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h new file mode 100644 index 0000000..af45788 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h @@ -0,0 +1,38 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +// this type is not thread safe. +@interface FBSDKAppEventsState : NSObject + +@property (readonly, copy) NSArray *events; +@property (readonly, assign) NSUInteger numSkipped; +@property (readonly, copy) NSString *tokenString; +@property (readonly, copy) NSString *appID; + +- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID NS_DESIGNATED_INITIALIZER; + +- (void)addEvent:(NSDictionary *)eventDictionary isImplicit:(BOOL)isImplicit; +- (void)addEventsFromAppEventState:(FBSDKAppEventsState *)appEventsState; +- (BOOL)areAllEventsImplicit; +- (BOOL)isCompatibleWithAppEventsState:(FBSDKAppEventsState *)appEventsState; +- (BOOL)isCompatibleWithTokenString:(NSString *)tokenString appID:(NSString *)appID; +- (NSString *)JSONStringForEvents:(BOOL)includeImplicitEvents; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m new file mode 100644 index 0000000..3498e50 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m @@ -0,0 +1,161 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppEventsState.h" + +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" + +#define FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY @"isImplicit" + +#define FBSDK_APPEVENTSSTATE_MAX_EVENTS 1000 + +#define FBSDK_APPEVENTSSTATE_APPID_KEY @"appID" +#define FBSDK_APPEVENTSSTATE_EVENTS_KEY @"events" +#define FBSDK_APPEVENTSSTATE_NUMSKIPPED_KEY @"numSkipped" +#define FBSDK_APPEVENTSSTATE_TOKENSTRING_KEY @"tokenString" + +@implementation FBSDKAppEventsState +{ + NSMutableArray *_mutableEvents; + BOOL _containsExplicitEvent; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithToken:appID:); + return [self initWithToken:nil appID:nil]; +} + +- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID +{ + if ((self = [super init])) { + _tokenString = [tokenString copy]; + _appID = [appID copy]; + _mutableEvents = [NSMutableArray array]; + } + return self; +} + +- (instancetype)copyWithZone:(NSZone *)zone +{ + FBSDKAppEventsState *copy = [[FBSDKAppEventsState allocWithZone:zone] initWithToken:_tokenString appID:_appID]; + if (copy) { + [copy->_mutableEvents addObjectsFromArray:_mutableEvents]; + copy->_numSkipped = _numSkipped; + copy->_containsExplicitEvent = _containsExplicitEvent; + } + return copy; +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APPEVENTSSTATE_APPID_KEY]; + NSString *tokenString = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APPEVENTSSTATE_TOKENSTRING_KEY]; + NSArray *events = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_APPEVENTSSTATE_EVENTS_KEY]; + NSUInteger numSkipped = [[decoder decodeObjectOfClass:[NSNumber class] forKey:FBSDK_APPEVENTSSTATE_NUMSKIPPED_KEY] unsignedIntegerValue]; + + if ((self = [self initWithToken:tokenString appID:appID])) { + _mutableEvents = [NSMutableArray arrayWithArray:events]; + _numSkipped = numSkipped; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_appID forKey:FBSDK_APPEVENTSSTATE_APPID_KEY]; + [encoder encodeObject:_tokenString forKey:FBSDK_APPEVENTSSTATE_TOKENSTRING_KEY]; + [encoder encodeObject:@(_numSkipped) forKey:FBSDK_APPEVENTSSTATE_NUMSKIPPED_KEY]; + [encoder encodeObject:_mutableEvents forKey:FBSDK_APPEVENTSSTATE_EVENTS_KEY]; +} + +#pragma mark - Implementation + +- (NSArray *)events +{ + return [_mutableEvents copy]; +} + +- (void)addEventsFromAppEventState:(FBSDKAppEventsState *)appEventsState +{ + NSArray *toAdd = appEventsState->_mutableEvents; + NSInteger excess = _mutableEvents.count + toAdd.count - FBSDK_APPEVENTSSTATE_MAX_EVENTS; + if (excess > 0) { + NSInteger range = FBSDK_APPEVENTSSTATE_MAX_EVENTS - _mutableEvents.count; + toAdd = [toAdd subarrayWithRange:NSMakeRange(0, range)]; + _numSkipped += excess; + } + + [_mutableEvents addObjectsFromArray:toAdd]; +} + +- (void)addEvent:(NSDictionary *)eventDictionary + isImplicit:(BOOL)isImplicit { + if (_mutableEvents.count >= FBSDK_APPEVENTSSTATE_MAX_EVENTS) { + _numSkipped++; + } else { + if (!isImplicit) { + _containsExplicitEvent = YES; + } + [_mutableEvents addObject:@{ + @"event" : eventDictionary, + FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY : @(isImplicit) + }]; + } +} + +- (BOOL)areAllEventsImplicit +{ + return !_containsExplicitEvent; +} + +- (BOOL)isCompatibleWithAppEventsState:(FBSDKAppEventsState *)appEventsState +{ + return ([self isCompatibleWithTokenString:appEventsState.tokenString appID:appEventsState.appID]); +} + +- (BOOL)isCompatibleWithTokenString:(NSString *)tokenString appID:(NSString *)appID +{ + // token strings can be nil (e.g., no user token) but appIDs should not. + BOOL tokenCompatible = ([self.tokenString isEqualToString:tokenString] || + (self.tokenString == nil && tokenString == nil)); + return (tokenCompatible && + [self.appID isEqualToString:appID]); +} + +- (NSString *)JSONStringForEvents:(BOOL)includeImplicitEvents +{ + NSMutableArray *events = [[NSMutableArray alloc] initWithCapacity:_mutableEvents.count]; + for (NSDictionary *eventAndImplicitFlag in _mutableEvents) { + if (!includeImplicitEvents && [eventAndImplicitFlag[FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY] boolValue]) { + continue; + } + [events addObject:eventAndImplicitFlag[@"event"]]; + } + + return [FBSDKInternalUtility JSONStringForObject:events error:NULL invalidObjectHandler:NULL]; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h new file mode 100644 index 0000000..4c17a4c --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h @@ -0,0 +1,34 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKAppEventsState; + +@interface FBSDKAppEventsStateManager : NSObject + ++ (void)clearPersistedAppEventsStates; + +// reads all saved event states, appends the param, and writes them all. ++ (void)persistAppEventsData:(FBSDKAppEventsState *)appEventsState; + +// returns the array of saved app event states and deletes them. ++ (NSArray *)retrievePersistedAppEventsStates; + + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m new file mode 100644 index 0000000..596d7a6 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m @@ -0,0 +1,78 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppEventsStateManager.h" + +#import + +#import "FBSDKAppEventsState.h" +#import "FBSDKAppEventsUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings.h" + +// A quick optimization to allow returning empty array if we know there are no persisted events. +static BOOL g_canSkipDiskCheck = NO; + +@implementation FBSDKAppEventsStateManager + ++ (void)clearPersistedAppEventsStates +{ + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + logEntry:@"FBSDKAppEvents Persist: Clearing"]; + [[NSFileManager defaultManager] removeItemAtPath:[[self class] filePath] + error:NULL]; + g_canSkipDiskCheck = YES; +} + ++ (void)persistAppEventsData:(FBSDKAppEventsState *)appEventsState +{ + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKAppEvents Persist: Writing %lu events", (unsigned long)appEventsState.events.count]; + + if (!appEventsState.events.count) { + return; + } + NSMutableArray *existingEvents = [NSMutableArray arrayWithArray:[[self class] retrievePersistedAppEventsStates]]; + [existingEvents addObject:appEventsState]; + + [NSKeyedArchiver archiveRootObject:existingEvents toFile:[[self class] filePath]]; + g_canSkipDiskCheck = NO; +} + ++ (NSArray *)retrievePersistedAppEventsStates +{ + NSMutableArray *eventsStates = [NSMutableArray array]; + if (!g_canSkipDiskCheck) { + [eventsStates addObjectsFromArray:[NSKeyedUnarchiver unarchiveObjectWithFile:[[self class] filePath]]]; + + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKAppEvents Persist: Read %lu event states. First state has %lu events", + (unsigned long)eventsStates.count, + (unsigned long)(eventsStates.count > 0 ? ((FBSDKAppEventsState *)eventsStates[0]).events.count : 0)]; + [[self class] clearPersistedAppEventsStates]; + } + return eventsStates; +} + +#pragma mark - Private Helpers + ++ (NSString *)filePath +{ + return [FBSDKAppEventsUtility persistenceFilePath:@"com-facebook-sdk-AppEventsPersistedEvents.json"]; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h new file mode 100644 index 0000000..7503217 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h @@ -0,0 +1,57 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKAccessToken; + +typedef NS_ENUM(NSUInteger, FBSDKAdvertisingTrackingStatus) +{ + FBSDKAdvertisingTrackingAllowed, + FBSDKAdvertisingTrackingDisallowed, + FBSDKAdvertisingTrackingUnspecified +}; + +typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushReason) +{ + FBSDKAppEventsFlushReasonExplicit, + FBSDKAppEventsFlushReasonTimer, + FBSDKAppEventsFlushReasonSessionChange, + FBSDKAppEventsFlushReasonPersistedEvents, + FBSDKAppEventsFlushReasonEventThreshold, + FBSDKAppEventsFlushReasonEagerlyFlushingEvent +}; + +@interface FBSDKAppEventsUtility : NSObject + ++ (NSMutableDictionary *)activityParametersDictionaryForEvent:(NSString *)eventCategory + implicitEventsOnly:(BOOL)implicitEventsOnly + shouldAccessAdvertisingID:(BOOL)shouldAccessAdvertisingID; ++ (NSString *)advertiserID; ++ (FBSDKAdvertisingTrackingStatus)advertisingTrackingStatus; ++ (NSString *)attributionID; ++ (void)ensureOnMainThread; ++ (NSString *)flushReasonToString:(FBSDKAppEventsFlushReason)flushReason; ++ (void)logAndNotify:(NSString *)msg allowLogAsDeveloperError:(BOOL)allowLogAsDeveloperError; ++ (void)logAndNotify:(NSString *)msg; ++ (NSString *)persistenceFilePath:(NSString *)filename; ++ (NSString *)tokenStringToUseFor:(FBSDKAccessToken *)token; ++ (long)unixTimeNow; ++ (BOOL)validateIdentifier:(NSString *)identifier; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m new file mode 100644 index 0000000..07562e1 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m @@ -0,0 +1,305 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppEventsUtility.h" + +#import + +#import "FBSDKAccessToken.h" +#import "FBSDKAppEvents.h" +#import "FBSDKAppEventsDeviceInfo.h" +#import "FBSDKConstants.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKMacros.h" +#import "FBSDKSettings.h" +#import "FBSDKTimeSpentData.h" + +#define FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME @"com-facebook-sdk-PersistedAnonymousID.json" +#define FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY @"anon_id" +#define FBSDK_APPEVENTSUTILITY_MAX_IDENTIFIER_LENGTH 40 + +@implementation FBSDKAppEventsUtility + ++ (NSMutableDictionary *)activityParametersDictionaryForEvent:(NSString *)eventCategory + implicitEventsOnly:(BOOL)implicitEventsOnly + shouldAccessAdvertisingID:(BOOL)shouldAccessAdvertisingID { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + parameters[@"event"] = eventCategory; + + NSString *attributionID = [[self class] attributionID]; // Only present on iOS 6 and below. + [FBSDKInternalUtility dictionary:parameters setObject:attributionID forKey:@"attribution"]; + + if (!implicitEventsOnly && shouldAccessAdvertisingID) { + NSString *advertiserID = [[self class] advertiserID]; + [FBSDKInternalUtility dictionary:parameters setObject:advertiserID forKey:@"advertiser_id"]; + } + + parameters[FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY] = [self anonymousID]; + + FBSDKAdvertisingTrackingStatus advertisingTrackingStatus = [[self class] advertisingTrackingStatus]; + if (advertisingTrackingStatus != FBSDKAdvertisingTrackingUnspecified) { + BOOL allowed = (advertisingTrackingStatus == FBSDKAdvertisingTrackingAllowed); + parameters[@"advertiser_tracking_enabled"] = [@(allowed) stringValue]; + } + + parameters[@"application_tracking_enabled"] = [@(!FBSDKSettings.limitEventAndDataUsage) stringValue]; + + [FBSDKAppEventsDeviceInfo extendDictionaryWithDeviceInfo:parameters]; + + static dispatch_once_t fetchBundleOnce; + static NSMutableArray *urlSchemes; + + dispatch_once(&fetchBundleOnce, ^{ + NSBundle *mainBundle = [NSBundle mainBundle]; + urlSchemes = [[NSMutableArray alloc] init]; + for (NSDictionary *fields in [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]) { + NSArray *schemesForType = [fields objectForKey:@"CFBundleURLSchemes"]; + if (schemesForType) { + [urlSchemes addObjectsFromArray:schemesForType]; + } + } + }); + + if (urlSchemes.count > 0) { + [parameters setObject:[FBSDKInternalUtility JSONStringForObject:urlSchemes error:NULL invalidObjectHandler:NULL] + forKey:@"url_schemes"]; + } + + return parameters; +} + ++ (NSString *)advertiserID +{ + NSString *result = nil; + + Class ASIdentifierManagerClass = fbsdkdfl_ASIdentifierManagerClass(); + if ([ASIdentifierManagerClass class]) { + ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager]; + result = [[manager advertisingIdentifier] UUIDString]; + } + + return result; +} + ++ (FBSDKAdvertisingTrackingStatus)advertisingTrackingStatus +{ + static dispatch_once_t fetchAdvertisingTrackingStatusOnce; + static FBSDKAdvertisingTrackingStatus status; + + dispatch_once(&fetchAdvertisingTrackingStatusOnce, ^{ + status = FBSDKAdvertisingTrackingUnspecified; + Class ASIdentifierManagerClass = fbsdkdfl_ASIdentifierManagerClass(); + if ([ASIdentifierManagerClass class]) { + ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager]; + if (manager) { + status = [manager isAdvertisingTrackingEnabled] ? FBSDKAdvertisingTrackingAllowed : FBSDKAdvertisingTrackingDisallowed; + } + } + }); + + return status; +} + ++ (NSString *)anonymousID +{ + // Grab previously written anonymous ID and, if none have been generated, create and + // persist a new one which will remain associated with this app. + NSString *result = [[self class] retrievePersistedAnonymousID]; + if (!result) { + // Generate a new anonymous ID. Create as a UUID, but then prepend the fairly + // arbitrary 'XZ' to the front so it's easily distinguishable from IDFA's which + // will only contain hex. + result = [NSString stringWithFormat:@"XZ%@", [[NSUUID UUID] UUIDString]]; + + [self persistAnonymousID:result]; + } + return result; +} + ++ (NSString *)attributionID +{ + return [[UIPasteboard pasteboardWithName:@"fb_app_attribution" create:NO] string]; +} + +// for tests only. ++ (void)clearLibraryFiles +{ + [[NSFileManager defaultManager] removeItemAtPath:[[self class] persistenceFilePath:FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME] + error:NULL]; + [[NSFileManager defaultManager] removeItemAtPath:[[self class] persistenceFilePath:FBSDKTimeSpentFilename] + error:NULL]; +} + ++ (void)ensureOnMainThread +{ + FBSDKConditionalLog([NSThread isMainThread], FBSDKLoggingBehaviorInformational, @"*** This method expected to be called on the main thread."); +} + ++ (NSString *)flushReasonToString:(FBSDKAppEventsFlushReason)flushReason +{ + NSString *result = @"Unknown"; + switch (flushReason) { + case FBSDKAppEventsFlushReasonExplicit: + result = @"Explicit"; + break; + case FBSDKAppEventsFlushReasonTimer: + result = @"Timer"; + break; + case FBSDKAppEventsFlushReasonSessionChange: + result = @"SessionChange"; + break; + case FBSDKAppEventsFlushReasonPersistedEvents: + result = @"PersistedEvents"; + break; + case FBSDKAppEventsFlushReasonEventThreshold: + result = @"EventCountThreshold"; + break; + case FBSDKAppEventsFlushReasonEagerlyFlushingEvent: + result = @"EagerlyFlushingEvent"; + break; + } + return result; +} + ++ (void)logAndNotify:(NSString *)msg +{ + [[self class] logAndNotify:msg allowLogAsDeveloperError:YES]; +} + ++ (void)logAndNotify:(NSString *)msg allowLogAsDeveloperError:(BOOL)allowLogAsDeveloperError +{ + NSString *behaviorToLog = FBSDKLoggingBehaviorAppEvents; + if (allowLogAsDeveloperError) { + if ([[FBSDKSettings loggingBehavior] containsObject:FBSDKLoggingBehaviorDeveloperErrors]) { + // Rather than log twice, prefer 'DeveloperErrors' if it's set over AppEvents. + behaviorToLog = FBSDKLoggingBehaviorDeveloperErrors; + } + } + + [FBSDKLogger singleShotLogEntry:behaviorToLog logEntry:msg]; + NSError *error = [FBSDKError errorWithCode:FBSDKAppEventsFlushErrorCode message:msg]; + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAppEventsLoggingResultNotification object:error]; +} + ++ (BOOL)regexValidateIdentifier:(NSString *)identifier +{ + static NSRegularExpression *regex; + static dispatch_once_t onceToken; + static NSMutableSet *cachedIdentifiers; + dispatch_once(&onceToken, ^{ + NSString *regexString = @"^[0-9a-zA-Z_]+[0-9a-zA-Z _-]*$"; + regex = [NSRegularExpression regularExpressionWithPattern:regexString + options:0 + error:NULL]; + cachedIdentifiers = [[NSMutableSet alloc] init]; + }); + + @synchronized(self) { + if (![cachedIdentifiers containsObject:identifier]) { + NSUInteger numMatches = [regex numberOfMatchesInString:identifier options:0 range:NSMakeRange(0, identifier.length)]; + if (numMatches > 0) { + [cachedIdentifiers addObject:identifier]; + } else { + return NO; + } + } + } + + return YES; +} + ++ (BOOL)validateIdentifier:(NSString *)identifier +{ + if (identifier == nil || identifier.length == 0 || identifier.length > FBSDK_APPEVENTSUTILITY_MAX_IDENTIFIER_LENGTH || ![[self class] regexValidateIdentifier:identifier]) { + [[self class] logAndNotify:[NSString stringWithFormat:@"Invalid identifier: '%@'. Must be between 1 and %d characters, and must be contain only alphanumerics, _, - or spaces, starting with alphanumeric or _.", + identifier, FBSDK_APPEVENTSUTILITY_MAX_IDENTIFIER_LENGTH]]; + return NO; + } + + return YES; +} + ++ (void)persistAnonymousID:(NSString *)anonymousID +{ + [[self class] ensureOnMainThread]; + NSDictionary *data = @{ FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY : anonymousID }; + NSString *content = [FBSDKInternalUtility JSONStringForObject:data error:NULL invalidObjectHandler:NULL]; + + [content writeToFile:[[self class] persistenceFilePath:FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME] + atomically:YES + encoding:NSASCIIStringEncoding + error:nil]; +} + ++ (NSString *)persistenceFilePath:(NSString *)filename +{ + NSSearchPathDirectory directory = NSLibraryDirectory; + NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES); + NSString *docDirectory = [paths objectAtIndex:0]; + return [docDirectory stringByAppendingPathComponent:filename]; +} + ++ (NSString *)retrievePersistedAnonymousID +{ + [[self class] ensureOnMainThread]; + NSString *file = [[self class] persistenceFilePath:FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME]; + NSString *content = [[NSString alloc] initWithContentsOfFile:file + encoding:NSASCIIStringEncoding + error:nil]; + NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL]; + return [results objectForKey:FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY]; +} + +// Given a candidate token (which may be nil), find the real token to string to use. +// Precedence: 1) provided token, 2) current token, 3) app | client token, 4) fully anonymous session. ++ (NSString *)tokenStringToUseFor:(FBSDKAccessToken *)token +{ + if (!token) { + token = [FBSDKAccessToken currentAccessToken]; + } + + NSString *appID = [FBSDKAppEvents loggingOverrideAppID] ?: token.appID ?: [FBSDKSettings appID]; + NSString *tokenString = token.tokenString; + if (!tokenString || ![appID isEqualToString:token.appID]) { + // If there's an logging override app id present, then we don't want to use the client token since the client token + // is intended to match up with the primary app id (and AppEvents doesn't require a client token). + NSString *clientTokenString = [FBSDKSettings clientToken]; + if (clientTokenString && appID && [appID isEqualToString:token.appID]){ + tokenString = [NSString stringWithFormat:@"%@|%@", appID, clientTokenString]; + } else if (appID) { + tokenString = nil; + } + } + return tokenString; +} + ++ (long)unixTimeNow +{ + return (long)round([[NSDate date] timeIntervalSince1970]); +} + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h new file mode 100644 index 0000000..a5f7a77 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +// Class to encapsulate implicit logging of purchase events +@interface FBSDKPaymentObserver : NSObject ++ (void)startObservingTransactions; ++ (void)stopObservingTransactions; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m new file mode 100644 index 0000000..73ef436 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m @@ -0,0 +1,281 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKPaymentObserver.h" + +#import + +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings.h" + +static NSString *const FBSDKAppEventParameterImplicitlyLoggedPurchase = @"_implicitlyLoggedPurchaseEvent"; +static NSString *const FBSDKAppEventNamePurchaseFailed = @"fb_mobile_purchase_failed"; +static NSString *const FBSDKAppEventParameterNameProductTitle = @"fb_content_title"; +static NSString *const FBSDKAppEventParameterNameTransactionID = @"fb_transaction_id"; +static int const FBSDKMaxParameterValueLength = 100; +static NSMutableArray *g_pendingRequestors; + +@interface FBSDKPaymentProductRequestor : NSObject + +@property (nonatomic, retain) SKPaymentTransaction *transaction; + +- (instancetype)initWithTransaction:(SKPaymentTransaction*)transaction; +- (void)resolveProducts; + +@end + +@interface FBSDKPaymentObserver() +@end + +@implementation FBSDKPaymentObserver +{ + BOOL _observingTransactions; +} + ++ (void)startObservingTransactions +{ + [[self singleton] startObservingTransactions]; +} + ++ (void)stopObservingTransactions +{ + [[self singleton] stopObservingTransactions]; +} + +// +// Internal methods +// + ++ (FBSDKPaymentObserver *)singleton +{ + static dispatch_once_t pred; + static FBSDKPaymentObserver *shared = nil; + + dispatch_once(&pred, ^{ + shared = [[FBSDKPaymentObserver alloc] init]; + }); + return shared; +} + +- (instancetype) init +{ + self = [super init]; + if (self) { + _observingTransactions = NO; + } + return self; +} + +- (void)startObservingTransactions +{ + @synchronized (self) { + if (!_observingTransactions) { + [(SKPaymentQueue *)[fbsdkdfl_SKPaymentQueueClass() defaultQueue] addTransactionObserver:self]; + _observingTransactions = YES; + } + } +} + +- (void)stopObservingTransactions +{ + @synchronized (self) { + if (_observingTransactions) { + [(SKPaymentQueue *)[fbsdkdfl_SKPaymentQueueClass() defaultQueue] removeTransactionObserver:self]; + _observingTransactions = NO; + } + } +} + +- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions +{ + for (SKPaymentTransaction *transaction in transactions) { + switch (transaction.transactionState) { + case SKPaymentTransactionStatePurchasing: + case SKPaymentTransactionStatePurchased: + case SKPaymentTransactionStateFailed: + [self handleTransaction:transaction]; + break; + case SKPaymentTransactionStateDeferred: + case SKPaymentTransactionStateRestored: + break; + } + } +} + +- (void)handleTransaction:(SKPaymentTransaction *)transaction +{ + FBSDKPaymentProductRequestor *productRequest = [[FBSDKPaymentProductRequestor alloc] initWithTransaction:transaction]; + [productRequest resolveProducts]; +} + +@end + +@interface FBSDKPaymentProductRequestor() +@property (nonatomic, retain) SKProductsRequest *productRequest; +@end + +@implementation FBSDKPaymentProductRequestor + ++ (void)initialize +{ + if ([self class] == [FBSDKPaymentProductRequestor class]) { + g_pendingRequestors = [[NSMutableArray alloc] init]; + } +} + +- (instancetype)initWithTransaction:(SKPaymentTransaction*)transaction +{ + self = [super init]; + if (self) { + _transaction = transaction; + } + return self; +} + +- (void)setProductRequest:(SKProductsRequest *)productRequest +{ + if (productRequest != _productRequest) { + if (_productRequest) { + _productRequest.delegate = nil; + } + _productRequest = productRequest; + } +} + +- (void)resolveProducts +{ + NSString *productId = self.transaction.payment.productIdentifier; + NSSet *productIdentifiers = [NSSet setWithObjects:productId, nil]; + self.productRequest = [[fbsdkdfl_SKProductsRequestClass() alloc] initWithProductIdentifiers:productIdentifiers]; + self.productRequest.delegate = self; + @synchronized(g_pendingRequestors) { + [g_pendingRequestors addObject:self]; + } + [self.productRequest start]; +} + +- (NSString *)getTruncatedString:(NSString *)inputString +{ + if (!inputString) { + return @""; + } + + return [inputString length] <= FBSDKMaxParameterValueLength ? inputString : [inputString substringToIndex:FBSDKMaxParameterValueLength]; +} + +- (void)logTransactionEvent:(SKProduct *)product +{ + NSString *eventName = nil; + NSString *transactionID = nil; + switch (self.transaction.transactionState) { + case SKPaymentTransactionStatePurchasing: + eventName = FBSDKAppEventNameInitiatedCheckout; + break; + case SKPaymentTransactionStatePurchased: + eventName = FBSDKAppEventNamePurchased; + transactionID = self.transaction.transactionIdentifier; + break; + case SKPaymentTransactionStateFailed: + eventName = FBSDKAppEventNamePurchaseFailed; + break; + case SKPaymentTransactionStateDeferred: + case SKPaymentTransactionStateRestored: + return; + } + if (!eventName) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKPaymentObserver logTransactionEvent: event name cannot be nil"]; + return; + } + + SKPayment *payment = self.transaction.payment; + NSMutableDictionary *eventParameters = [NSMutableDictionary dictionaryWithDictionary: @{ + FBSDKAppEventParameterNameContentID: payment.productIdentifier ?: @"", + FBSDKAppEventParameterNameNumItems: @(payment.quantity), + }]; + double totalAmount = 0; + if (product) { + totalAmount = payment.quantity * product.price.doubleValue; + [eventParameters addEntriesFromDictionary: @{ + FBSDKAppEventParameterNameCurrency: [product.priceLocale objectForKey:NSLocaleCurrencyCode], + FBSDKAppEventParameterNameNumItems: @(payment.quantity), + FBSDKAppEventParameterNameProductTitle: [self getTruncatedString:product.localizedTitle], + FBSDKAppEventParameterNameDescription: [self getTruncatedString:product.localizedDescription], + }]; + if (transactionID) { + [eventParameters setObject:transactionID forKey:FBSDKAppEventParameterNameTransactionID]; + } + } + + [self logImplicitPurchaseEvent:eventName + valueToSum:totalAmount + parameters:eventParameters]; +} + +- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response +{ + NSArray* products = response.products; + NSArray* invalidProductIdentifiers = response.invalidProductIdentifiers; + if (products.count + invalidProductIdentifiers.count != 1) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKPaymentObserver: Expect to resolve one product per request"]; + } + SKProduct *product = nil; + if (products.count) { + product = products[0]; + } + [self logTransactionEvent:product]; +} + +- (void)requestDidFinish:(SKRequest *)request +{ + [self cleanUp]; +} + +- (void)request:(SKRequest *)request didFailWithError:(NSError *)error +{ + [self logTransactionEvent:nil]; + [self cleanUp]; +} + +- (void)cleanUp +{ + @synchronized(g_pendingRequestors) { + [g_pendingRequestors removeObject:self]; + } +} + +- (void)logImplicitPurchaseEvent:(NSString *)eventName + valueToSum:(double)valueToSum + parameters:(NSDictionary *)parameters { + NSMutableDictionary *eventParameters = [NSMutableDictionary dictionaryWithDictionary:parameters]; + [eventParameters setObject:@"1" forKey:FBSDKAppEventParameterImplicitlyLoggedPurchase]; + [FBSDKAppEvents logEvent:eventName + valueToSum:valueToSum + parameters:parameters]; + + // Unless the behavior is set to only allow explicit flushing, we go ahead and flush, since purchase events + // are relatively rare and relatively high value and worth getting across on wire right away. + if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) { + [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent]; + } +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h new file mode 100644 index 0000000..12f2f3a --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h @@ -0,0 +1,36 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +FBSDK_EXTERN NSString *const FBSDKTimeSpentFilename; + +// Class to encapsulate persisting of time spent data collected by [FBSDKAppEvents activateApp]. The activate app App Event is +// logged when restore: is called with sufficient time since the last deactivation. +@interface FBSDKTimeSpentData : NSObject + ++ (void)suspend; ++ (void)restore:(BOOL)calledFromActivateApp; + ++ (void)setSourceApplication:(NSString *)sourceApplication openURL:(NSURL *)url; ++ (void)setSourceApplication:(NSString *)sourceApplication isFromAppLink:(BOOL)isFromAppLink; ++ (void)registerAutoResetSourceApplication; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m new file mode 100644 index 0000000..cfa33c2 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m @@ -0,0 +1,305 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKTimeSpentData.h" + +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKAppEventsUtility.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings.h" + + +// Filename and keys for session length +NSString *const FBSDKTimeSpentFilename = @"com-facebook-sdk-AppEventsTimeSpent.json"; +static NSString *const FBSDKTimeSpentPersistKeySessionSecondsSpent = @"secondsSpentInCurrentSession"; +static NSString *const FBSDKTimeSpentPersistKeySessionNumInterruptions = @"numInterruptions"; +static NSString *const FBSDKTimeSpentPersistKeyLastSuspendTime = @"lastSuspendTime"; + +static NSString *const FBSDKAppEventNameActivatedApp = @"fb_mobile_activate_app"; +static NSString *const FBSDKAppEventNameDeactivatedApp = @"fb_mobile_deactivate_app"; +static NSString *const FBSDKAppEventParameterNameSessionInterruptions = @"fb_mobile_app_interruptions"; +static NSString *const FBSDKAppEventParameterNameTimeBetweenSessions = @"fb_mobile_time_between_sessions"; + +static const int NUM_SECONDS_IDLE_TO_BE_NEW_SESSION = 60; +static const int SECS_PER_MIN = 60; +static const int SECS_PER_HOUR = 60 * SECS_PER_MIN; +static const int SECS_PER_DAY = 24 * SECS_PER_HOUR; + +static NSString *g_sourceApplication; +static BOOL g_isOpenedFromAppLink; + +// Will be translated and displayed in App Insights. Need to maintain same number and value of quanta on the server. +static const long INACTIVE_SECONDS_QUANTA[] = +{ + 5 * SECS_PER_MIN, + 15 * SECS_PER_MIN, + 30 * SECS_PER_MIN, + 1 * SECS_PER_HOUR, + 6 * SECS_PER_HOUR, + 12 * SECS_PER_HOUR, + 1 * SECS_PER_DAY, + 2 * SECS_PER_DAY, + 3 * SECS_PER_DAY, + 7 * SECS_PER_DAY, + 14 * SECS_PER_DAY, + 21 * SECS_PER_DAY, + 28 * SECS_PER_DAY, + 60 * SECS_PER_DAY, + 90 * SECS_PER_DAY, + 120 * SECS_PER_DAY, + 150 * SECS_PER_DAY, + 180 * SECS_PER_DAY, + 365 * SECS_PER_DAY, + LONG_MAX, // keep as LONG_MAX to guarantee loop will terminate +}; + +/** + * This class encapsulates the notion of an app 'session' - the length of time that the user has + * spent in the app that can be considered a single usage of the app. Apps may be frequently interrupted + * do to other device activity, like a text message, so this class allows those interruptions to be smoothed + * out and the time actually spent in the app excluding this interruption time to be accumulated. Also, + * once a certain amount of time has gone by where the app is not in the foreground, we consider the + * session to be complete, and a new session beginning. When this occurs, we log an 'activate app' event + * with the duration of the previous session as the 'value' of this event, along with the number of + * interruptions from that previous session as an event parameter. + */ +@interface FBSDKTimeSpentData() + +@property (nonatomic) NSInteger numSecondsIdleToBeNewSession; + +@end + +@implementation FBSDKTimeSpentData +{ + BOOL _isCurrentlyLoaded; + BOOL _shouldLogActivateEvent; + BOOL _shouldLogDeactivateEvent; + long _secondsSpentInCurrentSession; + long _timeSinceLastSuspend; + int _numInterruptionsInCurrentSession; + long _lastRestoreTime; +} + +// +// Public methods +// + ++ (void)suspend +{ + [self.singleton instanceSuspend]; +} + ++ (void)restore:(BOOL)calledFromActivateApp +{ + [self.singleton instanceRestore:calledFromActivateApp]; +} + +// +// Internal methods +// + +- (instancetype)init +{ + if ((self = [super init])) { + _numSecondsIdleToBeNewSession = NUM_SECONDS_IDLE_TO_BE_NEW_SESSION; + } + return self; +} + ++ (FBSDKTimeSpentData *)singleton +{ + static dispatch_once_t pred; + static FBSDKTimeSpentData *shared = nil; + + dispatch_once(&pred, ^{ + shared = [[FBSDKTimeSpentData alloc] init]; + }); + return shared; +} + +// Calculate and persist time spent data for this instance of the app activation. +- (void)instanceSuspend +{ + + [FBSDKAppEventsUtility ensureOnMainThread]; + if (!_isCurrentlyLoaded) { + FBSDKConditionalLog(YES, FBSDKLoggingBehaviorInformational, @"[FBSDKTimeSpentData suspend] invoked without corresponding restore"); + return; + } + + long now = [FBSDKAppEventsUtility unixTimeNow]; + long timeSinceRestore = now - _lastRestoreTime; + + // Can happen if the clock on the device is changed + if (timeSinceRestore < 0) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"Clock skew detected"]; + timeSinceRestore = 0; + } + + _secondsSpentInCurrentSession += timeSinceRestore; + + NSDictionary *timeSpentData = + @{ + FBSDKTimeSpentPersistKeySessionSecondsSpent : @(_secondsSpentInCurrentSession), + FBSDKTimeSpentPersistKeySessionNumInterruptions : @(_numInterruptionsInCurrentSession), + FBSDKTimeSpentPersistKeyLastSuspendTime : @(now) + }; + + NSString *content = [FBSDKInternalUtility JSONStringForObject:timeSpentData error:NULL invalidObjectHandler:NULL]; + + [content writeToFile:[FBSDKAppEventsUtility persistenceFilePath:FBSDKTimeSpentFilename] + atomically:YES + encoding:NSASCIIStringEncoding + error:nil]; + + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKTimeSpentData Persist: %@", content]; + + _isCurrentlyLoaded = NO; +} + + +// Called during activation - either through an explicit 'activateApp' call or implicitly when the app is foregrounded. +// In both cases, we restore the persisted event data. In the case of the activateApp, we log an 'app activated' +// event if there's been enough time between the last deactivation and now. +- (void)instanceRestore:(BOOL)calledFromActivateApp +{ + + [FBSDKAppEventsUtility ensureOnMainThread]; + + // It's possible to call this multiple times during the time the app is in the foreground. If this is the case, + // just restore persisted data the first time. + if (!_isCurrentlyLoaded) { + + NSString *content = + [[NSString alloc] initWithContentsOfFile:[FBSDKAppEventsUtility persistenceFilePath:FBSDKTimeSpentFilename] + usedEncoding:nil + error:nil]; + + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents + formatString:@"FBSDKTimeSpentData Restore: %@", content]; + + long now = [FBSDKAppEventsUtility unixTimeNow]; + if (!content) { + + // Nothing persisted, so this is the first launch. + _secondsSpentInCurrentSession = 0; + _numInterruptionsInCurrentSession = 0; + + // We want to log the app activation event on the first launch, but not the deactivate event + _shouldLogActivateEvent = YES; + _shouldLogDeactivateEvent = NO; + + } else { + + NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL]; + + long lastActiveTime = [[results objectForKey:FBSDKTimeSpentPersistKeyLastSuspendTime] longValue]; + + _timeSinceLastSuspend = now - lastActiveTime; + _secondsSpentInCurrentSession = [[results objectForKey:FBSDKTimeSpentPersistKeySessionSecondsSpent] intValue]; + _numInterruptionsInCurrentSession = [[results objectForKey:FBSDKTimeSpentPersistKeySessionNumInterruptions] intValue]; + _shouldLogActivateEvent = (_timeSinceLastSuspend > _numSecondsIdleToBeNewSession); + + // Other than the first launch, we always log the last session's deactivate with this session's activate. + _shouldLogDeactivateEvent = _shouldLogActivateEvent; + + if (!_shouldLogDeactivateEvent) { + // If we're not logging, then the time we spent deactivated is considered another interruption. But cap it + // so errant or test uses doesn't blow out the cardinality on the backend processing + _numInterruptionsInCurrentSession = MIN(_numInterruptionsInCurrentSession + 1, 200); + } + + } + + _lastRestoreTime = now; + _isCurrentlyLoaded = YES; + + if (calledFromActivateApp) { + + if (_shouldLogActivateEvent) { + [FBSDKAppEvents logEvent:FBSDKAppEventNameActivatedApp + parameters:@{ + FBSDKAppEventParameterLaunchSource: [[self class] getSourceApplication] + }]; + } + + if (_shouldLogDeactivateEvent) { + + int quantaIndex = 0; + while (_timeSinceLastSuspend > INACTIVE_SECONDS_QUANTA[quantaIndex]) { + quantaIndex++; + } + + [FBSDKAppEvents logEvent:FBSDKAppEventNameDeactivatedApp + valueToSum:_secondsSpentInCurrentSession + parameters: + @{ FBSDKAppEventParameterNameSessionInterruptions : @(_numInterruptionsInCurrentSession), + FBSDKAppEventParameterNameTimeBetweenSessions : [NSString stringWithFormat:@"session_quanta_%d", quantaIndex], + FBSDKAppEventParameterLaunchSource: [[self class] getSourceApplication], + } + ]; + + // We've logged the session stats, now reset. + _secondsSpentInCurrentSession = 0; + _numInterruptionsInCurrentSession = 0; + } + } + } +} + ++ (void)setSourceApplication:(NSString *)sourceApplication openURL:(NSURL *)url +{ + [self setSourceApplication:sourceApplication + isFromAppLink:[FBSDKInternalUtility dictionaryFromFBURL:url][@"al_applink_data"] != nil]; +} + ++ (void)setSourceApplication:(NSString *)sourceApplication isFromAppLink:(BOOL)isFromAppLink +{ + g_isOpenedFromAppLink = isFromAppLink; + g_sourceApplication = sourceApplication; +} + ++ (NSString *)getSourceApplication +{ + NSString *openType = @"Unclassified"; + if (g_isOpenedFromAppLink) { + openType = @"AppLink"; + } + return (g_sourceApplication ? + [NSString stringWithFormat:@"%@(%@)", openType, g_sourceApplication] + : openType); +} + ++ (void)resetSourceApplication +{ + g_sourceApplication = nil; + g_isOpenedFromAppLink = NO; +} + ++ (void)registerAutoResetSourceApplication +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(resetSourceApplication) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h new file mode 100644 index 0000000..c42431b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h @@ -0,0 +1,23 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKBoltsMeasurementEventListener : NSObject ++ (FBSDKBoltsMeasurementEventListener *)defaultListener; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m new file mode 100644 index 0000000..415e029 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m @@ -0,0 +1,78 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBoltsMeasurementEventListener.h" + +#import "FBSDKAppEvents+Internal.h" +#import "FBSDKTimeSpentData.h" + +static NSString *const BoltsMeasurementEventNotificationName = @"com.parse.bolts.measurement_event"; +static NSString *const BoltsMeasurementEventName = @"event_name"; +static NSString *const BoltsMeasurementEventArgs = @"event_args"; +static NSString *const BoltsMeasurementEventPrefix = @"bf_"; + +@implementation FBSDKBoltsMeasurementEventListener + ++ (instancetype)defaultListener +{ + static dispatch_once_t dispatchOnceLocker = 0; + static FBSDKBoltsMeasurementEventListener *defaultListener = nil; + dispatch_once(&dispatchOnceLocker, ^{ + defaultListener = [[self alloc] init]; + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center addObserver:defaultListener + selector:@selector(logFBAppEventForNotification:) + name:BoltsMeasurementEventNotificationName + object:nil]; + }); + return defaultListener; +} + +- (void)logFBAppEventForNotification:(NSNotification *)note +{ + // when catch al_nav_in event, we set source application for FBAppEvents. + if ([note.userInfo[BoltsMeasurementEventName] isEqualToString:@"al_nav_in"]) { + NSString *sourceApplication = note.userInfo[BoltsMeasurementEventArgs][@"sourceApplication"]; + if (sourceApplication) { + [FBSDKTimeSpentData setSourceApplication:sourceApplication isFromAppLink:YES]; + } + } + NSDictionary *eventArgs = note.userInfo[BoltsMeasurementEventArgs]; + NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; + for(NSString *key in eventArgs.allKeys) { + NSError *error = nil; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9a-zA-Z _-]" options:0 error:&error]; + NSString *safeKey = [regex stringByReplacingMatchesInString:key + options:0 + range:NSMakeRange(0, [key length]) + withTemplate:@"-"]; + safeKey = [safeKey stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" -"]]; + logData[safeKey] = eventArgs[key]; + } + [FBSDKAppEvents logImplicitEvent:[BoltsMeasurementEventPrefix stringByAppendingString:note.userInfo[BoltsMeasurementEventName]] + valueToSum:nil + parameters:logData + accessToken:nil]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h new file mode 100644 index 0000000..f358917 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h @@ -0,0 +1,51 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKBase64 : NSObject + +/*! + @abstract Decodes a base-64 encoded string. + @param string The base-64 encoded string. + @return NSData containing the decoded bytes. + */ ++ (NSData *)decodeAsData:(NSString *)string; + +/*! + @abstract Decodes a base-64 encoded string into a string. + @param string The base-64 encoded string. + @return NSString with the decoded UTF-8 value. + */ ++ (NSString *)decodeAsString:(NSString *)string; + +/*! + @abstract Encodes data into a string. + @param data The data to be encoded. + @return The base-64 encoded string. + */ ++ (NSString *)encodeData:(NSData *)data; + +/*! + @abstract Encodes string into a base-64 representation. + @param string The string to be encoded. + @return The base-64 encoded string. + */ ++ (NSString *)encodeString:(NSString *)string; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m new file mode 100644 index 0000000..c509d2e --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m @@ -0,0 +1,133 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBase64.h" + +#import "FBSDKMacros.h" + +@implementation FBSDKBase64 +{ + BOOL _optionsEnabled; +} + +static FBSDKBase64 *_decoder; +static FBSDKBase64 *_encoder; + +#pragma mark - Class Methods + ++ (void)initialize +{ + if (self == [FBSDKBase64 class]) { + BOOL optionsEnabled; + optionsEnabled = [NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]; + _decoder = [[FBSDKBase64 alloc] initWithOptionsEnabled:optionsEnabled]; + optionsEnabled = [NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)]; + _encoder = [[FBSDKBase64 alloc] initWithOptionsEnabled:optionsEnabled]; + } +} + ++ (NSData *)decodeAsData:(NSString *)string +{ + return [_decoder decodeAsData:string]; +} + ++ (NSString *)decodeAsString:(NSString *)string +{ + return [_decoder decodeAsString:string]; +} + ++ (NSString *)encodeData:(NSData *)data +{ + return [_encoder encodeData:data]; +} + ++ (NSString *)encodeString:(NSString *)string +{ + return [_encoder encodeString:string]; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithOptionsEnabled:); + return nil; +} + +- (instancetype)initWithOptionsEnabled:(BOOL)optionsEnabled +{ + if ((self = [super init])) { + _optionsEnabled = optionsEnabled; + } + return self; +} + +#pragma mark - Implementation Methods + +- (NSData *)decodeAsData:(NSString *)string +{ + if (!string) { + return nil; + } + // This padding will be appended before stripping unknown characters, so if there are unknown characters of count % 4 + // it will not be able to decode. Since we assume valid base64 data, we will take this as is. + int needPadding = string.length % 4; + if (needPadding > 0) { + needPadding = 4 - needPadding; + string = [string stringByPaddingToLength:string.length+needPadding withString:@"=" startingAtIndex:0]; + } + if (_optionsEnabled) { + return [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return [[NSData alloc] initWithBase64Encoding:string]; +#pragma clang diagnostic pop + } +} + +- (NSString *)decodeAsString:(NSString *)string +{ + NSData *data = [self decodeAsData:string]; + if (!data) { + return nil; + } + return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +} + +- (NSString *)encodeData:(NSData *)data +{ + if (!data) { + return nil; + } + if (_optionsEnabled) { + return [data base64EncodedStringWithOptions:0]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return [data base64Encoding]; +#pragma clang diagnostic pop + } +} + +- (NSString *)encodeString:(NSString *)string +{ + return [self encodeData:[string dataUsingEncoding:NSUTF8StringEncoding]]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h new file mode 100644 index 0000000..7d488e7 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKBridgeAPIRequest.h" + +@interface FBSDKBridgeAPICrypto : NSObject + ++ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters; ++ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef; ++ (void)reset; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m new file mode 100644 index 0000000..29d2eb4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m @@ -0,0 +1,139 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPICrypto.h" + +#import "FBSDKBridgeAPIProtocol.h" +#import "FBSDKConstants.h" +#import "FBSDKCrypto.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" +#import "FBSDKSettings.h" +#import "FBSDKUtility.h" + +static NSString *const FBSDKBridgeAPICryptoCipherKey = @"cipher"; +static NSString *const FBSDKBridgeAPICryptoCipherKeyKey = @"cipher_key"; +static NSString *g_cipherKey = nil; + +@implementation FBSDKBridgeAPICrypto + +#pragma mark - Class Methods + ++ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters +{ + [FBSDKInternalUtility dictionary:queryParameters setObject:[self _cipherKey] forKey:FBSDKBridgeAPICryptoCipherKeyKey]; +} + ++ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef +{ + if (errorRef != NULL) { + *errorRef = nil; + } + NSString *cipher = queryParameters[FBSDKBridgeAPICryptoCipherKey]; + if (!cipher) { + return queryParameters ?: @{}; + } + NSString *version = queryParameters[FBSDKBridgeAPIVersionKey]; + NSString *cipherKey = [self _cipherKey]; + if (!version || !cipherKey) { + if (errorRef != NULL) { + NSDictionary *userInfo = @{ + FBSDKErrorArgumentValueKey: queryParameters, + }; + *errorRef = [FBSDKError errorWithCode:FBSDKEncryptionErrorCode + userInfo:userInfo + message:@"Error decrypting incoming query parameters." + underlyingError:nil]; + } + return nil; + } + NSArray *additionalSignedDataArray = @[ + [[NSBundle mainBundle] bundleIdentifier], + [FBSDKSettings appID] ?: @"", + @"bridge", + request.methodName ?: @"", + version, + ]; + NSString *additionalSignedDataString = [additionalSignedDataArray componentsJoinedByString:@":"]; + NSData *additionalSignedData = [additionalSignedDataString dataUsingEncoding:NSUTF8StringEncoding]; + FBSDKCrypto *crypto = [[FBSDKCrypto alloc] initWithMasterKey:cipherKey]; + NSData *decryptedData = [crypto decrypt:cipher additionalSignedData:additionalSignedData]; + if (!decryptedData) { + if (errorRef != NULL) { + NSDictionary *userInfo = @{ + FBSDKErrorArgumentValueKey: @{ + @"cipher": cipher, + @"bundleIdentifier": additionalSignedDataArray[0], + @"appID": additionalSignedDataArray[1], + @"host": additionalSignedDataArray[2], + @"methodName": additionalSignedDataArray[3], + @"version": additionalSignedDataArray[4], + }, + }; + *errorRef = [FBSDKError errorWithCode:FBSDKEncryptionErrorCode + userInfo:userInfo + message:@"Error decrypting incoming query parameters." + underlyingError:nil]; + } + return nil; + } + NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; + NSDictionary *decryptedDictionary = [FBSDKUtility dictionaryWithQueryString:decryptedString]; + NSMutableDictionary *decryptedQueryParameters = [[NSMutableDictionary alloc] initWithDictionary:decryptedDictionary]; + decryptedQueryParameters[FBSDKBridgeAPIVersionKey] = version; + return [decryptedQueryParameters copy]; +} + ++ (void)reset +{ + [self _resetCipherKey]; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +#pragma mark - Helper Methods + ++ (NSString *)_cipherKey +{ + if (g_cipherKey) { + return g_cipherKey; + } + g_cipherKey = [[[NSUserDefaults standardUserDefaults] stringForKey:FBSDKBridgeAPICryptoCipherKeyKey] copy]; + if (g_cipherKey) { + return g_cipherKey; + } + return [self _resetCipherKey]; +} + ++ (NSString *)_resetCipherKey +{ + g_cipherKey = [[FBSDKCrypto makeMasterKey] copy]; + [[NSUserDefaults standardUserDefaults] setObject:g_cipherKey forKey:FBSDKBridgeAPICryptoCipherKeyKey]; + return g_cipherKey; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h new file mode 100644 index 0000000..679577c --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h @@ -0,0 +1,44 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKBridgeAPIProtocolType.h" + +@class FBSDKBridgeAPIRequest; + +FBSDK_EXTERN NSString *const FBSDKBridgeAPIAppIDKey; +FBSDK_EXTERN NSString *const FBSDKBridgeAPISchemeSuffixKey; +FBSDK_EXTERN NSString *const FBSDKBridgeAPIVersionKey; + +@protocol FBSDKBridgeAPIProtocol + +- (NSURL *)requestURLWithActionID:(NSString *)actionID + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + error:(NSError *__autoreleasing *)errorRef; +- (NSDictionary *)responseParametersForActionID:(NSString *)actionID + queryParameters:(NSDictionary *)queryParameters + cancelled:(BOOL *)cancelledRef + error:(NSError *__autoreleasing *)errorRef; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h new file mode 100644 index 0000000..b04e359 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +typedef NS_ENUM(NSUInteger, FBSDKBridgeAPIProtocolType) +{ + FBSDKBridgeAPIProtocolTypeNative, + FBSDKBridgeAPIProtocolTypeWeb, +}; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h new file mode 100644 index 0000000..4455e22 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPIProtocol.h" +#import "FBSDKBridgeAPIRequest.h" + +@interface FBSDKBridgeAPIRequest () + +- (instancetype)initWithProtocol:(id)protocol + protocolType:(FBSDKBridgeAPIProtocolType)protocolType + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + userInfo:(NSDictionary *)userInfo +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, strong, readonly) id protocol; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h new file mode 100644 index 0000000..01af30c --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h @@ -0,0 +1,44 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKBridgeAPIProtocolType.h" + +@interface FBSDKBridgeAPIRequest : NSObject + ++ (instancetype)bridgeAPIRequestWithProtocolType:(FBSDKBridgeAPIProtocolType)protocolType + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + userInfo:(NSDictionary *)userInfo; + +@property (nonatomic, copy, readonly) NSString *actionID; +@property (nonatomic, copy, readonly) NSString *methodName; +@property (nonatomic, copy, readonly) NSString *methodVersion; +@property (nonatomic, copy, readonly) NSDictionary *parameters; +@property (nonatomic, assign, readonly) FBSDKBridgeAPIProtocolType protocolType; +@property (nonatomic, copy, readonly) NSString *scheme; +@property (nonatomic, copy, readonly) NSDictionary *userInfo; + +- (NSURL *)requestURL:(NSError *__autoreleasing *)errorRef; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m new file mode 100644 index 0000000..23a3712 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m @@ -0,0 +1,166 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPIRequest.h" +#import "FBSDKBridgeAPIRequest+Private.h" + +#import "FBSDKBridgeAPICrypto.h" +#import "FBSDKBridgeAPIProtocolNativeV1.h" +#import "FBSDKBridgeAPIProtocolWebV1.h" +#import "FBSDKBridgeAPIProtocolWebV2.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" +#import "FBSDKSettings.h" +#import "FBSDKUtility.h" + +NSString *const FBSDKBridgeAPIAppIDKey = @"app_id"; +NSString *const FBSDKBridgeAPISchemeSuffixKey = @"scheme_suffix"; +NSString *const FBSDKBridgeAPIVersionKey = @"version"; + +@implementation FBSDKBridgeAPIRequest + +#pragma mark - Class Methods + ++ (instancetype)bridgeAPIRequestWithProtocolType:(FBSDKBridgeAPIProtocolType)protocolType + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + userInfo:(NSDictionary *)userInfo +{ + return [[self alloc] initWithProtocol:[self _protocolForType:protocolType scheme:scheme] + protocolType:protocolType + scheme:scheme + methodName:methodName + methodVersion:methodVersion + parameters:parameters + userInfo:userInfo]; +} + ++ (NSDictionary *)protocolMap +{ + static NSDictionary *_protocolMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _protocolMap = @{ + @(FBSDKBridgeAPIProtocolTypeNative): @{ + FBSDK_CANOPENURL_FACEBOOK:[[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:@"fbapi20130214"], + FBSDK_CANOPENURL_MESSENGER:[[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:@"fb-messenger-api20140430"] + }, + @(FBSDKBridgeAPIProtocolTypeWeb): @{ + @"https": [[FBSDKBridgeAPIProtocolWebV1 alloc] init], + @"web": [[FBSDKBridgeAPIProtocolWebV2 alloc] init] + }, + }; + }); + return _protocolMap; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithProtocol:(id)protocol + protocolType:(FBSDKBridgeAPIProtocolType)protocolType + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + userInfo:(NSDictionary *)userInfo +{ + if (!protocol) { + return nil; + } + if ((self = [super init])) { + _protocol = protocol; + _protocolType = protocolType; + _scheme = [scheme copy]; + _methodName = [methodName copy]; + _methodVersion = [methodVersion copy]; + _parameters = [parameters copy]; + _userInfo = [userInfo copy]; + + _actionID = [[NSUUID UUID] UUIDString]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithProtocol:protocolType:scheme:methodName:methodVersion:parameters:userInfo:); + return [self initWithProtocol:nil + protocolType:FBSDKBridgeAPIProtocolTypeWeb + scheme:nil + methodName:nil + methodVersion:nil + parameters:nil + userInfo:nil]; +} + +#pragma mark - Public Methods + +- (NSURL *)requestURL:(NSError *__autoreleasing *)errorRef +{ + NSURL *requestURL = [_protocol requestURLWithActionID:self.actionID + scheme:self.scheme + methodName:self.methodName + methodVersion:self.methodVersion + parameters:self.parameters + error:errorRef]; + if (!requestURL) { + return nil; + } + + [FBSDKInternalUtility validateURLSchemes]; + + NSDictionary *requestQueryParameters = [FBSDKUtility dictionaryWithQueryString:requestURL.query]; + NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] initWithDictionary:requestQueryParameters]; + [FBSDKBridgeAPICrypto addCipherKeyToQueryParameters:queryParameters]; + [FBSDKInternalUtility dictionary:queryParameters setObject:[FBSDKSettings appID] forKey:FBSDKBridgeAPIAppIDKey]; + [FBSDKInternalUtility dictionary:queryParameters + setObject:[FBSDKSettings appURLSchemeSuffix] + forKey:FBSDKBridgeAPISchemeSuffixKey]; + requestURL = [FBSDKInternalUtility URLWithScheme:requestURL.scheme + host:requestURL.host + path:requestURL.path + queryParameters:queryParameters + error:errorRef]; + return requestURL; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + return self; +} + ++ (id)_protocolForType:(FBSDKBridgeAPIProtocolType)type scheme:(NSString *)scheme +{ + id protocol = [self protocolMap][@(type)][scheme]; + if (type == FBSDKBridgeAPIProtocolTypeWeb) { + return protocol; + } + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = scheme; + components.path = @"/"; + if ([[UIApplication sharedApplication] canOpenURL:components.URL]) { + return protocol; + } + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h new file mode 100644 index 0000000..3da24d3 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h @@ -0,0 +1,39 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKBridgeAPIRequest.h" + +@interface FBSDKBridgeAPIResponse : NSObject + ++ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request error:(NSError *)error; ++ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request + responseURL:(NSURL *)responseURL + sourceApplication:(NSString *)sourceApplication + error:(NSError *__autoreleasing *)errorRef; ++ (instancetype)bridgeAPIResponseCancelledWithRequest:(FBSDKBridgeAPIRequest *)request; + +@property (nonatomic, assign, readonly, getter=isCancelled) BOOL cancelled; +@property (nonatomic, copy, readonly) NSError *error; +@property (nonatomic, copy, readonly) FBSDKBridgeAPIRequest *request; +@property (nonatomic, copy, readonly) NSDictionary *responseParameters; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m new file mode 100644 index 0000000..2254c95 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m @@ -0,0 +1,135 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPIResponse.h" + +#import "FBSDKBridgeAPICrypto.h" +#import "FBSDKBridgeAPIProtocol.h" +#import "FBSDKBridgeAPIProtocolType.h" +#import "FBSDKBridgeAPIRequest+Private.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" +#import "FBSDKTypeUtility.h" +#import "FBSDKUtility.h" + +@interface FBSDKBridgeAPIResponse () +- (instancetype)initWithRequest:(FBSDKBridgeAPIRequest *)request + responseParameters:(NSDictionary *)responseParameters + cancelled:(BOOL)cancelled + error:(NSError *)error +NS_DESIGNATED_INITIALIZER; +@end + +@implementation FBSDKBridgeAPIResponse + +#pragma mark - Class Methods + ++ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request error:(NSError *)error +{ + return [[self alloc] initWithRequest:request + responseParameters:nil + cancelled:NO + error:error]; +} + ++ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request + responseURL:(NSURL *)responseURL + sourceApplication:(NSString *)sourceApplication + error:(NSError *__autoreleasing *)errorRef +{ + FBSDKBridgeAPIProtocolType protocolType = request.protocolType; + switch (protocolType) { + case FBSDKBridgeAPIProtocolTypeNative:{ + if (![FBSDKInternalUtility isFacebookBundleIdentifier:sourceApplication]) { + [FBSDKBridgeAPICrypto reset]; + return nil; + } + break; + } + case FBSDKBridgeAPIProtocolTypeWeb:{ + if (![FBSDKInternalUtility isSafariBundleIdentifier:sourceApplication]) { + [FBSDKBridgeAPICrypto reset]; + return nil; + } + break; + } + } + NSDictionary *queryParameters = [FBSDKUtility dictionaryWithQueryString:responseURL.query]; + queryParameters = [FBSDKBridgeAPICrypto decryptResponseForRequest:request + queryParameters:queryParameters + error:errorRef]; + if (!queryParameters) { + return nil; + } + id protocol = request.protocol; + BOOL cancelled; + NSError *error; + NSDictionary *responseParameters = [protocol responseParametersForActionID:request.actionID + queryParameters:queryParameters + cancelled:&cancelled + error:&error]; + if (errorRef != NULL) { + *errorRef = error; + } + if (!responseParameters) { + return nil; + } + return [[self alloc] initWithRequest:request + responseParameters:responseParameters + cancelled:cancelled + error:error]; +} + ++ (instancetype)bridgeAPIResponseCancelledWithRequest:(FBSDKBridgeAPIRequest *)request +{ + return [[self alloc] initWithRequest:request + responseParameters:nil + cancelled:YES + error:nil]; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithRequest:(FBSDKBridgeAPIRequest *)request + responseParameters:(NSDictionary *)responseParameters + cancelled:(BOOL)cancelled + error:(NSError *)error +{ + if ((self = [super init])) { + _request = [request copy]; + _responseParameters = [responseParameters copy]; + _cancelled = cancelled; + _error = [error copy]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:responseParameters:cancelled:error:); + return [self initWithRequest:nil responseParameters:nil cancelled:NO error:nil]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + return self; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h new file mode 100644 index 0000000..83c355a --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h @@ -0,0 +1,30 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +@protocol FBSDKURLOpening + +// Implementations should make sure they can handle nil parameters +// which is possible in SafariViewController. +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation; + +- (void)applicationDidBecomeActive:(UIApplication *)application; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h new file mode 100644 index 0000000..8fd34bd --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h @@ -0,0 +1,70 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKBridgeAPIProtocol.h" + +typedef struct +{ + __unsafe_unretained NSString *bridgeArgs; + __unsafe_unretained NSString *methodArgs; + __unsafe_unretained NSString *methodVersion; +} FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys; + +typedef struct +{ + __unsafe_unretained NSString *actionID; + __unsafe_unretained NSString *appIcon; + __unsafe_unretained NSString *appName; + __unsafe_unretained NSString *sdkVersion; +} FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys; + +typedef struct +{ + __unsafe_unretained NSString *bridgeArgs; + __unsafe_unretained NSString *methodResults; +} FBSDKBridgeAPIProtocolNativeV1InputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys; + +typedef struct +{ + __unsafe_unretained NSString *actionID; + __unsafe_unretained NSString *error; +} FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys; + +@interface FBSDKBridgeAPIProtocolNativeV1 : NSObject + +- (instancetype)initWithAppScheme:(NSString *)appScheme; +- (instancetype)initWithAppScheme:(NSString *)appScheme + pasteboard:(UIPasteboard *)pasteboard + dataLengthThreshold:(NSUInteger)dataLengthThreshold + includeAppIcon:(BOOL)includeAppIcon +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, copy, readonly) NSString *appScheme; +@property (nonatomic, assign, readonly) NSUInteger dataLengthThreshold; +@property (nonatomic, assign, readonly) BOOL includeAppIcon; +@property (nonatomic, strong, readonly) UIPasteboard *pasteboard; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m new file mode 100644 index 0000000..50e5b97 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m @@ -0,0 +1,338 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPIProtocolNativeV1.h" + +#import + +#import + +#import "FBSDKApplicationDelegate+Internal.h" +#import "FBSDKBase64.h" +#import "FBSDKBridgeAPIRequest.h" +#import "FBSDKConstants.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKSettings.h" +#import "FBSDKTypeUtility.h" + +#define FBSDKBridgeAPIProtocolNativeV1BridgeMaxBase64DataLengthThreshold (1024 * 16) + +const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys = +{ + .bridgeArgs = @"bridge_args", + .methodArgs = @"method_args", + .methodVersion = @"version", +}; + +const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys = +{ + .actionID = @"action_id", + .appIcon = @"app_icon", + .appName = @"app_name", + .sdkVersion = @"sdk_version", +}; + +const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys = +{ + .bridgeArgs = @"bridge_args", + .methodResults = @"method_results", +}; + +const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys = +{ + .actionID = @"action_id", + .error = @"error", +}; + +static const struct +{ + __unsafe_unretained NSString *isBase64; + __unsafe_unretained NSString *isPasteboard; + __unsafe_unretained NSString *tag; + __unsafe_unretained NSString *value; +} FBSDKBridgeAPIProtocolNativeV1DataKeys = +{ + .isBase64 = @"isBase64", + .isPasteboard = @"isPasteboard", + .tag = @"tag", + .value = @"fbAppBridgeType_jsonReadyValue", +}; + +static NSString *const FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey = @"com.facebook.Facebook.FBAppBridgeType"; + +static const struct +{ + __unsafe_unretained NSString *data; + __unsafe_unretained NSString *image; +} FBSDKBridgeAPIProtocolNativeV1DataTypeTags = +{ + .data = @"data", + // we serialize jpegs but use png for backward compatibility - it is any image format that UIImage can handle + .image = @"png", +}; + +static const struct +{ + __unsafe_unretained NSString *code; + __unsafe_unretained NSString *domain; + __unsafe_unretained NSString *userInfo; +} FBSDKBridgeAPIProtocolNativeV1ErrorKeys = +{ + .code = @"code", + .domain = @"domain", + .userInfo = @"user_info", +}; + +@implementation FBSDKBridgeAPIProtocolNativeV1 + +#pragma mark - Object Lifecycle + +- (instancetype)initWithAppScheme:(NSString *)appScheme +{ + return [self initWithAppScheme:appScheme + pasteboard:[UIPasteboard generalPasteboard] + dataLengthThreshold:FBSDKBridgeAPIProtocolNativeV1BridgeMaxBase64DataLengthThreshold + includeAppIcon:YES]; +} + +- (instancetype)initWithAppScheme:(NSString *)appScheme + pasteboard:(UIPasteboard *)pasteboard + dataLengthThreshold:(NSUInteger)dataLengthThreshold + includeAppIcon:(BOOL)includeAppIcon +{ + if ((self = [super init])) { + _appScheme = [appScheme copy]; + _pasteboard = pasteboard; + _dataLengthThreshold = dataLengthThreshold; + _includeAppIcon = includeAppIcon; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAppScheme:); + return [self initWithAppScheme:nil]; +} + +#pragma mark - FBSDKBridgeAPIProtocol + +- (NSURL *)requestURLWithActionID:(NSString *)actionID + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + error:(NSError *__autoreleasing *)errorRef +{ + NSString *host = @"dialog"; + NSString *path = [@"/" stringByAppendingString:methodName]; + + NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:queryParameters setObject:methodVersion + forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodVersion]; + + if ([parameters count]) { + NSString *parametersString = [self _JSONStringForObject:parameters enablePasteboard:YES error:errorRef]; + if (!parametersString) { + return nil; + } + [FBSDKInternalUtility dictionary:queryParameters + setObject:parametersString + forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodArgs]; + } + + NSDictionary *bridgeParameters = [self _bridgeParametersWithActionID:actionID error:errorRef]; + if (!bridgeParameters) { + return nil; + } + NSString *bridgeParametersString = [self _JSONStringForObject:bridgeParameters enablePasteboard:NO error:errorRef]; + if (!bridgeParametersString) { + return nil; + } + [FBSDKInternalUtility dictionary:queryParameters + setObject:bridgeParametersString + forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.bridgeArgs]; + + + return [FBSDKInternalUtility URLWithScheme:self.appScheme + host:host + path:path + queryParameters:queryParameters + error:errorRef]; +} + +- (NSDictionary *)responseParametersForActionID:(NSString *)actionID + queryParameters:(NSDictionary *)queryParameters + cancelled:(BOOL *)cancelledRef + error:(NSError *__autoreleasing *)errorRef +{ + if (cancelledRef != NULL) { + *cancelledRef = NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + NSError *error; + NSString *bridgeParametersJSON = queryParameters[FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs]; + NSDictionary *bridgeParameters = [FBSDKInternalUtility objectForJSONString:bridgeParametersJSON error:&error]; + bridgeParameters = [FBSDKTypeUtility dictionaryValue:bridgeParameters]; + if (!bridgeParameters) { + if (error && (errorRef != NULL)) { + *errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs + value:bridgeParametersJSON + message:@"Invalid bridge_args." + underlyingError:error]; + } + return nil; + } + NSString *responseActionID = bridgeParameters[FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys.actionID]; + responseActionID = [FBSDKTypeUtility stringValue:responseActionID]; + if (![responseActionID isEqualToString:actionID]) { + return nil; + } + NSDictionary *errorDictionary = bridgeParameters[FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys.error]; + errorDictionary = [FBSDKTypeUtility dictionaryValue:errorDictionary]; + if (errorDictionary) { + error = [self _errorWithDictionary:errorDictionary]; + if (errorRef != NULL) { + *errorRef = error; + } + return nil; + } + NSString *resultParametersJSON = queryParameters[FBSDKBridgeAPIProtocolNativeV1InputKeys.methodResults]; + NSDictionary *resultParameters = [FBSDKInternalUtility objectForJSONString:resultParametersJSON error:&error]; + if (!resultParameters) { + if (errorRef != NULL) { + *errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.methodResults + value:resultParametersJSON + message:@"Invalid method_results." + underlyingError:error]; + } + return nil; + } + if (cancelledRef != NULL) { + NSString *completionGesture = [FBSDKTypeUtility stringValue:resultParameters[@"completionGesture"]]; + *cancelledRef = [completionGesture isEqualToString:@"cancel"]; + } + return resultParameters; +} + +#pragma mark - Helper Methods + +- (UIImage *)_appIcon +{ + if (!_includeAppIcon) { + return nil; + } + NSArray *files = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIcons"] + [@"CFBundlePrimaryIcon"] + [@"CFBundleIconFiles"]; + if (![files count]) { + return nil; + } + return [UIImage imageNamed:files[0]]; +} + +- (NSDictionary *)_bridgeParametersWithActionID:(NSString *)actionID error:(NSError *__autoreleasing *)errorRef +{ + NSMutableDictionary *bridgeParameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:bridgeParameters setObject:actionID + forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.actionID]; + [FBSDKInternalUtility dictionary:bridgeParameters setObject:[self _appIcon] + forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.appIcon]; + [FBSDKInternalUtility dictionary:bridgeParameters setObject:[FBSDKSettings displayName] + forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.appName]; + [FBSDKInternalUtility dictionary:bridgeParameters setObject:[FBSDKSettings sdkVersion] + forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.sdkVersion]; + return bridgeParameters; +} + +- (NSError *)_errorWithDictionary:(NSDictionary *)dictionary +{ + if (!dictionary) { + return nil; + } + NSString *domain = [FBSDKTypeUtility stringValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.domain]] ?: + FBSDKErrorDomain; + NSInteger code = [FBSDKTypeUtility integerValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.code]] ?: + FBSDKUnknownErrorCode; + NSDictionary *userInfo = [FBSDKTypeUtility dictionaryValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.userInfo]]; + return [NSError errorWithDomain:domain code:code userInfo:userInfo]; +} + +- (NSString *)_JSONStringForObject:(id)object enablePasteboard:(BOOL)enablePasteboard error:(NSError **)errorRef +{ + __block BOOL didAddToPasteboard = NO; + return [FBSDKInternalUtility JSONStringForObject:object error:errorRef invalidObjectHandler:^id(id invalidObject, BOOL *stop) { + NSString *dataTag = FBSDKBridgeAPIProtocolNativeV1DataTypeTags.data; + if ([invalidObject isKindOfClass:[UIImage class]]) { + UIImage *image = (UIImage *)invalidObject; + // due to backward compatibility, we must send UIImage as NSData even though UIPasteboard can handle UIImage + invalidObject = UIImageJPEGRepresentation(image, [FBSDKSettings JPEGCompressionQuality]); + dataTag = FBSDKBridgeAPIProtocolNativeV1DataTypeTags.image; + } + if ([invalidObject isKindOfClass:[NSData class]]) { + NSData *data = (NSData *)invalidObject; + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + if (didAddToPasteboard || !enablePasteboard || !_pasteboard || (data.length < _dataLengthThreshold)) { + dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.isBase64] = @YES; + dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.tag] = dataTag; + [FBSDKInternalUtility dictionary:dictionary + setObject:[FBSDKBase64 encodeData:data] + forKey:FBSDKBridgeAPIProtocolNativeV1DataKeys.value]; + } else { + dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.isPasteboard] = @YES; + dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.tag] = dataTag; + dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.value] = _pasteboard.name; + [_pasteboard setData:data forPasteboardType:FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey]; + // this version of the protocol only supports a single item on the pasteboard, so if when we add an item, make + // sure we don't add another item + didAddToPasteboard = YES; + // if we are adding this to the general pasteboard, then we want to remove it when we are done with the share. + // the Facebook app will not clear the value with this version of the protocol, so we should do it when the app + // becomes active again + NSString *pasteboardName = _pasteboard.name; + if ([pasteboardName isEqualToString:UIPasteboardNameGeneral] || + [pasteboardName isEqualToString:UIPasteboardNameFind]) { + [[self class] clearData:data fromPasteboardOnApplicationDidBecomeActive:_pasteboard]; + } + } + return dictionary; + } else if ([invalidObject isKindOfClass:[NSURL class]]) { + return [(NSURL *)invalidObject absoluteString]; + } + return invalidObject; + }]; +} + ++ (void)clearData:(NSData *)data fromPasteboardOnApplicationDidBecomeActive:(UIPasteboard *)pasteboard +{ + void(^notificationBlock)(NSNotification *) = ^(NSNotification *note){ + NSData *pasteboardData = [pasteboard dataForPasteboardType:FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey]; + if ([data isEqualToData:pasteboardData]) { + [pasteboard setData:[NSData data] forPasteboardType:FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey]; + } + }; + [[NSNotificationCenter defaultCenter] addObserverForName:FBSDKApplicationDidBecomeActiveNotification + object:[FBSDKApplicationDelegate sharedInstance] + queue:nil + usingBlock:notificationBlock]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h new file mode 100644 index 0000000..c7b28f4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKBridgeAPIProtocol.h" + +@interface FBSDKBridgeAPIProtocolWebV1 : NSObject + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m new file mode 100644 index 0000000..ebe8710 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m @@ -0,0 +1,116 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPIProtocolWebV1.h" + +#import + +#import "FBSDKBase64.h" +#import "FBSDKBridgeAPIRequest.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" +#import "FBSDKSettings.h" +#import "FBSDKTypeUtility.h" + +#define FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_ACTION_ID_KEY @"action_id" +#define FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY @"bridge_args" + +@implementation FBSDKBridgeAPIProtocolWebV1 + +#pragma mark - FBSDKBridgeAPIProtocol + +- (NSURL *)requestURLWithActionID:(NSString *)actionID + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + error:(NSError *__autoreleasing *)errorRef +{ + NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] initWithDictionary:parameters]; + queryParameters[@"display"] = @"touch"; + NSString *bridgeArgs = [FBSDKInternalUtility JSONStringForObject:@{ FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_ACTION_ID_KEY: actionID } + error:NULL + invalidObjectHandler:NULL]; + NSDictionary *redirectQueryParameters = @{ FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY: bridgeArgs }; + NSURL *redirectURL = [FBSDKInternalUtility appURLWithHost:@"bridge" + path:methodName + queryParameters:redirectQueryParameters + error:NULL]; + [FBSDKInternalUtility dictionary:queryParameters setObject:redirectURL forKey:@"redirect_uri"]; + [queryParameters addEntriesFromDictionary:parameters]; + return [FBSDKInternalUtility facebookURLWithHostPrefix:@"m" + path:[@"/dialog/" stringByAppendingString:methodName] + queryParameters:queryParameters + error:NULL]; +} + +- (NSDictionary *)responseParametersForActionID:(NSString *)actionID + queryParameters:(NSDictionary *)queryParameters + cancelled:(BOOL *)cancelledRef + error:(NSError *__autoreleasing *)errorRef +{ + if (errorRef != NULL) { + *errorRef = nil; + } + NSInteger errorCode = [FBSDKTypeUtility integerValue:queryParameters[@"error_code"]]; + switch (errorCode) { + case 0:{ + // good to go, handle the other codes and bail + break; + } + case 4201:{ + return @{ + @"completionGesture": @"cancel", + }; + break; + } + default:{ + if (errorRef != NULL) { + *errorRef = [FBSDKError errorWithCode:errorCode + message:[FBSDKTypeUtility stringValue:queryParameters[@"error_message"]]]; + } + return nil; + break; + } + } + + NSError *error; + NSString *bridgeParametersJSON = [FBSDKTypeUtility stringValue:queryParameters[FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY]]; + NSDictionary *bridgeParameters = [FBSDKInternalUtility objectForJSONString:bridgeParametersJSON error:&error]; + if (!bridgeParameters) { + if (error && (errorRef != NULL)) { + *errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY + value:bridgeParametersJSON + message:nil + underlyingError:error]; + } + return nil; + } + NSString *responseActionID = bridgeParameters[FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_ACTION_ID_KEY]; + responseActionID = [FBSDKTypeUtility stringValue:responseActionID]; + if (![responseActionID isEqualToString:actionID]) { + return nil; + } + NSMutableDictionary *resultParameters = [queryParameters mutableCopy]; + [resultParameters removeObjectForKey:FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY]; + resultParameters[@"didComplete"] = @YES; + return resultParameters; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h new file mode 100644 index 0000000..3d7e340 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKBridgeAPIProtocol.h" + +@interface FBSDKBridgeAPIProtocolWebV2 : NSObject + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m new file mode 100644 index 0000000..414543d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m @@ -0,0 +1,130 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKBridgeAPIProtocolWebV2.h" + +#import "FBSDKBridgeAPIProtocolNativeV1.h" +#import "FBSDKDialogConfiguration.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKServerConfiguration.h" +#import "FBSDKServerConfigurationManager.h" +#import "FBSDKUtility.h" + +@implementation FBSDKBridgeAPIProtocolWebV2 +{ + FBSDKBridgeAPIProtocolNativeV1 *_nativeProtocol; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + _nativeProtocol = [[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:nil + pasteboard:nil + dataLengthThreshold:0 + includeAppIcon:NO]; + } + return self; +} + +#pragma mark - FBSDKBridgeAPIProtocol + +- (NSURL *)_redirectURLWithActionID:(NSString *)actionID methodName:(NSString *)methodName error:(NSError **)errorRef +{ + NSDictionary *queryParameters = nil; + if (actionID) { + NSDictionary *bridgeArgs = @{ FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys.actionID: actionID }; + NSString *bridgeArgsString = [FBSDKInternalUtility JSONStringForObject:bridgeArgs + error:NULL + invalidObjectHandler:NULL]; + queryParameters = @{ FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs: bridgeArgsString }; + } + return [FBSDKInternalUtility appURLWithHost:@"bridge" path:methodName queryParameters:queryParameters error:errorRef]; +} + +- (NSURL *)_requestURLForDialogConfiguration:(FBSDKDialogConfiguration *)dialogConfiguration error:(NSError **)errorRef +{ + NSURL *requestURL = dialogConfiguration.URL; + if (!requestURL.scheme) { + requestURL = [FBSDKInternalUtility facebookURLWithHostPrefix:@"m" + path:requestURL.path + queryParameters:nil + defaultVersion:@"" + error:errorRef]; + } + return requestURL; +} + +- (NSURL *)requestURLWithActionID:(NSString *)actionID + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + error:(NSError *__autoreleasing *)errorRef +{ + FBSDKServerConfiguration *serverConfiguration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + FBSDKDialogConfiguration *dialogConfiguration = [serverConfiguration dialogConfigurationForDialogName:methodName]; + if (!dialogConfiguration) { + if (errorRef != NULL) { + *errorRef = [FBSDKError errorWithCode:FBSDKDialogUnavailableErrorCode message:nil]; + } + return nil; + } + + NSURL *requestURL = [_nativeProtocol requestURLWithActionID:actionID + scheme:scheme + methodName:methodName + methodVersion:methodVersion + parameters:parameters error:errorRef]; + if (!requestURL) { + return nil; + } + + NSMutableDictionary *queryParameters = [[FBSDKUtility dictionaryWithQueryString:requestURL.query] mutableCopy]; + queryParameters[@"ios_bundle_id"] = [[NSBundle mainBundle] bundleIdentifier]; + NSURL *redirectURL = [self _redirectURLWithActionID:nil methodName:methodName error:errorRef]; + if (!redirectURL) { + return nil; + } + queryParameters[@"redirect_url"] = redirectURL; + + requestURL = [self _requestURLForDialogConfiguration:dialogConfiguration error:errorRef]; + if (!requestURL) { + return nil; + } + return [FBSDKInternalUtility URLWithScheme:requestURL.scheme + host:requestURL.host + path:requestURL.path + queryParameters:queryParameters + error:errorRef]; +} + +- (NSDictionary *)responseParametersForActionID:(NSString *)actionID + queryParameters:(NSDictionary *)queryParameters + cancelled:(BOOL *)cancelledRef + error:(NSError *__autoreleasing *)errorRef +{ + return [_nativeProtocol responseParametersForActionID:actionID + queryParameters:queryParameters + cancelled:cancelledRef + error:errorRef]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h new file mode 100644 index 0000000..6fd6170 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h @@ -0,0 +1,63 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKCrypto : NSObject + +/*! + @abstract Generate numOfBytes random data. + @discussion This calls the system-provided function SecRandomCopyBytes, based on /dev/random. + */ ++ (NSData *)randomBytes:(NSUInteger)numOfBytes; + +/** + * Generate numOfBytes random data, base64-encoded. + * This calls the system-provided function SecRandomCopyBytes, based on /dev/random. + */ ++ (NSString *)randomString:(NSUInteger)numOfBytes; + +/*! + @abstract Generate a fresh master key using SecRandomCopyBytes, the result is encoded in base64/. + */ ++ (NSString *)makeMasterKey; + +/*! + @abstract Initialize with a base64-encoded master key. + @discussion This key and the current derivation function will be used to generate the encryption key and the mac key. + */ +- (instancetype)initWithMasterKey:(NSString *)masterKey; + +/*! + @abstract Initialize with base64-encoded encryption key and mac key. + */ +- (instancetype)initWithEncryptionKey:(NSString *)encryptionKey macKey:(NSString *)macKey; + +/*! + @abstract Encrypt plainText and return the base64 encoded result. + @discussion MAC computation involves additionalDataToSign. + */ +- (NSString *)encrypt:(NSData *)plainText additionalDataToSign:(NSData *)additionalDataToSign; + +/*! + @abstract Decrypt base64EncodedCipherText. + @discussion MAC computation involves additionalSignedData. + */ +- (NSData *)decrypt:(NSString *)base64EncodedCipherText additionalSignedData:(NSData *)additionalSignedData; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m new file mode 100644 index 0000000..9c2a66a --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m @@ -0,0 +1,287 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKCrypto.h" + +#import +#import +#import + +#import "FBSDKBase64.h" +#import "FBSDKDynamicFrameworkLoader.h" + +static const uint8_t kFBSDK_CRYPTO_CURRENT_VERSION = 1; +static const uint8_t kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH = 16; + +FBSDK_STATIC_INLINE void FBSDKCryptoWriteIntBigEndian(uint8_t *buffer, uint32_t value) +{ + buffer[3] = (uint8_t)(value & 0xff); + buffer[2] = (uint8_t)((value >> 8) & 0xff); + buffer[1] = (uint8_t)((value >> 16) & 0xff); + buffer[0] = (uint8_t)((value >> 24) & 0xff); +} + +FBSDK_STATIC_INLINE void FBSDKCryptoBlankData(NSData *data) +{ + if (!data) { + return; + } + bzero((void *) [data bytes], [data length]); +} + +// Note: the following simple derivation function is NOT suitable for passwords or weak keys +FBSDK_STATIC_INLINE NSData *FBSDKCryptoMakeSubKey(uint8_t *key, size_t len, uint32_t idx) +{ + if (!key || len < 10) { + return nil; + } + + size_t macBufferLength = 4; + uint8_t macBuffer[4]; + FBSDKCryptoWriteIntBigEndian(macBuffer, idx); + + uint8_t *result = malloc(CC_SHA256_DIGEST_LENGTH); + if (!result) { + return nil; + } + + CCHmac(kCCHmacAlgSHA256, key, len, macBuffer, macBufferLength, result); + + return [NSData dataWithBytesNoCopy:result length:CC_SHA256_DIGEST_LENGTH]; +} + +@implementation FBSDKCrypto +{ + NSData *_encryptionKeyData; + NSData *_macKeyData; +} + +#pragma mark - Class Methods + ++ (NSString *)makeMasterKey +{ + NSData *masterKeyData = [FBSDKCrypto randomBytes:kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH + 1]; + + // force the first byte to be the crypto version + uint8_t *first = (uint8_t *) [masterKeyData bytes]; + *first = kFBSDK_CRYPTO_CURRENT_VERSION; + + NSString *masterKey = [FBSDKBase64 encodeData:masterKeyData]; + FBSDKCryptoBlankData(masterKeyData); + return masterKey; +} + ++ (NSData *)randomBytes:(NSUInteger)numOfBytes +{ + uint8_t *buffer = malloc(numOfBytes); + int result = fbsdkdfl_SecRandomCopyBytes([FBSDKDynamicFrameworkLoader loadkSecRandomDefault], numOfBytes, buffer); + if (result != 0) { + free(buffer); + return nil; + } + return [NSData dataWithBytesNoCopy:buffer length:numOfBytes]; +} + ++ (NSString *)randomString:(NSUInteger)numOfBytes +{ + NSData *randomStringData = [FBSDKCrypto randomBytes:numOfBytes]; + NSString *randomString = [FBSDKBase64 encodeData:randomStringData]; + FBSDKCryptoBlankData(randomStringData); + return randomString; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithMasterKey:(NSString *)masterKey +{ + if ((self = [super init])) { + NSData *masterKeyData = [FBSDKBase64 decodeAsData:masterKey]; + NSUInteger len = [masterKeyData length]; + uint8_t *first = (uint8_t *) [masterKeyData bytes]; + + if (len == 0 || first == nil || *first != kFBSDK_CRYPTO_CURRENT_VERSION) { + // only one version supported at the moment + return nil; + } + + _encryptionKeyData = FBSDKCryptoMakeSubKey(first+1, len-1, 1); + _macKeyData = FBSDKCryptoMakeSubKey(first+1, len-1, 2); + FBSDKCryptoBlankData(masterKeyData); + return self; + } else { + return nil; + } +} + +- (instancetype)initWithEncryptionKey:(NSString *)encryptionKey macKey:(NSString *)macKey +{ + if ((self = [super init])) { + _macKeyData = [FBSDKBase64 decodeAsData:macKey]; + _encryptionKeyData = [FBSDKBase64 decodeAsData:encryptionKey]; + } + return self; +} + +- (void)dealloc +{ + FBSDKCryptoBlankData(_encryptionKeyData); + FBSDKCryptoBlankData(_macKeyData); +} + +#pragma mark - Public Methods + +/** + * return base64_encode([VERSION 1 byte] + [MAC 32 bytes] + [IV 16 bytes] + [AES256(Padded Data, multiples of 16)] + */ +- (NSString *)encrypt:(NSData *)plainText additionalDataToSign:(NSData *)additionalDataToSign +{ + NSAssert(plainText.length <= INT_MAX, @""); + int plainTextLength = (int)plainText.length; + + uint8_t numPaddingBytes = kCCBlockSizeAES128 - (plainText.length % kCCBlockSizeAES128); // Pad 1 .. 16 bytes + int cipherDataLength = plainTextLength + numPaddingBytes; + size_t bufferSize = 1 + CC_SHA256_DIGEST_LENGTH + kCCBlockSizeAES128 + cipherDataLength; + int offsetMAC = 1; + int offsetIV = offsetMAC + CC_SHA256_DIGEST_LENGTH; + int offsetCipherData = offsetIV + kCCBlockSizeAES128; + + uint8_t *buffer = calloc(bufferSize, sizeof(uint8_t)); + buffer[0] = kFBSDK_CRYPTO_CURRENT_VERSION; // First byte is the version number + NSData *IV = [[self class] randomBytes:kCCBlockSizeAES128]; + memcpy(buffer + offsetIV, IV.bytes, IV.length); + + memcpy(buffer + offsetCipherData, plainText.bytes, plainTextLength); // Copy input in + fbsdkdfl_SecRandomCopyBytes([FBSDKDynamicFrameworkLoader loadkSecRandomDefault], + numPaddingBytes, + buffer + offsetCipherData + plainTextLength); // Random pad + buffer[offsetCipherData + cipherDataLength - 1] = numPaddingBytes; // Record the number of padded bytes at the end + + size_t numOutputBytes = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0, + _encryptionKeyData.bytes, kCCKeySizeAES256, + IV.bytes, + buffer + offsetCipherData, cipherDataLength, + buffer + offsetCipherData, cipherDataLength, + &numOutputBytes); + + NSData *mac = [self _macForIV:IV + cipherData:[NSData dataWithBytesNoCopy:buffer + offsetCipherData length:cipherDataLength freeWhenDone:NO] + additionalDataToSign:additionalDataToSign]; + memcpy(buffer + offsetMAC, mac.bytes, CC_SHA256_DIGEST_LENGTH); + + if (cryptStatus == kCCSuccess) { + return [FBSDKBase64 encodeData:[NSData dataWithBytesNoCopy:buffer length:bufferSize]]; + } + free(buffer); + return nil; +} + +- (NSData *)decrypt:(NSString *)base64EncodedCipherText additionalSignedData:(NSData *)additionalSignedData +{ + NSData *cipherText = [FBSDKBase64 decodeAsData:base64EncodedCipherText]; + NSAssert(cipherText.length <= INT_MAX, @""); + int cipherTextLength = (int)cipherText.length; + + if (!cipherText || cipherTextLength < 1 + CC_SHA256_DIGEST_LENGTH + kCCBlockSizeAES128) { + return nil; + } + int cipherDataLength = cipherTextLength - (1 + CC_SHA256_DIGEST_LENGTH + kCCBlockSizeAES128); + if (cipherDataLength % kCCBlockSizeAES128 != 0) { + return nil; + } + uint8_t *buffer = (uint8_t *)cipherText.bytes; + + int offsetMAC = 1; + int offsetIV = offsetMAC + CC_SHA256_DIGEST_LENGTH; + int offsetCipherData = offsetIV + kCCBlockSizeAES128; + + if (buffer[0] != kFBSDK_CRYPTO_CURRENT_VERSION) { + return nil; // Version does not match + } + + NSData *IV = [NSData dataWithBytesNoCopy:buffer + offsetIV length:kCCBlockSizeAES128 freeWhenDone:NO]; + NSData *cipherData = [NSData dataWithBytesNoCopy:buffer + offsetCipherData length:cipherDataLength freeWhenDone:NO]; + NSData *mac = [self _macForIV:IV cipherData:cipherData additionalDataToSign:additionalSignedData]; + NSData *macFromStream = [NSData dataWithBytesNoCopy:buffer + offsetMAC length:CC_SHA256_DIGEST_LENGTH freeWhenDone:NO]; + if (![mac isEqualToData:macFromStream]) { + return nil; // MAC does not match + } + + + uint8_t *outputBuffer = malloc(cipherDataLength); + size_t numOutputBytes = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, + _encryptionKeyData.bytes, kCCKeySizeAES256, + IV.bytes, + buffer + offsetCipherData, cipherDataLength, + outputBuffer, cipherDataLength, + &numOutputBytes); + if (cryptStatus == kCCSuccess) { + int numPaddingBytes = outputBuffer[cipherDataLength - 1]; + if (!(numPaddingBytes >= 1 && numPaddingBytes <= kCCBlockSizeAES128)) { + numPaddingBytes = 0; + } + return [NSData dataWithBytesNoCopy:outputBuffer length:cipherDataLength - numPaddingBytes]; + } + free(outputBuffer); + return nil; +} + +#pragma mark - Helper Methods + +/** + * + * [IV 16 bytes] . [length of ciphertext 4 bytes] . [ciphertext] . [length of additionalDataToSign, 4 bytes] . [additionalDataToSign]) + * length is written in big-endian + */ +- (NSData *)_macForIV:(NSData *)IV cipherData:(NSData *)cipherData additionalDataToSign:(NSData *)additionalDataToSign +{ + NSAssert(cipherData.length <= INT_MAX, @""); + int cipherDataLength = (int)cipherData.length; + + NSAssert(additionalDataToSign.length <= INT_MAX, @""); + int additionalDataToSignLength = (int)additionalDataToSign.length; + + size_t macBufferLength = kCCBlockSizeAES128 + 4 + cipherData.length + 4 + additionalDataToSign.length; + uint8_t *macBuffer = malloc(macBufferLength); + int offsetIV = 0; + int offsetCipherTextLength = offsetIV + kCCBlockSizeAES128; + int offsetCipherText = offsetCipherTextLength + 4; + + int offsetAdditionalDataLength = offsetCipherText + cipherDataLength; + int offsetAdditionalData = offsetAdditionalDataLength + 4; + + // [IV 16 bytes] + memcpy(macBuffer + offsetIV, IV.bytes, kCCBlockSizeAES128); + // [length of ciphertext 4 bytes] + FBSDKCryptoWriteIntBigEndian(macBuffer + offsetCipherTextLength, cipherDataLength); + // [ciphertext] + memcpy(macBuffer + offsetCipherText, cipherData.bytes, cipherDataLength); + // [length of additionalDataToSign, 4 bytes] + FBSDKCryptoWriteIntBigEndian(macBuffer + offsetAdditionalDataLength, additionalDataToSignLength); + memcpy(macBuffer + offsetAdditionalData, additionalDataToSign.bytes, additionalDataToSignLength); + + uint8_t *result = malloc(CC_SHA256_DIGEST_LENGTH); + + CCHmac(kCCHmacAlgSHA256, _macKeyData.bytes, _macKeyData.length, macBuffer, macBufferLength, result); + free(macBuffer); + + return [NSData dataWithBytesNoCopy:result length:CC_SHA256_DIGEST_LENGTH]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h new file mode 100644 index 0000000..40715b2 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h @@ -0,0 +1,34 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@class FBSDKErrorRecoveryConfiguration; + +@interface FBSDKErrorRecoveryAttempter : NSObject + +// can return nil if configuration is not supported. ++ (instancetype)recoveryAttempterFromConfiguration:(FBSDKErrorRecoveryConfiguration *)configuration; + +@end + +@interface FBSDKErrorRecoveryAttempter (Protected) +- (void)completeRecovery:(BOOL)didRecover delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m new file mode 100644 index 0000000..78b5e87 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m @@ -0,0 +1,56 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKErrorRecoveryAttempter.h" + +#import "_FBSDKTemporaryErrorRecoveryAttempter.h" +#import "FBSDKErrorRecoveryConfiguration.h" + +@implementation FBSDKErrorRecoveryAttempter + ++ (instancetype)recoveryAttempterFromConfiguration:(FBSDKErrorRecoveryConfiguration *)configuration +{ + if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryTransient) { + return [[_FBSDKTemporaryErrorRecoveryAttempter alloc] init]; + } else if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryOther) { + return nil; + } + if ([configuration.recoveryActionName isEqualToString:@"login"]) { + Class loginRecoveryAttmpterClass = NSClassFromString(@"_FBSDKLoginRecoveryAttempter"); + if (loginRecoveryAttmpterClass) { + return [[loginRecoveryAttmpterClass alloc] init]; + } + } + return nil; +} + +- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo +{ + // should be implemented by subclasses. +} +@end + +@implementation FBSDKErrorRecoveryAttempter(Protected) + +- (void)completeRecovery:(BOOL)didRecover delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo +{ + void (*callback)(id, SEL, BOOL, void *) = (void *)[delegate methodForSelector:didRecoverSelector]; + (*callback)(delegate, didRecoverSelector, didRecover, contextInfo); +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h new file mode 100644 index 0000000..21ad040 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h @@ -0,0 +1,23 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKErrorRecoveryAttempter.h" + +@interface _FBSDKTemporaryErrorRecoveryAttempter : FBSDKErrorRecoveryAttempter + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m new file mode 100644 index 0000000..bb555aa --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m @@ -0,0 +1,28 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "_FBSDKTemporaryErrorRecoveryAttempter.h" + +@implementation _FBSDKTemporaryErrorRecoveryAttempter + +- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo +{ + [super completeRecovery:YES delegate:delegate didRecoverSelector:didRecoverSelector contextInfo:contextInfo]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h new file mode 100644 index 0000000..479d79a --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h @@ -0,0 +1,51 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import + +#import "BridgeAPI/FBSDKBridgeAPIRequest.h" +#import "BridgeAPI/FBSDKBridgeAPIResponse.h" +#import "BridgeAPI/FBSDKURLOpening.h" +#import "FBSDKContainerViewController.h" + +FBSDK_EXTERN NSString *const FBSDKApplicationDidBecomeActiveNotification; + +@class FBSDKApplicationCall; + +typedef void(^FBSDKBridgeAPICallbackBlock)(FBSDKBridgeAPIResponse *response); + +@interface FBSDKApplicationDelegate () + +- (void)openBridgeAPIRequest:(FBSDKBridgeAPIRequest *)request + useSafariViewController:(BOOL)useSafariViewController + fromViewController:(UIViewController *)fromViewController + completionBlock:(FBSDKBridgeAPICallbackBlock)completionBlock; + +- (void)openURLWithSafariViewController:(NSURL *)url + sender:(id)sender + fromViewController:(UIViewController *)fromViewController + handler:(void(^)(BOOL))handler; + +- (void)openURL:(NSURL *)url sender:(id)sender handler:(void(^)(BOOL))handler; + +@property (nonatomic, readonly, getter=isActive) BOOL active; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h new file mode 100644 index 0000000..2c05575 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h @@ -0,0 +1,36 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKAudioResourceLoader : NSObject + ++ (instancetype)sharedLoader; + +- (BOOL)loadSound:(NSError **)error; +- (void)playSound; + +@end + +@interface FBSDKAudioResourceLoader (Subclass) + ++ (NSString *)name; ++ (NSUInteger)version; ++ (NSData *)data; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m new file mode 100644 index 0000000..c7efb3f --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m @@ -0,0 +1,151 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAudioResourceLoader.h" + +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings.h" + +@implementation FBSDKAudioResourceLoader +{ + NSFileManager *_fileManager; + NSURL *_fileURL; + SystemSoundID _systemSoundID; +} + +#pragma mark - Class Methods + ++ (instancetype)sharedLoader +{ + static NSMutableDictionary *_loaderCache = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _loaderCache = [[NSMutableDictionary alloc] init]; + }); + + NSString *name = [self name]; + FBSDKAudioResourceLoader *loader; + @synchronized(_loaderCache) { + loader = _loaderCache[name]; + if (!loader) { + loader = [[self alloc] init]; + NSError *error = nil; + if ([loader loadSound:&error]) { + _loaderCache[name] = loader; + } else { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + formatString:@"%@ error: %@", self, error]; + } + } + } + + return loader; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + _fileManager = [[NSFileManager alloc] init]; + } + return self; +} + +- (void)dealloc +{ + fbsdkdfl_AudioServicesDisposeSystemSoundID(_systemSoundID); +} + +#pragma mark - Public API + +- (BOOL)loadSound:(NSError **)errorRef +{ + NSURL *fileURL = [self _fileURL:errorRef]; + + if (![_fileManager fileExistsAtPath:[fileURL path]]) { + NSData *data = [[self class] data]; + if (![data writeToURL:fileURL options:NSDataWritingAtomic error:errorRef]) { + return NO; + } + } + + OSStatus status = fbsdkdfl_AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &_systemSoundID); + return (status == kAudioServicesNoError); +} + +- (void)playSound +{ + if ((_systemSoundID == 0) && ![self loadSound:NULL]) { + return; + } + fbsdkdfl_AudioServicesPlaySystemSound(_systemSoundID); +} + +#pragma mark - Helper Methods + +- (NSURL *)_fileURL:(NSError **)errorRef +{ + if (_fileURL) { + return _fileURL; + } + + NSURL *baseURL = [_fileManager URLForDirectory:NSCachesDirectory + inDomain:NSUserDomainMask + appropriateForURL:nil + create:YES + error:errorRef]; + if (!baseURL) { + return nil; + } + + NSURL *directoryURL = [baseURL URLByAppendingPathComponent:@"fb_audio" isDirectory:YES]; + NSURL *versionURL = [directoryURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%lu", (unsigned long)[[self class] version]] + isDirectory:YES]; + if (![_fileManager createDirectoryAtURL:versionURL withIntermediateDirectories:YES attributes:nil error:errorRef]) { + return nil; + } + + _fileURL = [[versionURL URLByAppendingPathComponent:[[self class] name]] copy]; + + return _fileURL; +} + +@end + +@implementation FBSDKAudioResourceLoader (Subclass) + +#pragma mark - Subclass Methods + ++ (NSString *)name +{ + return nil; +} + ++ (NSUInteger)version +{ + return 0; +} + ++ (NSData *)data +{ + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h new file mode 100644 index 0000000..5feed4f --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKContainerViewController; + +@protocol FBSDKContainerViewControllerDelegate + +- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated; + +@end + +@interface FBSDKContainerViewController : UIViewController + +@property (nonatomic, weak) id delegate; + +- (void)displayChildController:(UIViewController *)childController; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m new file mode 100644 index 0000000..e1c2e6d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m @@ -0,0 +1,78 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKContainerViewController.h" + +@implementation FBSDKContainerViewController + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + if ([self.delegate respondsToSelector:@selector(viewControllerDidDisappear:animated:)]) { + [self.delegate viewControllerDidDisappear:self animated:animated]; + } +} + +- (void)displayChildController:(UIViewController *)childController +{ + [self addChildViewController:childController]; + UIView *view = self.view; + UIView *childView = childController.view; + childView.translatesAutoresizingMaskIntoConstraints = NO; + childView.frame = view.frame; + [view addSubview:childView]; + + [view addConstraints: + @[ + [NSLayoutConstraint constraintWithItem:childView + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeTop + multiplier:1.0 + constant:0.0], + + [NSLayoutConstraint constraintWithItem:childView + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeBottom + multiplier:1.0 + constant:0.0], + + [NSLayoutConstraint constraintWithItem:childView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeLeading + multiplier:1.0 + constant:0.0], + + [NSLayoutConstraint constraintWithItem:childView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeTrailing + multiplier:1.0 + constant:0.0], + ]]; + + [childController didMoveToParentViewController:self]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h new file mode 100644 index 0000000..1d1ce6b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h @@ -0,0 +1,68 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "AppEvents/FBSDKAppEvents+Internal.h" +#import "AppEvents/FBSDKAppEventsState.h" +#import "AppEvents/FBSDKAppEventsStateManager.h" +#import "AppEvents/FBSDKAppEventsUtility.h" +#import "AppEvents/FBSDKTimeSpentData.h" +#import "Base64/FBSDKBase64.h" +#import "BridgeAPI/FBSDKBridgeAPIProtocol.h" +#import "BridgeAPI/FBSDKBridgeAPIProtocolType.h" +#import "BridgeAPI/FBSDKBridgeAPIRequest.h" +#import "BridgeAPI/FBSDKBridgeAPIResponse.h" +#import "BridgeAPI/FBSDKURLOpening.h" +#import "Cryptography/FBSDKCrypto.h" +#import "ErrorRecovery/FBSDKErrorRecoveryAttempter.h" +#import "FBSDKApplicationDelegate+Internal.h" +#import "FBSDKAudioResourceLoader.h" +#import "FBSDKContainerViewController.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKError.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKMath.h" +#import "FBSDKMonotonicTime.h" +#import "FBSDKSystemAccountStoreAdapter.h" +#import "FBSDKTriStateBOOL.h" +#import "FBSDKTypeUtility.h" +#import "Network/FBSDKGraphRequest+Internal.h" +#import "Network/FBSDKGraphRequestConnection+Internal.h" +#import "Network/FBSDKGraphRequestMetadata.h" +#import "ServerConfiguration/FBSDKDialogConfiguration.h" +#import "ServerConfiguration/FBSDKServerConfiguration+Internal.h" +#import "ServerConfiguration/FBSDKServerConfiguration.h" +#import "ServerConfiguration/FBSDKServerConfigurationManager+Internal.h" +#import "ServerConfiguration/FBSDKServerConfigurationManager.h" +#import "TokenCaching/FBSDKAccessTokenCache.h" +#import "TokenCaching/FBSDKAccessTokenCaching.h" +#import "TokenCaching/FBSDKKeychainStore.h" +#import "TokenCaching/FBSDKKeychainStoreViaBundleID.h" +#import "UI/FBSDKButton+Subclass.h" +#import "UI/FBSDKCloseIcon.h" +#import "UI/FBSDKColor.h" +#import "UI/FBSDKIcon.h" +#import "UI/FBSDKLogo.h" +#import "UI/FBSDKMaleSilhouetteIcon.h" +#import "UI/FBSDKUIUtility.h" +#import "UI/FBSDKViewImpressionTracker.h" +#import "WebDialog/FBSDKWebDialog.h" diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h new file mode 100644 index 0000000..196d626 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h @@ -0,0 +1,236 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import + +#import + +/*! + @class FBSDKDynamicFrameworkLoader + + @abstract + This class provides a way to load constants and methods from Apple Frameworks in a dynamic + fashion. It allows the SDK to be just dragged into a project without having to specify additional + frameworks to link against. It is an internal class and not to be used by 3rd party developers. + + As new types are needed, they should be added and strongly typed. + */ +@interface FBSDKDynamicFrameworkLoader : NSObject + +#pragma mark - Security Constants + +/*! + @abstract + Load the kSecRandomDefault value from the Security Framework + + @return The kSecRandomDefault value or nil. + */ ++ (SecRandomRef)loadkSecRandomDefault; + +/*! + @abstract + Load the kSecAttrAccessible value from the Security Framework + + @return The kSecAttrAccessible value or nil. + */ ++ (CFTypeRef)loadkSecAttrAccessible; + +/*! + @abstract + Load the kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly value from the Security Framework + + @return The kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly value or nil. + */ ++ (CFTypeRef)loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + +/*! + @abstract + Load the kSecAttrAccount value from the Security Framework + + @return The kSecAttrAccount value or nil. + */ ++ (CFTypeRef)loadkSecAttrAccount; + +/*! + @abstract + Load the kSecAttrService value from the Security Framework + + @return The kSecAttrService value or nil. + */ ++ (CFTypeRef)loadkSecAttrService; + +/*! + @abstract + Load the kSecAttrGeneric value from the Security Framework + + @return The kSecAttrGeneric value or nil. + */ ++ (CFTypeRef)loadkSecAttrGeneric; + +/*! + @abstract + Load the kSecValueData value from the Security Framework + + @return The kSecValueData value or nil. + */ ++ (CFTypeRef)loadkSecValueData; + +/*! + @abstract + Load the kSecClassGenericPassword value from the Security Framework + + @return The kSecClassGenericPassword value or nil. + */ ++ (CFTypeRef)loadkSecClassGenericPassword; + +/*! + @abstract + Load the kSecAttrAccessGroup value from the Security Framework + + @return The kSecAttrAccessGroup value or nil. + */ ++ (CFTypeRef)loadkSecAttrAccessGroup; + +/*! + @abstract + Load the kSecMatchLimitOne value from the Security Framework + + @return The kSecMatchLimitOne value or nil. + */ ++ (CFTypeRef)loadkSecMatchLimitOne; + +/*! + @abstract + Load the kSecMatchLimit value from the Security Framework + + @return The kSecMatchLimit value or nil. + */ ++ (CFTypeRef)loadkSecMatchLimit; + +/*! + @abstract + Load the kSecReturnData value from the Security Framework + + @return The kSecReturnData value or nil. + */ ++ (CFTypeRef)loadkSecReturnData; + +/*! + @abstract + Load the kSecClass value from the Security Framework + + @return The kSecClass value or nil. + */ ++ (CFTypeRef)loadkSecClass; + +@end + +#pragma mark - Security APIs + +// These are local wrappers around the corresponding methods in Security/SecRandom.h +FBSDK_EXTERN int fbsdkdfl_SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes); + +// These are local wrappers around Keychain API +FBSDK_EXTERN OSStatus fbsdkdfl_SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate); +FBSDK_EXTERN OSStatus fbsdkdfl_SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result); +FBSDK_EXTERN OSStatus fbsdkdfl_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result); +FBSDK_EXTERN OSStatus fbsdkdfl_SecItemDelete(CFDictionaryRef query); + +#pragma mark - sqlite3 APIs + +// These are local wrappers around the corresponding sqlite3 method from /usr/include/sqlite3.h +FBSDK_EXTERN SQLITE_API const char *fbsdkdfl_sqlite3_errmsg(sqlite3 *db); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_reset(sqlite3_stmt *pStmt); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_finalize(sqlite3_stmt *pStmt); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *arg, char **errmsg); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_close(sqlite3 *db); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_bind_double(sqlite3_stmt *stmt, int index, double value); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_bind_int(sqlite3_stmt *stmt, int index, int value); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_bind_text(sqlite3_stmt *stmt, int index, const char *value, int n, void(*callback)(void *)); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_step(sqlite3_stmt *stmt); +FBSDK_EXTERN SQLITE_API double fbsdkdfl_sqlite3_column_double(sqlite3_stmt *stmt, int iCol); +FBSDK_EXTERN SQLITE_API int fbsdkdfl_sqlite3_column_int(sqlite3_stmt *stmt, int iCol); +FBSDK_EXTERN SQLITE_API const unsigned char *fbsdkdfl_sqlite3_column_text(sqlite3_stmt *stmt, int iCol); + +#pragma mark - Social Constants + +FBSDK_EXTERN NSString *fbsdkdfl_SLServiceTypeFacebook(void); + +#pragma mark - Social Classes + +FBSDK_EXTERN Class fbsdkdfl_SLComposeViewControllerClass(void); + +#pragma mark - QuartzCore Classes + +FBSDK_EXTERN Class fbsdkdfl_CATransactionClass(void); + +#pragma mark - QuartzCore APIs + +// These are local wrappers around the corresponding transform methods from QuartzCore.framework/CATransform3D.h +FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz); +FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz); +FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DConcat (CATransform3D a, CATransform3D b); + +FBSDK_EXTERN const CATransform3D fbsdkdfl_CATransform3DIdentity; + +#pragma mark - AudioToolbox APIs + +// These are local wrappers around the corresponding methods in AudioToolbox/AudioToolbox.h +FBSDK_EXTERN OSStatus fbsdkdfl_AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID); +FBSDK_EXTERN OSStatus fbsdkdfl_AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID); +FBSDK_EXTERN void fbsdkdfl_AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID); + +#pragma mark - AdSupport Classes + +FBSDK_EXTERN Class fbsdkdfl_ASIdentifierManagerClass(void); + +#pragma mark - SafariServices Classes + +FBSDK_EXTERN Class fbsdkdfl_SFSafariViewControllerClass(void); + +#pragma mark - Accounts Constants + +FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAppIdKey(void); +FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceEveryone(void); +FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceFriends(void); +FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceKey(void); +FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceOnlyMe(void); +FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookPermissionsKey(void); + +#pragma mark - Accounts Classes + +FBSDK_EXTERN Class fbsdkdfl_ACAccountStoreClass(void); + +#pragma mark - StoreKit classes + +FBSDK_EXTERN Class fbsdkdfl_SKPaymentQueueClass(void); +FBSDK_EXTERN Class fbsdkdfl_SKProductsRequestClass(void); + +#pragma mark - AssetsLibrary Classes + +FBSDK_EXTERN Class fbsdkdfl_ALAssetsLibraryClass(void); + +#pragma mark - CoreTelephony Classes + +FBSDK_EXTERN Class fbsdkdfl_CTTelephonyNetworkInfoClass(void); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.m new file mode 100644 index 0000000..1f01dfc --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.m @@ -0,0 +1,556 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKDynamicFrameworkLoader.h" + +#import + +#import +#import +#import + +#import "FBSDKLogger.h" +#import "FBSDKSettings.h" + +static NSString *const g_frameworkPathTemplate = @"/System/Library/Frameworks/%@.framework/%@"; +static NSString *const g_sqlitePath = @"/usr/lib/libsqlite3.dylib"; + +#pragma mark - Library and Symbol Loading + +struct FBSDKDFLLoadSymbolContext +{ + void *(*library)(void); // function to retrieve the library handle (it's a function instead of void * so it can be staticlly bound) + const char *name; // name of the symbol to retrieve + void **address; // [out] address of the symbol in the process address space +}; + +// Retrieves the handle for a library for framework. The paths for each are constructed +// differently so the loading function passed to dispatch_once() calls this. +static void *fbsdkdfl_load_library_once(const char *path) +{ + void *handle = dlopen(path, RTLD_LAZY); + if (handle) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational formatString:@"Dynamically loaded library at %s", path]; + } else { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational formatString:@"Failed to load library at %s", path]; + } + return handle; +} + +// Constructs the path for a system framework with the given name and returns the handle for dlsym +static void *fbsdkdfl_load_framework_once(NSString *framework) +{ + NSString *path = [NSString stringWithFormat:g_frameworkPathTemplate, framework, framework]; + return fbsdkdfl_load_library_once([path fileSystemRepresentation]); +} + +// Implements the callback for dispatch_once() that loads the handle for specified framework name +#define _fbsdkdfl_load_framework_once_impl_(FRAMEWORK) \ + static void fbsdkdfl_load_##FRAMEWORK##_once(void *context) { \ + *(void **)context = fbsdkdfl_load_framework_once(@#FRAMEWORK); \ + } + +// Implements the framework/library retrieval function for the given name. +// It calls the loading function once and caches the handle in a local static variable +#define _fbsdkdfl_handle_get_impl_(LIBRARY) \ + static void *fbsdkdfl_handle_get_##LIBRARY(void) { \ + static void *LIBRARY##_handle; \ + static dispatch_once_t LIBRARY##_once; \ + dispatch_once_f(&LIBRARY##_once, &LIBRARY##_handle, &fbsdkdfl_load_##LIBRARY##_once); \ + return LIBRARY##_handle;\ + } + +// Callback from dispatch_once() to load a specific symbol +static void fbsdkdfl_load_symbol_once(void *context) +{ + struct FBSDKDFLLoadSymbolContext *ctx = context; + *ctx->address = dlsym(ctx->library(), ctx->name); +} + +// The boilerplate code for loading a symbol from a given library once and caching it in a static local +#define _fbsdkdfl_symbol_get(LIBRARY, PREFIX, SYMBOL, TYPE, VARIABLE_NAME) \ + static TYPE VARIABLE_NAME; \ + static dispatch_once_t SYMBOL##_once; \ + static struct FBSDKDFLLoadSymbolContext ctx = { .library = &fbsdkdfl_handle_get_##LIBRARY, .name = PREFIX #SYMBOL, .address = (void **)&VARIABLE_NAME }; \ + dispatch_once_f(&SYMBOL##_once, &ctx, &fbsdkdfl_load_symbol_once) + +#define _fbsdkdfl_symbol_get_c(LIBRARY, SYMBOL) _fbsdkdfl_symbol_get(LIBRARY, "OBJC_CLASS_$_", SYMBOL, Class, c) // convenience symbol retrieval macro for getting an Objective-C class symbol and storing it in the local static c +#define _fbsdkdfl_symbol_get_f(LIBRARY, SYMBOL) _fbsdkdfl_symbol_get(LIBRARY, "", SYMBOL, SYMBOL##_type, f) // convenience symbol retrieval macro for getting a function pointer and storing it in the local static f +#define _fbsdkdfl_symbol_get_k(LIBRARY, SYMBOL, TYPE) _fbsdkdfl_symbol_get(LIBRARY, "", SYMBOL, TYPE, k) // convenience symbol retrieval macro for getting a pointer to a named variable and storing it in the local static k + +// convenience macro for verifying a pointer to a named variable was successfully loaded and returns the value +#define _fbsdkdfl_return_k(FRAMEWORK, SYMBOL) \ + NSCAssert(k != NULL, @"Failed to load constant %@ in the %@ framework", @#SYMBOL, @#FRAMEWORK); \ + return *k + +// convenience macro for getting a pointer to a named NSString, verifying it loaded correctly, and returning it +#define _fbsdkdfl_get_and_return_NSString(LIBRARY, SYMBOL) \ + _fbsdkdfl_symbol_get_k(LIBRARY, SYMBOL, NSString **); \ + NSCAssert([*k isKindOfClass:[NSString class]], @"Loaded symbol %@ is not of type NSString *", @#SYMBOL); \ + _fbsdkdfl_return_k(LIBRARY, SYMBOL) + +#pragma mark - Security Framework + +_fbsdkdfl_load_framework_once_impl_(Security) +_fbsdkdfl_handle_get_impl_(Security) + +#pragma mark - Security Constants + +@implementation FBSDKDynamicFrameworkLoader + +#define _fbsdkdfl_Security_get_k(SYMBOL) _fbsdkdfl_symbol_get_k(Security, SYMBOL, CFTypeRef *) + +#define _fbsdkdfl_Security_get_and_return_k(SYMBOL) \ + _fbsdkdfl_Security_get_k(SYMBOL); \ + _fbsdkdfl_return_k(Security, SYMBOL) + ++ (SecRandomRef)loadkSecRandomDefault +{ + _fbsdkdfl_symbol_get_k(Security, kSecRandomDefault, SecRandomRef *); + _fbsdkdfl_return_k(Security, kSecRandomDefault); +} + ++ (CFTypeRef)loadkSecAttrAccessible +{ + _fbsdkdfl_Security_get_and_return_k(kSecAttrAccessible); +} + ++ (CFTypeRef)loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly +{ + _fbsdkdfl_Security_get_and_return_k(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly); +} + ++ (CFTypeRef)loadkSecAttrAccount +{ + _fbsdkdfl_Security_get_and_return_k(kSecAttrAccount); +} + ++ (CFTypeRef)loadkSecAttrService +{ + _fbsdkdfl_Security_get_and_return_k(kSecAttrService); +} + ++ (CFTypeRef)loadkSecAttrGeneric +{ + _fbsdkdfl_Security_get_and_return_k(kSecAttrGeneric); +} + ++ (CFTypeRef)loadkSecValueData +{ + _fbsdkdfl_Security_get_and_return_k(kSecValueData); +} + ++ (CFTypeRef)loadkSecClassGenericPassword +{ + _fbsdkdfl_Security_get_and_return_k(kSecClassGenericPassword); +} + ++ (CFTypeRef)loadkSecAttrAccessGroup +{ + _fbsdkdfl_Security_get_and_return_k(kSecAttrAccessGroup); +} + ++ (CFTypeRef)loadkSecMatchLimitOne +{ + _fbsdkdfl_Security_get_and_return_k(kSecMatchLimitOne); +} + ++ (CFTypeRef)loadkSecMatchLimit +{ + _fbsdkdfl_Security_get_and_return_k(kSecMatchLimit); +} + ++ (CFTypeRef)loadkSecReturnData +{ + _fbsdkdfl_Security_get_and_return_k(kSecReturnData); +} + ++ (CFTypeRef)loadkSecClass +{ + _fbsdkdfl_Security_get_and_return_k(kSecClass); +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +@end + +#pragma mark - Security APIs + +#define _fbsdkdfl_Security_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(Security, SYMBOL) + +typedef int (*SecRandomCopyBytes_type)(SecRandomRef, size_t, uint8_t *); +typedef OSStatus (*SecItemUpdate_type)(CFDictionaryRef, CFDictionaryRef); +typedef OSStatus (*SecItemAdd_type)(CFDictionaryRef, CFTypeRef); +typedef OSStatus (*SecItemCopyMatching_type)(CFDictionaryRef, CFTypeRef); +typedef OSStatus (*SecItemDelete_type)(CFDictionaryRef); + +int fbsdkdfl_SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes) +{ + _fbsdkdfl_Security_get_f(SecRandomCopyBytes); + return f(rnd, count, bytes); +} + +OSStatus fbsdkdfl_SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate) +{ + _fbsdkdfl_Security_get_f(SecItemUpdate); + return f(query, attributesToUpdate); +} + +OSStatus fbsdkdfl_SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result) +{ + _fbsdkdfl_Security_get_f(SecItemAdd); + return f(attributes, result); +} + +OSStatus fbsdkdfl_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result) +{ + _fbsdkdfl_Security_get_f(SecItemCopyMatching); + return f(query, result); +} + +OSStatus fbsdkdfl_SecItemDelete(CFDictionaryRef query) +{ + _fbsdkdfl_Security_get_f(SecItemDelete); + return f(query); +} + +#pragma mark - sqlite3 APIs + +// sqlite3 is a dynamic library (not a framework) so its path is constructed differently +// than the way employed by the framework macros. +static void fbsdkdfl_load_sqlite3_once(void *context) +{ + *(void **)context = fbsdkdfl_load_library_once([g_sqlitePath fileSystemRepresentation]); +} +_fbsdkdfl_handle_get_impl_(sqlite3) + +#define _fbsdkdfl_sqlite3_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(sqlite3, SYMBOL) + +typedef SQLITE_API const char *(*sqlite3_errmsg_type)(sqlite3 *); +typedef SQLITE_API int (*sqlite3_prepare_v2_type)(sqlite3 *, const char *, int, sqlite3_stmt **, const char **); +typedef SQLITE_API int (*sqlite3_reset_type)(sqlite3_stmt *); +typedef SQLITE_API int (*sqlite3_finalize_type)(sqlite3_stmt *); +typedef SQLITE_API int (*sqlite3_open_v2_type)(const char *, sqlite3 **, int, const char *); +typedef SQLITE_API int (*sqlite3_exec_type)(sqlite3 *, const char *, int (*)(void *, int, char **, char **), void *, char **); +typedef SQLITE_API int (*sqlite3_close_type)(sqlite3 *); +typedef SQLITE_API int (*sqlite3_bind_double_type)(sqlite3_stmt *, int, double); +typedef SQLITE_API int (*sqlite3_bind_int_type)(sqlite3_stmt *, int, int); +typedef SQLITE_API int (*sqlite3_bind_text_type)(sqlite3_stmt *, int, const char *, int, void(*)(void *)); +typedef SQLITE_API int (*sqlite3_step_type)(sqlite3_stmt *); +typedef SQLITE_API double (*sqlite3_column_double_type)(sqlite3_stmt *, int); +typedef SQLITE_API int (*sqlite3_column_int_type)(sqlite3_stmt *, int); +typedef SQLITE_API const unsigned char *(*sqlite3_column_text_type)(sqlite3_stmt *, int); + +SQLITE_API const char *fbsdkdfl_sqlite3_errmsg(sqlite3 *db) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_errmsg); + return f(db); +} + +SQLITE_API int fbsdkdfl_sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_prepare_v2); + return f(db, zSql, nByte, ppStmt, pzTail); +} + +SQLITE_API int fbsdkdfl_sqlite3_reset(sqlite3_stmt *pStmt) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_reset); + return f(pStmt); +} + +SQLITE_API int fbsdkdfl_sqlite3_finalize(sqlite3_stmt *pStmt) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_finalize); + return f(pStmt); +} + +SQLITE_API int fbsdkdfl_sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_open_v2); + return f(filename, ppDb, flags, zVfs); +} + +SQLITE_API int fbsdkdfl_sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *arg, char **errmsg) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_exec); + return f(db, sql, callback, arg, errmsg); +} + +SQLITE_API int fbsdkdfl_sqlite3_close(sqlite3 *db) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_close); + return f(db); +} + +SQLITE_API int fbsdkdfl_sqlite3_bind_double(sqlite3_stmt *stmt, int index , double value) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_bind_double); + return f(stmt, index, value); +} + +SQLITE_API int fbsdkdfl_sqlite3_bind_int(sqlite3_stmt *stmt, int index, int value) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_bind_int); + return f(stmt, index, value); +} + +SQLITE_API int fbsdkdfl_sqlite3_bind_text(sqlite3_stmt *stmt, int index, const char *value, int n, void(*callback)(void *)) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_bind_text); + return f(stmt, index, value, n, callback); +} + +SQLITE_API int fbsdkdfl_sqlite3_step(sqlite3_stmt *stmt) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_step); + return f(stmt); +} + +SQLITE_API double fbsdkdfl_sqlite3_column_double(sqlite3_stmt *stmt, int iCol) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_column_double); + return f(stmt, iCol); +} + +SQLITE_API int fbsdkdfl_sqlite3_column_int(sqlite3_stmt *stmt, int iCol) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_column_int); + return f(stmt, iCol); +} + +SQLITE_API const unsigned char *fbsdkdfl_sqlite3_column_text(sqlite3_stmt *stmt, int iCol) +{ + _fbsdkdfl_sqlite3_get_f(sqlite3_column_text); + return f(stmt, iCol); +} + +#pragma mark - Social Constants + +_fbsdkdfl_load_framework_once_impl_(Social) +_fbsdkdfl_handle_get_impl_(Social) + +#define _fbsdkdfl_Social_get_and_return_constant(SYMBOL) _fbsdkdfl_get_and_return_NSString(Social, SYMBOL) + +NSString *fbsdkdfl_SLServiceTypeFacebook(void) +{ + _fbsdkdfl_Social_get_and_return_constant(SLServiceTypeFacebook); +} + +#pragma mark - Social Classes + +#define _fbsdkdfl_Social_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(Social, SYMBOL) + +Class fbsdkdfl_SLComposeViewControllerClass(void) +{ + _fbsdkdfl_Social_get_c(SLComposeViewController); + return c; +} + +#pragma mark - QuartzCore Classes + +_fbsdkdfl_load_framework_once_impl_(QuartzCore) +_fbsdkdfl_handle_get_impl_(QuartzCore) + +#define _fbsdkdfl_QuartzCore_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(QuartzCore, SYMBOL); + +Class fbsdkdfl_CATransactionClass(void) +{ + _fbsdkdfl_QuartzCore_get_c(CATransaction); + return c; +} + +#pragma mark - QuartzCore APIs + +#define _fbsdkdfl_QuartzCore_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(QuartzCore, SYMBOL) + +typedef CATransform3D (*CATransform3DMakeScale_type)(CGFloat, CGFloat, CGFloat); +typedef CATransform3D (*CATransform3DMakeTranslation_type)(CGFloat, CGFloat, CGFloat); +typedef CATransform3D (*CATransform3DConcat_type)(CATransform3D, CATransform3D); + +const CATransform3D fbsdkdfl_CATransform3DIdentity = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; + +CATransform3D fbsdkdfl_CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz) +{ + _fbsdkdfl_QuartzCore_get_f(CATransform3DMakeScale); + return f(sx, sy, sz); +} + +CATransform3D fbsdkdfl_CATransform3DMakeTranslation(CGFloat tx, CGFloat ty, CGFloat tz) +{ + _fbsdkdfl_QuartzCore_get_f(CATransform3DMakeTranslation); + return f(tx, ty, tz); +} + +CATransform3D fbsdkdfl_CATransform3DConcat(CATransform3D a, CATransform3D b) +{ + _fbsdkdfl_QuartzCore_get_f(CATransform3DConcat); + return f(a, b); +} + +#pragma mark - AudioToolbox APIs + +_fbsdkdfl_load_framework_once_impl_(AudioToolbox) +_fbsdkdfl_handle_get_impl_(AudioToolbox) + +#define _fbsdkdfl_AudioToolbox_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(AudioToolbox, SYMBOL) + +typedef OSStatus (*AudioServicesCreateSystemSoundID_type)(CFURLRef, SystemSoundID *); +typedef OSStatus (*AudioServicesDisposeSystemSoundID_type)(SystemSoundID); +typedef void (*AudioServicesPlaySystemSound_type)(SystemSoundID); + +OSStatus fbsdkdfl_AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID) +{ + _fbsdkdfl_AudioToolbox_get_f(AudioServicesCreateSystemSoundID); + return f(inFileURL, outSystemSoundID); +} + +OSStatus fbsdkdfl_AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID) +{ + _fbsdkdfl_AudioToolbox_get_f(AudioServicesDisposeSystemSoundID); + return f(inSystemSoundID); +} + +void fbsdkdfl_AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID) +{ + _fbsdkdfl_AudioToolbox_get_f(AudioServicesPlaySystemSound); + return f(inSystemSoundID); +} + +#pragma mark - Ad Support Classes + +_fbsdkdfl_load_framework_once_impl_(AdSupport) +_fbsdkdfl_handle_get_impl_(AdSupport) + +#define _fbsdkdfl_AdSupport_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(AdSupport, SYMBOL); + +Class fbsdkdfl_ASIdentifierManagerClass(void) +{ + _fbsdkdfl_AdSupport_get_c(ASIdentifierManager); + return c; +} + +#pragma mark - Safari Services +_fbsdkdfl_load_framework_once_impl_(SafariServices) +_fbsdkdfl_handle_get_impl_(SafariServices) + +#define _fbsdkdfl_SafariServices_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(SafariServices, SYMBOL); + +Class fbsdkdfl_SFSafariViewControllerClass(void) +{ + _fbsdkdfl_SafariServices_get_c(SFSafariViewController); + return c; +} + +#pragma mark - Accounts Constants + +_fbsdkdfl_load_framework_once_impl_(Accounts) +_fbsdkdfl_handle_get_impl_(Accounts) + +#define _fbsdkdfl_Accounts_get_and_return_NSString(SYMBOL) _fbsdkdfl_get_and_return_NSString(Accounts, SYMBOL) + +NSString *fbsdkdfl_ACFacebookAppIdKey(void) +{ + _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAppIdKey); +} + +NSString *fbsdkdfl_ACFacebookAudienceEveryone(void) +{ + _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceEveryone); +} + +NSString *fbsdkdfl_ACFacebookAudienceFriends(void) +{ + _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceFriends); +} + +NSString *fbsdkdfl_ACFacebookAudienceKey(void) +{ + _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceKey); +} + +NSString *fbsdkdfl_ACFacebookAudienceOnlyMe(void) +{ + _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceOnlyMe); +} + +NSString *fbsdkdfl_ACFacebookPermissionsKey(void) +{ + _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookPermissionsKey); +} + +#pragma mark - Accounts Classes + +#define _fbsdkdfl_Accounts_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(Accounts, SYMBOL); + +Class fbsdkdfl_ACAccountStoreClass(void) +{ + _fbsdkdfl_Accounts_get_c(ACAccountStore); + return c; +} + +#pragma mark - StoreKit Classes + +_fbsdkdfl_load_framework_once_impl_(StoreKit) +_fbsdkdfl_handle_get_impl_(StoreKit) + +#define _fbsdkdfl_StoreKit_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(StoreKit, SYMBOL); + +Class fbsdkdfl_SKPaymentQueueClass(void) +{ + _fbsdkdfl_StoreKit_get_c(SKPaymentQueue); + return c; +} + +Class fbsdkdfl_SKProductsRequestClass(void) +{ + _fbsdkdfl_StoreKit_get_c(SKProductsRequest); + return c; +} + +#pragma mark - AssetsLibrary Classes + +_fbsdkdfl_load_framework_once_impl_(AssetsLibrary) +_fbsdkdfl_handle_get_impl_(AssetsLibrary) + +#define _fbsdkdfl_AssetsLibrary_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(AssetsLibrary, SYMBOL); + +Class fbsdkdfl_ALAssetsLibraryClass(void) +{ + _fbsdkdfl_AssetsLibrary_get_c(ALAssetsLibrary); + return c; +} + +#pragma mark - CoreTelephony Classes + +_fbsdkdfl_load_framework_once_impl_(CoreTelephony) +_fbsdkdfl_handle_get_impl_(CoreTelephony) + +#define _fbsdkdfl_CoreTelephonyLibrary_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(CoreTelephony, SYMBOL); + +Class fbsdkdfl_CTTelephonyNetworkInfoClass(void) +{ + _fbsdkdfl_CoreTelephonyLibrary_get_c(CTTelephonyNetworkInfo); + return c; +} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h new file mode 100644 index 0000000..f37bd86 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h @@ -0,0 +1,56 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKError : NSObject + ++ (NSString *)errorDomain; + ++ (BOOL)errorIsNetworkError:(NSError *)error; + ++ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message; ++ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError; ++ (NSError *)errorWithCode:(NSInteger)code + userInfo:(NSDictionary *)userInfo + message:(NSString *)message + underlyingError:(NSError *)underlyingError; + ++ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message; ++ (NSError *)invalidArgumentErrorWithName:(NSString *)name + value:(id)value + message:(NSString *)message + underlyingError:(NSError *)underlyingError; ++ (NSError *)invalidCollectionErrorWithName:(NSString *)name + collection:(id)collection + item:(id)item + message:(NSString *)message; ++ (NSError *)invalidCollectionErrorWithName:(NSString *)name + collection:(id)collection + item:(id)item + message:(NSString *)message + underlyingError:(NSError *)underlyingError; + ++ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message; ++ (NSError *)requiredArgumentErrorWithName:(NSString *)name + message:(NSString *)message + underlyingError:(NSError *)underlyingError; + ++ (NSError *)unknownErrorWithMessage:(NSString *)message; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m new file mode 100644 index 0000000..0a7b455 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m @@ -0,0 +1,163 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKError.h" + +#import "FBSDKConstants.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKTypeUtility.h" + +@implementation FBSDKError + +#pragma mark - Class Methods + ++ (NSString *)errorDomain +{ + return FBSDKErrorDomain; +} + ++ (BOOL)errorIsNetworkError:(NSError *)error +{ + if (error == nil) { + return NO; + } + + NSError *innerError = error.userInfo[NSUnderlyingErrorKey]; + if ([self errorIsNetworkError:innerError]) { + return YES; + } + + switch (error.code) { + case NSURLErrorTimedOut: + case NSURLErrorCannotFindHost: + case NSURLErrorCannotConnectToHost: + case NSURLErrorNetworkConnectionLost: + case NSURLErrorDNSLookupFailed: + case NSURLErrorNotConnectedToInternet: + case NSURLErrorInternationalRoamingOff: + case NSURLErrorCallIsActive: + case NSURLErrorDataNotAllowed: + return YES; + default: + return NO; + } +} + ++ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message +{ + return [self errorWithCode:code message:message underlyingError:nil]; +} + ++ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError +{ + return [self errorWithCode:code userInfo:nil message:message underlyingError:underlyingError]; +} + ++ (NSError *)errorWithCode:(NSInteger)code + userInfo:(NSDictionary *)userInfo + message:(NSString *)message + underlyingError:(NSError *)underlyingError +{ + NSMutableDictionary *fullUserInfo = [[NSMutableDictionary alloc] initWithDictionary:userInfo]; + [FBSDKInternalUtility dictionary:fullUserInfo setObject:message forKey:FBSDKErrorDeveloperMessageKey]; + [FBSDKInternalUtility dictionary:fullUserInfo setObject:underlyingError forKey:NSUnderlyingErrorKey]; + userInfo = ([fullUserInfo count] ? [fullUserInfo copy] : nil); + return [[NSError alloc] initWithDomain:[self errorDomain] code:code userInfo:userInfo]; +} + ++ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message +{ + return [self invalidArgumentErrorWithName:name value:value message:message underlyingError:nil]; +} + ++ (NSError *)invalidArgumentErrorWithName:(NSString *)name + value:(id)value + message:(NSString *)message + underlyingError:(NSError *)underlyingError +{ + if (!message) { + message = [[NSString alloc] initWithFormat:@"Invalid value for %@: %@", name, value]; + } + NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:value forKey:FBSDKErrorArgumentValueKey]; + return [self errorWithCode:FBSDKInvalidArgumentErrorCode + userInfo:userInfo + message:message + underlyingError:underlyingError]; +} + ++ (NSError *)invalidCollectionErrorWithName:(NSString *)name + collection:(id)collection + item:(id)item + message:(NSString *)message +{ + return [self invalidCollectionErrorWithName:name collection:collection item:item message:message underlyingError:nil]; +} + ++ (NSError *)invalidCollectionErrorWithName:(NSString *)name + collection:(id)collection + item:(id)item + message:(NSString *)message + underlyingError:(NSError *)underlyingError +{ + if (!message) { + message = [[NSString alloc] initWithFormat:@"Invalid item (%@) found in collection for %@: %@", item, name, collection]; + } + NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:item forKey:FBSDKErrorArgumentValueKey]; + [FBSDKInternalUtility dictionary:userInfo setObject:collection forKey:FBSDKErrorArgumentCollectionKey]; + return [self errorWithCode:FBSDKInvalidArgumentErrorCode + userInfo:userInfo + message:message + underlyingError:underlyingError]; +} + ++ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message +{ + return [self requiredArgumentErrorWithName:name message:message underlyingError:nil]; +} + ++ (NSError *)requiredArgumentErrorWithName:(NSString *)name + message:(NSString *)message + underlyingError:(NSError *)underlyingError +{ + if (!message) { + message = [[NSString alloc] initWithFormat:@"Value for %@ is required.", name]; + } + return [self invalidArgumentErrorWithName:name value:nil message:message underlyingError:underlyingError]; +} + ++ (NSError *)unknownErrorWithMessage:(NSString *)message +{ + return [self errorWithCode:FBSDKUnknownErrorCode + userInfo:nil + message:message + underlyingError:nil]; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h new file mode 100644 index 0000000..71e4445 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h @@ -0,0 +1,321 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +#define FBSDK_CANOPENURL_FACEBOOK @"fbauth2" +#define FBSDK_CANOPENURL_MESSENGER @"fb-messenger-api" + +typedef NS_ENUM(int32_t, FBSDKUIKitVersion) +{ + FBSDKUIKitVersion_6_0 = 0x0944, + FBSDKUIKitVersion_6_1 = 0x094C, + FBSDKUIKitVersion_7_0 = 0x0B57, + FBSDKUIKitVersion_7_1 = 0x0B77, + FBSDKUIKitVersion_8_0 = 0x0CF6, +}; + +@interface FBSDKInternalUtility : NSObject + +/*! + @abstract Constructs the scheme for apps that come to the current app through the bridge. + */ ++ (NSString *)appURLScheme; + +/*! + @abstract Constructs an URL for the current app. + @param host The host for the URL. + @param path The path for the URL. + @param queryParameters The query parameters for the URL. This will be converted into a query string. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return The app URL. + */ ++ (NSURL *)appURLWithHost:(NSString *)host + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract Parses an FB url's query params (and potentially fragment) into a dictionary. + @param url The FB url. + @return A dictionary with the key/value pairs. + */ ++ (NSDictionary *)dictionaryFromFBURL:(NSURL *)url; + +/*! + @abstract Adds an object to an array if it is not nil. + @param array The array to add the object to. + @param object The object to add to the array. + */ ++ (void)array:(NSMutableArray *)array addObject:(id)object; + +/*! + @abstract Returns bundle for returning localized strings + @discussion We assume a convention of a bundle named FBSDKStrings.bundle, otherwise we + return the main bundle. +*/ ++ (NSBundle *)bundleForStrings; + +/*! + @abstract Converts simple value types to the string equivelant for serializing to a request query or body. + @param value The value to be converted. + @return The value that may have been converted if able (otherwise the input param). + */ ++ (id)convertRequestValue:(id)value; + +/*! + @abstract Gets the milliseconds since the Unix Epoch. + @discussion Changes in the system clock will affect this value. + @return The number of milliseconds since the Unix Epoch. + */ ++ (unsigned long)currentTimeInMilliseconds; + +/*! + @abstract Sets an object for a key in a dictionary if it is not nil. + @param dictionary The dictionary to set the value for. + @param object The value to set after serializing to JSON. + @param key The key to set the value for. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return NO if an error occurred while serializing the object, otherwise YES. + */ ++ (BOOL)dictionary:(NSMutableDictionary *)dictionary +setJSONStringForObject:(id)object + forKey:(id)key + error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract Sets an object for a key in a dictionary if it is not nil. + @param dictionary The dictionary to set the value for. + @param object The value to set. + @param key The key to set the value for. + */ ++ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id)key; + +/*! + @abstract Constructs a Facebook URL. + @param hostPrefix The prefix for the host, such as 'm', 'graph', etc. + @param path The path for the URL. This may or may not include a version. + @param queryParameters The query parameters for the URL. This will be converted into a query string. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return The Facebook URL. + */ ++ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract Constructs a Facebook URL. + @param hostPrefix The prefix for the host, such as 'm', 'graph', etc. + @param path The path for the URL. This may or may not include a version. + @param queryParameters The query parameters for the URL. This will be converted into a query string. + @param defaultVersion A version to add to the URL if none is found in the path. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return The Facebook URL. + */ ++ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + defaultVersion:(NSString *)defaultVersion + error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract Tests whether the supplied URL is a valid URL for opening in the browser. + @param URL The URL to test. + @return YES if the URL refers to an http or https resource, otherwise NO. + */ ++ (BOOL)isBrowserURL:(NSURL *)URL; + +/*! + @abstract Tests whether the supplied bundle identifier references a Facebook app. + @param bundleIdentifier The bundle identifier to test. + @return YES if the bundle identifier refers to a Facebook app, otherwise NO. + */ ++ (BOOL)isFacebookBundleIdentifier:(NSString *)bundleIdentifier; + +/*! + @abstract Tests whether the operating system is at least the specified version. + @param version The version to test against. + @return YES if the operating system is greater than or equal to the specified version, otherwise NO. + */ ++ (BOOL)isOSRunTimeVersionAtLeast:(NSOperatingSystemVersion)version; + +/*! + @abstract Tests whether the supplied bundle identifier references the Safari app. + @param bundleIdentifier The bundle identifier to test. + @return YES if the bundle identifier refers to the Safari app, otherwise NO. + */ ++ (BOOL)isSafariBundleIdentifier:(NSString *)bundleIdentifier; + +/*! + @abstract Tests whether the UIKit version that the current app was linked to is at least the specified version. + @param version The version to test against. + @return YES if the linked UIKit version is greater than or equal to the specified version, otherwise NO. + */ ++ (BOOL)isUIKitLinkTimeVersionAtLeast:(FBSDKUIKitVersion)version; + +/*! + @abstract Tests whether the UIKit version in the runtime is at least the specified version. + @param version The version to test against. + @return YES if the runtime UIKit version is greater than or equal to the specified version, otherwise NO. + */ ++ (BOOL)isUIKitRunTimeVersionAtLeast:(FBSDKUIKitVersion)version; + +/*! + @abstract Converts an object into a JSON string. + @param object The object to convert to JSON. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @param invalidObjectHandler Handles objects that are invalid, returning a replacement value or nil to ignore. + @return A JSON string or nil if the object cannot be converted to JSON. + */ ++ (NSString *)JSONStringForObject:(id)object + error:(NSError *__autoreleasing *)errorRef + invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler; + +/*! + @abstract Checks equality between 2 objects. + @discussion Checks for pointer equality, nils, isEqual:. + @param object The first object to compare. + @param other The second object to compare. + @result YES if the objects are equal, otherwise NO. + */ ++ (BOOL)object:(id)object isEqualToObject:(id)other; + +/*! + @abstract Converts a JSON string into an object + @param string The JSON string to convert. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return An NSDictionary, NSArray, NSString or NSNumber containing the object representation, or nil if the string + cannot be converted. + */ ++ (id)objectForJSONString:(NSString *)string error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract The version of the operating system on which the process is executing. + */ ++ (NSOperatingSystemVersion)operatingSystemVersion; + +/*! + @abstract Constructs a query string from a dictionary. + @param dictionary The dictionary with key/value pairs for the query string. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @param invalidObjectHandler Handles objects that are invalid, returning a replacement value or nil to ignore. + @result Query string representation of the parameters. + */ ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary + error:(NSError *__autoreleasing *)errorRef + invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler; + +/*! + @abstract Tests whether the orientation should be manually adjusted for views outside of the root view controller. + @discussion With the legacy layout the developer must worry about device orientation when working with views outside of + the window's root view controller and apply the correct rotation transform and/or swap a view's width and height + values. If the application was linked with UIKit on iOS 7 or earlier or the application is running on iOS 7 or earlier + then we need to use the legacy layout code. Otherwise if the application was linked with UIKit on iOS 8 or later and + the application is running on iOS 8 or later, UIKit handles all of the rotation complexity and the origin is always in + the top-left and no rotation transform is necessary. + @return YES if if the orientation must be manually adjusted, otherwise NO. + */ ++ (BOOL)shouldManuallyAdjustOrientation; + +/*! + @abstract Constructs an NSURL. + @param scheme The scheme for the URL. + @param host The host for the URL. + @param path The path for the URL. + @param queryParameters The query parameters for the URL. This will be converted into a query string. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return The URL. + */ ++ (NSURL *)URLWithScheme:(NSString *)scheme + host:(NSString *)host + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef; + +/*! + * @abstract Deletes all the cookies in the NSHTTPCookieStorage for Facebook web dialogs + */ ++ (void)deleteFacebookCookies; + +/*! + @abstract Extracts permissions from a response fetched from me/permissions + @param responseObject the response + @param grantedPermissions the set to add granted permissions to + @param declinedPermissions the set to add decliend permissions to. + */ ++ (void)extractPermissionsFromResponse:(NSDictionary *)responseObject + grantedPermissions:(NSMutableSet *)grantedPermissions + declinedPermissions:(NSMutableSet *)declinedPermissions; + +/*! + @abstract Registers a transient object so that it will not be deallocated until unregistered + @param object The transient object + */ ++ (void)registerTransientObject:(id)object; + +/*! + @abstract Unregisters a transient object that was previously registered with registerTransientObject: + @param object The transient object + */ ++ (void)unregisterTransientObject:(__weak id)object; + +/*! + @abstract validates that the app ID is non-nil, throws an NSException if nil. + */ ++ (void)validateAppID; + +/*! + @abstract validates that the right URL schemes are registered, throws an NSException if not. + */ ++ (void)validateURLSchemes; + +/*! + @abstract Attempts to find the first UIViewController in the view's responder chain. Returns nil if not found. + */ ++ (UIViewController *)viewControllerforView:(UIView*)view; + +/*! + @abstract returns true if the url scheme is registered in the CFBundleURLTypes + */ ++ (BOOL)isRegisteredURLScheme:(NSString *)urlScheme; + +/*! + @abstract returns currently displayed top view controller. + */ ++ (UIViewController *)topMostViewController; + +#pragma mark - FB Apps Installed + ++ (BOOL)isFacebookAppInstalled; ++ (BOOL)isMessengerAppInstalled; ++ (void)checkRegisteredCanOpenURLScheme:(NSString *)urlScheme; ++ (BOOL)isRegisteredCanOpenURLScheme:(NSString *)urlScheme; + +#define FBSDKConditionalLog(condition, loggingBehavior, desc, ...) \ +{ \ + if (!(condition)) { \ + NSString *msg = [NSString stringWithFormat:(desc), ##__VA_ARGS__]; \ + [FBSDKLogger singleShotLogEntry:loggingBehavior logEntry:msg]; \ + } \ +} + +#define FB_BASE_URL @"facebook.com" + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m new file mode 100644 index 0000000..7f0db81 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m @@ -0,0 +1,666 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKInternalUtility.h" + +#import + +#import + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKError.h" +#import "FBSDKMacros.h" +#import "FBSDKSettings.h" +#import "FBSDKUtility.h" + +typedef NS_ENUM(NSUInteger, FBSDKInternalUtilityVersionMask) +{ + FBSDKInternalUtilityMajorVersionMask = 0xFFFF0000, + //FBSDKInternalUtilityMinorVersionMask = 0x0000FF00, // unused + //FBSDKInternalUtilityPatchVersionMask = 0x000000FF, // unused +}; + +typedef NS_ENUM(NSUInteger, FBSDKInternalUtilityVersionShift) +{ + FBSDKInternalUtilityMajorVersionShift = 16, + //FBSDKInternalUtilityMinorVersionShift = 8, // unused + //FBSDKInternalUtilityPatchVersionShift = 0, // unused +}; + +@implementation FBSDKInternalUtility + +#pragma mark - Class Methods + ++ (NSString *)appURLScheme +{ + NSString *appID = ([FBSDKSettings appID] ?: @""); + NSString *suffix = ([FBSDKSettings appURLSchemeSuffix] ?: @""); + return [[NSString alloc] initWithFormat: @"fb%@%@", appID, suffix]; +} + ++ (NSURL *)appURLWithHost:(NSString *)host + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef +{ + return [self URLWithScheme:[self appURLScheme] + host:host + path:path + queryParameters:queryParameters + error:errorRef]; +} + ++ (NSDictionary *)dictionaryFromFBURL:(NSURL *)url +{ + // version 3.2.3 of the Facebook app encodes the parameters in the query but + // version 3.3 and above encode the parameters in the fragment; + // merge them together with fragment taking priority. + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + [params addEntriesFromDictionary:[FBSDKUtility dictionaryWithQueryString:url.query]]; + + // Only get the params from the fragment if it has authorize as the host + if ([url.host isEqualToString:@"authorize"]) { + [params addEntriesFromDictionary:[FBSDKUtility dictionaryWithQueryString:url.fragment]]; + } + return params; +} + ++ (void)array:(NSMutableArray *)array addObject:(id)object +{ + if (object) { + [array addObject:object]; + } +} + ++ (NSBundle *)bundleForStrings +{ + static NSBundle *bundle; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *stringsBundlePath = [[NSBundle mainBundle] pathForResource:@"FacebookSDKStrings" + ofType:@"bundle"]; + bundle = [NSBundle bundleWithPath:stringsBundlePath] ?: [NSBundle mainBundle]; + }); + return bundle; +} + ++ (id)convertRequestValue:(id)value +{ + if ([value isKindOfClass:[NSNumber class]]) { + value = [(NSNumber *)value stringValue]; + } else if ([value isKindOfClass:[NSURL class]]) { + value = [(NSURL *)value absoluteString]; + } + return value; +} + ++ (unsigned long)currentTimeInMilliseconds +{ + struct timeval time; + gettimeofday(&time, NULL); + return (time.tv_sec * 1000) + (time.tv_usec / 1000); +} + ++ (BOOL)dictionary:(NSMutableDictionary *)dictionary +setJSONStringForObject:(id)object + forKey:(id)key + error:(NSError *__autoreleasing *)errorRef +{ + if (!object || !key) { + return YES; + } + NSString *JSONString = [self JSONStringForObject:object error:errorRef invalidObjectHandler:NULL]; + if (!JSONString) { + return NO; + } + [self dictionary:dictionary setObject:JSONString forKey:key]; + return YES; +} + ++ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id)key +{ + if (object && key) { + [dictionary setObject:object forKey:key]; + } +} + ++ (void)extractPermissionsFromResponse:(NSDictionary *)responseObject + grantedPermissions:(NSMutableSet *)grantedPermissions + declinedPermissions:(NSMutableSet *)declinedPermissions +{ + NSArray *resultData = responseObject[@"data"]; + if (resultData.count > 0) { + for (NSDictionary *permissionsDictionary in resultData) { + NSString *permissionName = permissionsDictionary[@"permission"]; + NSString *status = permissionsDictionary[@"status"]; + + if ([status isEqualToString:@"granted"]) { + [grantedPermissions addObject:permissionName]; + } else if ([status isEqualToString:@"declined"]) { + [declinedPermissions addObject:permissionName]; + } + } + } +} + ++ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef +{ + return [self facebookURLWithHostPrefix:hostPrefix + path:path + queryParameters:queryParameters + defaultVersion:nil + error:errorRef]; +} + ++ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + defaultVersion:(NSString *)defaultVersion + error:(NSError *__autoreleasing *)errorRef +{ + if ([hostPrefix length] && ![hostPrefix hasSuffix:@"."]) { + hostPrefix = [hostPrefix stringByAppendingString:@"."]; + } + + NSString *host = @"facebook.com"; + NSString *domainPart = [FBSDKSettings facebookDomainPart]; + if ([domainPart length]) { + host = [[NSString alloc] initWithFormat:@"%@.%@", domainPart, host]; + } + host = [NSString stringWithFormat:@"%@%@", hostPrefix ?: @"", host ?: @""]; + + NSString *version = defaultVersion ?: FBSDK_TARGET_PLATFORM_VERSION; + if ([version length]) { + version = [@"/" stringByAppendingString:version]; + } + + if ([path length]) { + NSScanner *versionScanner = [[NSScanner alloc] initWithString:path]; + if ([versionScanner scanString:@"/v" intoString:NULL] && + [versionScanner scanInteger:NULL] && + [versionScanner scanString:@"." intoString:NULL] && + [versionScanner scanInteger:NULL]) { + version = nil; + } + if (![path hasPrefix:@"/"]) { + path = [@"/" stringByAppendingString:path]; + } + } + path = [[NSString alloc] initWithFormat:@"%@%@", version ?: @"", path ?: @""]; + + return [self URLWithScheme:@"https" + host:host + path:path + queryParameters:queryParameters + error:errorRef]; +} + ++ (BOOL)isBrowserURL:(NSURL *)URL +{ + NSString *scheme = [URL.scheme lowercaseString]; + return ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]); +} + ++ (BOOL)isFacebookBundleIdentifier:(NSString *)bundleIdentifier +{ + return ([bundleIdentifier hasPrefix:@"com.facebook."] || + [bundleIdentifier hasPrefix:@".com.facebook."]); +} + ++ (BOOL)isOSRunTimeVersionAtLeast:(NSOperatingSystemVersion)version +{ + return ([self _compareOperatingSystemVersion:[self operatingSystemVersion] toVersion:version] != NSOrderedAscending); +} + ++ (BOOL)isSafariBundleIdentifier:(NSString *)bundleIdentifier +{ + return ([bundleIdentifier isEqualToString:@"com.apple.mobilesafari"] || + [bundleIdentifier isEqualToString:@"com.apple.SafariViewService"]); +} + ++ (BOOL)isUIKitLinkTimeVersionAtLeast:(FBSDKUIKitVersion)version +{ + static int32_t linkTimeMajorVersion; + static dispatch_once_t getVersionOnce; + dispatch_once(&getVersionOnce, ^{ + int32_t linkTimeVersion = NSVersionOfLinkTimeLibrary("UIKit"); + linkTimeMajorVersion = ((MAX(linkTimeVersion, 0) & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift); + }); + return (version <= linkTimeMajorVersion); +} + ++ (BOOL)isUIKitRunTimeVersionAtLeast:(FBSDKUIKitVersion)version +{ + static int32_t runTimeMajorVersion; + static dispatch_once_t getVersionOnce; + dispatch_once(&getVersionOnce, ^{ + int32_t runTimeVersion = NSVersionOfRunTimeLibrary("UIKit"); + runTimeMajorVersion = ((MAX(runTimeVersion, 0) & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift); + }); + return (version <= runTimeMajorVersion); +} + ++ (NSString *)JSONStringForObject:(id)object + error:(NSError *__autoreleasing *)errorRef + invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler +{ + if (invalidObjectHandler || ![NSJSONSerialization isValidJSONObject:object]) { + object = [self _convertObjectToJSONObject:object invalidObjectHandler:invalidObjectHandler stop:NULL]; + if (![NSJSONSerialization isValidJSONObject:object]) { + if (errorRef != NULL) { + *errorRef = [FBSDKError invalidArgumentErrorWithName:@"object" + value:object + message:@"Invalid object for JSON serialization."]; + } + return nil; + } + } + NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:errorRef]; + if (!data) { + return nil; + } + return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +} + ++ (BOOL)object:(id)object isEqualToObject:(id)other; +{ + if (object == other) { + return YES; + } + if (!object || !other) { + return NO; + } + return [object isEqual:other]; +} + ++ (id)objectForJSONString:(NSString *)string error:(NSError *__autoreleasing *)errorRef +{ + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) { + if (errorRef != NULL) { + *errorRef = nil; + } + return nil; + } + return [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:errorRef]; +} + ++ (NSOperatingSystemVersion)operatingSystemVersion +{ + static NSOperatingSystemVersion operatingSystemVersion = { + .majorVersion = 0, + .minorVersion = 0, + .patchVersion = 0, + }; + static dispatch_once_t getVersionOnce; + dispatch_once(&getVersionOnce, ^{ + if ([NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) { + operatingSystemVersion = [NSProcessInfo processInfo].operatingSystemVersion; + } else { + NSArray *components = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; + switch (components.count) { + default: + case 3: + operatingSystemVersion.patchVersion = [components[2] integerValue]; + // fall through + case 2: + operatingSystemVersion.minorVersion = [components[1] integerValue]; + // fall through + case 1: + operatingSystemVersion.majorVersion = [components[0] integerValue]; + break; + case 0: + operatingSystemVersion.majorVersion = ([self isUIKitLinkTimeVersionAtLeast:FBSDKUIKitVersion_7_0] ? 7 : 6); + break; + } + } + }); + return operatingSystemVersion; +} + ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary + error:(NSError *__autoreleasing *)errorRef + invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler +{ + NSMutableString *queryString = [[NSMutableString alloc] init]; + __block BOOL hasParameters = NO; + if (dictionary) { + NSMutableArray *keys = [[dictionary allKeys] mutableCopy]; + // remove non-string keys, as they are not valid + [keys filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { + return [evaluatedObject isKindOfClass:[NSString class]]; + }]]; + // sort the keys so that the query string order is deterministic + [keys sortUsingSelector:@selector(compare:)]; + BOOL stop = NO; + for (NSString *key in keys) { + id value = [self convertRequestValue:dictionary[key]]; + if ([value isKindOfClass:[NSString class]]) { + value = [FBSDKUtility URLEncode:value]; + } + if (invalidObjectHandler && ![value isKindOfClass:[NSString class]]) { + value = invalidObjectHandler(value, &stop); + if (stop) { + break; + } + } + if (value) { + if (hasParameters) { + [queryString appendString:@"&"]; + } + [queryString appendFormat:@"%@=%@", key, value]; + hasParameters = YES; + } + } + } + if (errorRef != NULL) { + *errorRef = nil; + } + return ([queryString length] ? [queryString copy] : nil); +} + ++ (BOOL)shouldManuallyAdjustOrientation +{ + return (![self isUIKitLinkTimeVersionAtLeast:FBSDKUIKitVersion_8_0] || + ![self isUIKitRunTimeVersionAtLeast:FBSDKUIKitVersion_8_0]); +} + ++ (NSURL *)URLWithScheme:(NSString *)scheme + host:(NSString *)host + path:(NSString *)path + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef +{ + if (![path hasPrefix:@"/"]) { + path = [@"/" stringByAppendingString:path ?: @""]; + } + + NSString *queryString = nil; + if ([queryParameters count]) { + NSError *queryStringError; + queryString = [@"?" stringByAppendingString:[FBSDKUtility queryStringWithDictionary:queryParameters + error:&queryStringError]]; + if (!queryString) { + if (errorRef != NULL) { + *errorRef = [FBSDKError invalidArgumentErrorWithName:@"queryParameters" + value:queryParameters + message:nil + underlyingError:queryStringError]; + } + return nil; + } + } + + NSURL *URL = [[NSURL alloc] initWithString:[NSString stringWithFormat: + @"%@://%@%@%@", + scheme ?: @"", + host ?: @"", + path ?: @"", + queryString ?: @""]]; + if (errorRef != NULL) { + if (URL) { + *errorRef = nil; + } else { + *errorRef = [FBSDKError unknownErrorWithMessage:@"Unknown error building URL."]; + } + } + return URL; +} + ++ (void)deleteFacebookCookies +{ + NSHTTPCookieStorage *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + NSArray *facebookCookies = [cookies cookiesForURL:[self facebookURLWithHostPrefix:@"m." + path:@"/dialog/" + queryParameters:nil + error:NULL]]; + + for (NSHTTPCookie *cookie in facebookCookies) { + [cookies deleteCookie:cookie]; + } +} + +static NSMapTable *_transientObjects; + ++ (void)registerTransientObject:(id)object +{ + NSAssert([NSThread isMainThread], @"Must be called from the main thread!"); + if (!_transientObjects) { + _transientObjects = [[NSMapTable alloc] init]; + } + NSUInteger count = [(NSNumber *)[_transientObjects objectForKey:object] unsignedIntegerValue]; + [_transientObjects setObject:@(count + 1) forKey:object]; +} + ++ (void)unregisterTransientObject:(__weak id)object +{ + if (!object) { + return; + } + NSAssert([NSThread isMainThread], @"Must be called from the main thread!"); + NSUInteger count = [(NSNumber *)[_transientObjects objectForKey:object] unsignedIntegerValue]; + if (count == 1) { + [_transientObjects removeObjectForKey:object]; + } else if (count != 0) { + [_transientObjects setObject:@(count - 1) forKey:object]; + } else { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + formatString:@"unregisterTransientObject:%@ count is 0. This may indicate a bug in the FBSDK. Please" + " file a report to developers.facebook.com/bugs if you encounter any problems. Thanks!", [object class]]; + } +} + ++ (UIViewController *)viewControllerforView:(UIView*)view +{ + UIResponder *responder = view.nextResponder; + while (responder) { + if ([responder isKindOfClass:[UIViewController class]]) { + return (UIViewController *)responder; + } + responder = responder.nextResponder; + } + return nil; +} + +#pragma mark - FB Apps Installed + ++ (BOOL)isFacebookAppInstalled +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; + }); + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = FBSDK_CANOPENURL_FACEBOOK; + components.path = @"/"; + return [[UIApplication sharedApplication] + canOpenURL:components.URL]; +} + ++ (BOOL)isMessengerAppInstalled +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_MESSENGER]; + }); + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = FBSDK_CANOPENURL_MESSENGER; + components.path = @"/"; + return [[UIApplication sharedApplication] + canOpenURL:components.URL]; + +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +#pragma mark - Helper Methods + ++ (NSComparisonResult)_compareOperatingSystemVersion:(NSOperatingSystemVersion)version1 + toVersion:(NSOperatingSystemVersion)version2 +{ + if (version1.majorVersion < version2.majorVersion) { + return NSOrderedAscending; + } else if (version1.majorVersion > version2.majorVersion) { + return NSOrderedDescending; + } else if (version1.minorVersion < version2.minorVersion) { + return NSOrderedAscending; + } else if (version1.minorVersion > version2.minorVersion) { + return NSOrderedDescending; + } else if (version1.patchVersion < version2.patchVersion) { + return NSOrderedAscending; + } else if (version1.patchVersion > version2.patchVersion) { + return NSOrderedDescending; + } else { + return NSOrderedSame; + } +} + ++ (id)_convertObjectToJSONObject:(id)object + invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler + stop:(BOOL *)stopRef +{ + __block BOOL stop = NO; + if ([object isKindOfClass:[NSString class]] || [object isKindOfClass:[NSNumber class]]) { + // good to go, keep the object + } else if ([object isKindOfClass:[NSURL class]]) { + object = [(NSURL *)object absoluteString]; + } else if ([object isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + [(NSDictionary *)object enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *dictionaryStop) { + [self dictionary:dictionary + setObject:[self _convertObjectToJSONObject:obj invalidObjectHandler:invalidObjectHandler stop:&stop] + forKey:[FBSDKTypeUtility stringValue:key]]; + if (stop) { + *dictionaryStop = YES; + } + }]; + object = dictionary; + } else if ([object isKindOfClass:[NSArray class]]) { + NSMutableArray *array = [[NSMutableArray alloc] init]; + for (id obj in (NSArray *)object) { + id convertedObj = [self _convertObjectToJSONObject:obj invalidObjectHandler:invalidObjectHandler stop:&stop]; + [self array:array addObject:convertedObj]; + if (stop) { + break; + } + } + object = array; + } else { + object = invalidObjectHandler(object, stopRef); + } + if (stopRef != NULL) { + *stopRef = stop; + } + return object; +} + ++ (void)validateAppID +{ + if (![FBSDKSettings appID]) { + NSString *reason = @"App ID not found. Add a string value with your app ID for the key " + @"FacebookAppID to the Info.plist or call [FBSDKSettings setAppID:]."; + @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; + } +} + ++ (void)validateURLSchemes +{ + [self validateAppID]; + NSString *defaultUrlScheme = [NSString stringWithFormat:@"fb%@%@", [FBSDKSettings appID], [FBSDKSettings appURLSchemeSuffix] ?: @""]; + if (![self isRegisteredURLScheme:defaultUrlScheme]) { + NSString *reason = [NSString stringWithFormat:@"%@ is not registered as a URL scheme. Please add it in your Info.plist", defaultUrlScheme]; + @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; + } +} + + ++ (UIViewController *)topMostViewController +{ + UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; + while (topController.presentedViewController) { + topController = topController.presentedViewController; + } + return topController; +} + + ++ (BOOL)isRegisteredURLScheme:(NSString *)urlScheme { + static dispatch_once_t fetchBundleOnce; + static NSArray *urlTypes = nil; + + dispatch_once(&fetchBundleOnce, ^{ + urlTypes = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleURLTypes"]; + }); + for (NSDictionary *urlType in urlTypes) { + NSArray *urlSchemes = [urlType valueForKey:@"CFBundleURLSchemes"]; + if ([urlSchemes containsObject:urlScheme]) { + return YES; + } + } + return NO; +} + ++ (void)checkRegisteredCanOpenURLScheme:(NSString *)urlScheme +{ + static dispatch_once_t initCheckedSchemesOnce; + static NSMutableSet *checkedSchemes = nil; + + dispatch_once(&initCheckedSchemesOnce, ^{ + checkedSchemes = [NSMutableSet set]; + }); + + @synchronized(self) { + if ([checkedSchemes containsObject:urlScheme]) { + return; + } else { + [checkedSchemes addObject:urlScheme]; + } + } + + if (![self isRegisteredCanOpenURLScheme:urlScheme]){ + NSString *reason = [NSString stringWithFormat:@"%@ is missing from your Info.plist under LSApplicationQueriesSchemes and is required for iOS 9.0", urlScheme]; +#ifdef __IPHONE_9_0 + @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; +#else + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:reason]; +#endif + } +} + ++ (BOOL)isRegisteredCanOpenURLScheme:(NSString *)urlScheme +{ + static dispatch_once_t fetchBundleOnce; + static NSArray *schemes = nil; + + dispatch_once(&fetchBundleOnce, ^{ + schemes = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"LSApplicationQueriesSchemes"]; + }); + + return [schemes containsObject:urlScheme]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h new file mode 100644 index 0000000..d00dea6 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h @@ -0,0 +1,88 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @class FBSDKLogger + + @abstract + Simple logging utility for conditionally logging strings and then emitting them + via NSLog(). + + @unsorted + */ +@interface FBSDKLogger : NSObject + +// Access current accumulated contents of the logger. +@property (copy, nonatomic) NSString *contents; + +// Each FBSDKLogger gets a unique serial number to allow the client to log these numbers and, for instance, correlation of Request/Response +@property (nonatomic, readonly) NSUInteger loggerSerialNumber; + +// The logging behavior of this logger. See the FB_LOG_BEHAVIOR* constants in FBSession.h +@property (copy, nonatomic, readonly) NSString *loggingBehavior; + +// Is the current logger instance active, based on its loggingBehavior? +@property (nonatomic, readonly) BOOL isActive; + +// +// Instance methods +// + +// Create with specified logging behavior +- (instancetype)initWithLoggingBehavior:(NSString *)loggingBehavior; + +// Append string, or key/value pair +- (void)appendString:(NSString *)string; +- (void)appendFormat:(NSString *)formatString, ... NS_FORMAT_FUNCTION(1,2); +- (void)appendKey:(NSString *)key value:(NSString *)value; + +// Emit log, clearing out the logger contents. +- (void)emitToNSLog; + +// +// Class methods +// + +// +// Return a globally unique serial number to be used for correlating multiple output from the same logger. +// ++ (NSUInteger)generateSerialNumber; + +// Simple helper to write a single log entry, based upon whether the behavior matches a specified on. ++ (void)singleShotLogEntry:(NSString *)loggingBehavior + logEntry:(NSString *)logEntry; + ++ (void)singleShotLogEntry:(NSString *)loggingBehavior + formatString:(NSString *)formatString, ... NS_FORMAT_FUNCTION(2,3); + ++ (void)singleShotLogEntry:(NSString *)loggingBehavior + timestampTag:(NSObject *)timestampTag + formatString:(NSString *)formatString, ... NS_FORMAT_FUNCTION(3,4); + +// Register a timestamp label with the "current" time, to then be retrieved by singleShotLogEntry +// to include a duration. ++ (void)registerCurrentTime:(NSString *)loggingBehavior + withTag:(NSObject *)timestampTag; + +// When logging strings, replace all instances of 'replace' with instances of 'replaceWith'. ++ (void)registerStringToReplace:(NSString *)replace + replaceWith:(NSString *)replaceWith; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m new file mode 100644 index 0000000..89e9197 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m @@ -0,0 +1,219 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLogger.h" + +#import "FBSDKInternalUtility.h" +#import "FBSDKSettings+Internal.h" + +static NSUInteger g_serialNumberCounter = 1111; +static NSMutableDictionary *g_stringsToReplace = nil; +static NSMutableDictionary *g_startTimesWithTags = nil; + +@interface FBSDKLogger () + +@property (nonatomic, strong, readonly) NSMutableString *internalContents; + +@end + +@implementation FBSDKLogger + +// Lifetime + +- (instancetype)initWithLoggingBehavior:(NSString *)loggingBehavior +{ + if ((self = [super init])) { + _isActive = [[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]; + _loggingBehavior = loggingBehavior; + if (_isActive) { + _internalContents = [[NSMutableString alloc] init]; + _loggerSerialNumber = [FBSDKLogger generateSerialNumber]; + } + } + + return self; +} + +// Public properties + +- (NSString *)contents +{ + return _internalContents; +} + +- (void)setContents:(NSString *)contents +{ + if (_isActive) { + _internalContents = [NSMutableString stringWithString:contents]; + } +} + +// Public instance methods + +- (void)appendString:(NSString *)string +{ + if (_isActive) { + [_internalContents appendString:string]; + } +} + +- (void)appendFormat:(NSString *)formatString, ... +{ + if (_isActive) { + va_list vaArguments; + va_start(vaArguments, formatString); + NSString *logString = [[NSString alloc] initWithFormat:formatString arguments:vaArguments]; + va_end(vaArguments); + + [self appendString:logString]; + } +} + + +- (void)appendKey:(NSString *)key value:(NSString *)value +{ + if (_isActive && [value length]) { + [_internalContents appendFormat:@" %@:\t%@\n", key, value]; + } +} + +- (void)emitToNSLog +{ + if (_isActive) { + + for (NSString *key in [g_stringsToReplace keyEnumerator]) { + [_internalContents replaceOccurrencesOfString:key + withString:[g_stringsToReplace objectForKey:key] + options:NSLiteralSearch + range:NSMakeRange(0, _internalContents.length)]; + } + + // Xcode 4.4 hangs on extremely long NSLog output (http://openradar.appspot.com/11972490). Truncate if needed. + const int MAX_LOG_STRING_LENGTH = 10000; + NSString *logString = _internalContents; + if (_internalContents.length > MAX_LOG_STRING_LENGTH) { + logString = [NSString stringWithFormat:@"TRUNCATED: %@", [_internalContents substringToIndex:MAX_LOG_STRING_LENGTH]]; + } + NSLog(@"FBSDKLog: %@", logString); + + [_internalContents setString:@""]; + } +} + +// Public static methods + ++ (NSUInteger)generateSerialNumber +{ + return g_serialNumberCounter++; +} + ++ (void)singleShotLogEntry:(NSString *)loggingBehavior + logEntry:(NSString *)logEntry { + if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { + FBSDKLogger *logger = [[FBSDKLogger alloc] initWithLoggingBehavior:loggingBehavior]; + [logger appendString:logEntry]; + [logger emitToNSLog]; + } +} + ++ (void)singleShotLogEntry:(NSString *)loggingBehavior + formatString:(NSString *)formatString, ... { + + if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { + va_list vaArguments; + va_start(vaArguments, formatString); + NSString *logString = [[NSString alloc] initWithFormat:formatString arguments:vaArguments]; + va_end(vaArguments); + + [self singleShotLogEntry:loggingBehavior logEntry:logString]; + } +} + + ++ (void)singleShotLogEntry:(NSString *)loggingBehavior + timestampTag:(NSObject *)timestampTag + formatString:(NSString *)formatString, ... { + + if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { + va_list vaArguments; + va_start(vaArguments, formatString); + NSString *logString = [[NSString alloc] initWithFormat:formatString arguments:vaArguments]; + va_end(vaArguments); + + // Start time of this "timestampTag" is stashed in the dictionary. + // Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If + // we send in as an object, the dictionary will try to copy it. + NSNumber *tagAsNumber = [NSNumber numberWithUnsignedLong:(unsigned long)(__bridge void *)timestampTag]; + NSNumber *startTimeNumber = [g_startTimesWithTags objectForKey:tagAsNumber]; + + // Only log if there's been an associated start time. + if (startTimeNumber) { + unsigned long elapsed = [FBSDKInternalUtility currentTimeInMilliseconds] - startTimeNumber.unsignedLongValue; + [g_startTimesWithTags removeObjectForKey:tagAsNumber]; // served its purpose, remove + + // Log string is appended with "%d msec", with nothing intervening. This gives the most control to the caller. + logString = [NSString stringWithFormat:@"%@%lu msec", logString, elapsed]; + + [self singleShotLogEntry:loggingBehavior logEntry:logString]; + } + } +} + ++ (void)registerCurrentTime:(NSString *)loggingBehavior + withTag:(NSObject *)timestampTag { + + if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { + + if (!g_startTimesWithTags) { + g_startTimesWithTags = [[NSMutableDictionary alloc] init]; + } + + if (g_startTimesWithTags.count >= 1000) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry: + @"Unexpectedly large number of outstanding perf logging start times, something is likely wrong."]; + } + + unsigned long currTime = [FBSDKInternalUtility currentTimeInMilliseconds]; + + // Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If + // we send in as an object, the dictionary will try to copy it. + unsigned long tagAsNumber = (unsigned long)(__bridge void *)timestampTag; + [g_startTimesWithTags setObject:[NSNumber numberWithUnsignedLong:currTime] + forKey:[NSNumber numberWithUnsignedLong:tagAsNumber]]; + } +} + + ++ (void)registerStringToReplace:(NSString *)replace + replaceWith:(NSString *)replaceWith { + + // Strings sent in here never get cleaned up, but that's OK, don't ever expect too many. + + if ([[FBSDKSettings loggingBehavior] count] > 0) { // otherwise there's no logging. + + if (!g_stringsToReplace) { + g_stringsToReplace = [[NSMutableDictionary alloc] init]; + } + + [g_stringsToReplace setValue:replaceWith forKey:replace]; + } +} + + + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h new file mode 100644 index 0000000..e3f9cd5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h @@ -0,0 +1,38 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +@interface FBSDKMath : NSObject + ++ (CGPoint)ceilForPoint:(CGPoint)value; ++ (CGSize)ceilForSize:(CGSize)value; ++ (CGPoint)floorForPoint:(CGPoint)value; ++ (CGSize)floorForSize:(CGSize)value; ++ (NSUInteger)hashWithCGFloat:(CGFloat)value; ++ (NSUInteger)hashWithCString:(const char *)value; ++ (NSUInteger)hashWithDouble:(double)value; ++ (NSUInteger)hashWithFloat:(float)value; ++ (NSUInteger)hashWithInteger:(NSUInteger)value; ++ (NSUInteger)hashWithInteger:(NSUInteger)value1 andInteger:(NSUInteger)value2; ++ (NSUInteger)hashWithIntegerArray:(NSUInteger *)values count:(NSUInteger)count; ++ (NSUInteger)hashWithLong:(unsigned long long)value; ++ (NSUInteger)hashWithPointer:(const void *)value; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m new file mode 100644 index 0000000..6ac3fe5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m @@ -0,0 +1,159 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +// +// Based on Thomas Wang 32/64 bit mix hash +// http://www.concentric.net/~Ttwang/tech/inthash.htm +// + +#import "FBSDKMath.h" + +#import + +#import "FBSDKMacros.h" + +@implementation FBSDKMath + +#pragma mark - Class Methods + ++ (CGPoint)ceilForPoint:(CGPoint)value +{ + return CGPointMake(ceilf(value.x), ceilf(value.x)); +} + ++ (CGSize)ceilForSize:(CGSize)value +{ + return CGSizeMake(ceilf(value.width), ceilf(value.height)); +} + ++ (CGPoint)floorForPoint:(CGPoint)value +{ + return CGPointMake(floorf(value.x), floorf(value.y)); +} + ++ (CGSize)floorForSize:(CGSize)value +{ + return CGSizeMake(floorf(value.width), floorf(value.height)); +} + ++ (NSUInteger)hashWithCGFloat:(CGFloat)value +{ +#if CGFLOAT_IS_DOUBLE + return [self hashWithDouble:value]; +#else + return [self hashWithFloat:value]; +#endif +} + ++ (NSUInteger)hashWithCString:(const char *)value +{ + // FNV-1a hash. + NSUInteger hash = sizeof(NSUInteger) == 4 ? 2166136261U : 14695981039346656037U; + while (*value) { + hash ^= *value++; + hash *= sizeof(NSUInteger) == 4 ? 16777619 : 1099511628211; + } + return hash; +} + ++ (NSUInteger)hashWithDouble:(double)value +{ + assert(sizeof(double) == sizeof(uint64_t)); // Size of double must be 8 bytes + union { + double key; + uint64_t bits; + } u; + u.key = value; + return [self hashWithLong:u.bits]; +} + ++ (NSUInteger)hashWithFloat:(float)value +{ + assert(sizeof(float) == sizeof(uint32_t)); // Size of float must be 4 bytes + union { + float key; + uint32_t bits; + } u; + u.key = value; + return [self hashWithInteger:u.bits]; +} + ++ (NSUInteger)hashWithInteger:(NSUInteger)value +{ + return [self hashWithPointer:(void *)value]; +} + ++ (NSUInteger)hashWithInteger:(NSUInteger)value1 andInteger:(NSUInteger)value2 +{ + return [self hashWithLong:(((unsigned long long)value1) << 32 | value2)]; +} + ++ (NSUInteger)hashWithIntegerArray:(NSUInteger *)values count:(NSUInteger)count +{ + if (count == 0) { + return 0; + } + NSUInteger hash = values[0]; + for (NSUInteger i = 1; i < count; ++i) { + hash = [self hashWithInteger:hash andInteger:values[i]]; + } + return hash; +} + ++ (NSUInteger)hashWithLong:(unsigned long long)value +{ + value = (~value) + (value << 18); // key = (key << 18) - key - 1; + value ^= (value >> 31); + value *= 21; // key = (key + (key << 2)) + (key << 4); + value ^= (value >> 11); + value += (value << 6); + value ^= (value >> 22); + return (NSUInteger)value; +} + ++ (NSUInteger)hashWithPointer:(const void *)value +{ + NSUInteger hash = (NSUInteger)value; +#if !TARGET_RT_64_BIT + hash = ~hash + (hash << 15); // key = (key << 15) - key - 1; + hash ^= (hash >> 12); + hash += (hash << 2); + hash ^= (hash >> 4); + hash *= 2057; // key = (key + (key << 3)) + (key << 11); + hash ^= (hash >> 16); +#else + hash += ~hash + (hash << 21); // key = (key << 21) - key - 1; + hash ^= (hash >> 24); + hash = (hash + (hash << 3)) + (hash << 8); + hash ^= (hash >> 14); + hash = (hash + (hash << 2)) + (hash << 4); // key * 21 + hash ^= (hash >> 28); + hash += (hash << 31); +#endif + return hash; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h new file mode 100644 index 0000000..b771602 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h @@ -0,0 +1,67 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#include + +typedef double FBSDKMonotonicTimeSeconds; +typedef uint64_t FBSDKMonotonicTimeMilliseconds; +typedef uint64_t FBSDKMonotonicTimeNanoseconds; +typedef uint64_t FBSDKMachAbsoluteTimeUnits; + +/** + * return current monotonic time in Milliseconds + * Millisecond precision, uint64_t value. + * Avoids float/double math operations, thus more efficient than FBSDKMonotonicTimeGetCurrentSeconds. + * Should be prefered over FBSDKMonotonicTimeGetCurrentSeconds in case millisecond + * precision is requred. + * IMPORTANT: this timer doesn't run while the device is sleeping. + */ +FBSDKMonotonicTimeMilliseconds FBSDKMonotonicTimeGetCurrentMilliseconds(void); + +/** + * return current monotonic time in Seconds + * Nanosecond precision, double value. + * Should be prefered over FBSDKMonotonicTimeGetCurrentMilliseconds in case + * nanosecond precision is requred. + * IMPORTANT: this timer doesn't run while the device is sleeping. + */ +FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeGetCurrentSeconds(void); + +/** + * return current monotonic time in NanoSeconds + * Nanosecond precision, uint64_t value. + * Useful when nanosecond precision is required but you want to avoid float/double math operations. + * IMPORTANT: this timer doesn't run while the device is sleeping. + */ +FBSDKMonotonicTimeNanoseconds FBSDKMonotonicTimeGetCurrentNanoseconds(void); + +/** + * return number of MachTimeUnits for given number of seconds + * this is useful when you want to use the really fast mach_absolute_time() function + * to calculate deltas between two points and then check it against a (precomputed) threshold. + * Nanosecond precision, uint64_t value. + */ +FBSDKMachAbsoluteTimeUnits FBSDKMonotonicTimeConvertSecondsToMachUnits(FBSDKMonotonicTimeSeconds seconds); + +/** + * return the number of seconds for a given amount of MachTimeUnits + * this is useful when you want to use the really fast mach_absolute_time() function, take + * deltas between time points, and when you're out of the timing critical section, use + * this function to compute how many seconds the delta works out to be. + */ +FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeConvertMachUnitsToSeconds(FBSDKMachAbsoluteTimeUnits machUnits); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m new file mode 100644 index 0000000..1a52c81 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m @@ -0,0 +1,86 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#include +#include +#include +#include + +#import "FBSDKMonotonicTime.h" + +/** + * PLEASE NOTE: FBSDKSDKMonotonicTimeTests work fine, but are disabled + * because they take several seconds. Please re-enable them to test + * any changes you're making here! + */ +static uint64_t _get_time_nanoseconds(void) +{ + static struct mach_timebase_info tb_info = {0}; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + int ret = mach_timebase_info(&tb_info); + assert(0 == ret); + }); + + return (mach_absolute_time() * tb_info.numer) / tb_info.denom; +} + +FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeGetCurrentSeconds(void) +{ + const uint64_t nowNanoSeconds = _get_time_nanoseconds(); + return (FBSDKMonotonicTimeSeconds)nowNanoSeconds / (FBSDKMonotonicTimeSeconds)1000000000.0; +} + +FBSDKMonotonicTimeMilliseconds FBSDKMonotonicTimeGetCurrentMilliseconds(void) +{ + const uint64_t nowNanoSeconds = _get_time_nanoseconds(); + return nowNanoSeconds / 1000000; +} + +FBSDKMonotonicTimeNanoseconds FBSDKMonotonicTimeGetCurrentNanoseconds(void) +{ + return _get_time_nanoseconds(); +} + +FBSDKMachAbsoluteTimeUnits FBSDKMonotonicTimeConvertSecondsToMachUnits(FBSDKMonotonicTimeSeconds seconds) +{ + static double ratio = 0; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + struct mach_timebase_info tb_info = {0}; + int ret = mach_timebase_info(&tb_info); + assert(0 == ret); + ratio = ((double) tb_info.denom / (double)tb_info.numer) * 1000000000.0; + }); + + return seconds * ratio; +} + +FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeConvertMachUnitsToSeconds(FBSDKMachAbsoluteTimeUnits machUnits) +{ + static double ratio = 0; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + struct mach_timebase_info tb_info = {0}; + int ret = mach_timebase_info(&tb_info); + assert(0 == ret); + ratio = ((double) tb_info.numer / (double)tb_info.denom) / 1000000000.0; + }); + + return ratio * (double)machUnits; +} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h new file mode 100644 index 0000000..d2298d5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKProfile.h" + +@interface FBSDKProfile(Internal) + ++ (void)cacheProfile:(FBSDKProfile *) profile; ++ (FBSDKProfile *)fetchCachedProfile; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h new file mode 100644 index 0000000..2af3879 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h @@ -0,0 +1,36 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessTokenCache.h" +#import "FBSDKSettings.h" + +@interface FBSDKSettings(Internal) + ++ (FBSDKAccessTokenCache *)accessTokenCache; + +- (void)setAccessTokenCache; + ++ (NSString *)graphAPIDebugParamValue; + ++ (BOOL)isGraphErrorRecoveryDisabled; + +// used by Unity. ++ (NSString *)userAgentSuffix; ++ (void)setUserAgentSuffix:(NSString *)suffix; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h new file mode 100644 index 0000000..00999f5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h @@ -0,0 +1,82 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +typedef void (^FBSDKGraphRequestAccessToAccountsHandler)(NSString *oauthToken, NSError *accountStoreError); + +/* + @class + + @abstract Adapter around system account store APIs. Note this is only intended for internal + consumption. If publicized, consider moving declarations to an internal only header and + reconsider dispatching semantics. + */ +@interface FBSDKSystemAccountStoreAdapter : NSObject + +/* + @abstract + Requests access to the device's Facebook account for the given parameters. + @param permissions the permissions + @param defaultAudience the default audience + @param isReauthorize a flag describing if this is a reauth request + @param appID the app id + @param handler the handler that will be invoked on completion (dispatched to the main thread). the oauthToken is nil on failure. + */ +- (void)requestAccessToFacebookAccountStore:(NSSet *)permissions + defaultAudience:(NSString *)defaultAudience + isReauthorize:(BOOL)isReauthorize + appID:(NSString *)appID + handler:(FBSDKGraphRequestAccessToAccountsHandler)handler; + +/* + @abstract Sends a message to the device account store to renew the Facebook account credentials + + @param handler the handler that is invoked on completion + */ +- (void)renewSystemAuthorization:(void(^)(ACAccountCredentialRenewResult result, NSError *error))handler; + +/* + @abstracts gets the oauth token stored in the account store credential, if available. If not empty, + this implies user has granted access. + */ +- (NSString *)accessTokenString; + +/* + @abstract Gets the singleton instance. + */ ++ (FBSDKSystemAccountStoreAdapter *)sharedInstance; + +/* + @abstract Sets the singleton instance, typically only for unit tests + */ ++ (void)setSharedInstance:(FBSDKSystemAccountStoreAdapter *)instance; + +/* + @abstract Gets or sets the flag indicating if the next requestAccess call should block + on a renew call. + */ +@property (nonatomic, assign) BOOL forceBlockingRenew; + +/* + @abstract A convenience getter to the Facebook account type in the account store, if available. + */ +@property (strong, nonatomic, readonly) ACAccountType *accountType; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m new file mode 100644 index 0000000..43f506a --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m @@ -0,0 +1,275 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKSystemAccountStoreAdapter.h" + +#import "FBSDKConstants.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKError.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings+Internal.h" + +@interface FBSDKSystemAccountStoreAdapter () + +@property (retain, nonatomic, readonly) ACAccountStore *accountStore; + +@end + +static NSString *const FBForceBlockingRenewKey = @"com.facebook.sdk:ForceBlockingRenewKey"; +static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil; + +@implementation FBSDKSystemAccountStoreAdapter +{ + ACAccountStore *_accountStore; + ACAccountType *_accountType; +} + ++ (void)initialize +{ + if (self == [FBSDKSystemAccountStoreAdapter class]) { + _singletonInstance = [[self alloc] init]; + } +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + _forceBlockingRenew = [[NSUserDefaults standardUserDefaults] boolForKey:FBForceBlockingRenewKey]; + } + return self; +} + +#pragma mark - Properties + +- (ACAccountStore *)accountStore +{ + if (_accountStore == nil) { + _accountStore = [[fbsdkdfl_ACAccountStoreClass() alloc] init]; + } + return _accountStore; +} + +- (ACAccountType *)accountType +{ + if (_accountType == nil) { + _accountType = [self.accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"]; + } + return _accountType; +} + +- (void)setForceBlockingRenew:(BOOL)forceBlockingRenew +{ + if (_forceBlockingRenew != forceBlockingRenew) { + _forceBlockingRenew = forceBlockingRenew; + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + [userDefaults setBool:forceBlockingRenew forKey:FBForceBlockingRenewKey]; + [userDefaults synchronize]; + } +} + ++ (FBSDKSystemAccountStoreAdapter *)sharedInstance +{ + return _singletonInstance; +} + ++ (void)setSharedInstance:(FBSDKSystemAccountStoreAdapter *)instance +{ + _singletonInstance = instance; +} + +- (NSString *)accessTokenString +{ + if (self.accountType && self.accountType.accessGranted) { + NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType]; + if (fbAccounts.count > 0) { + id account = [fbAccounts objectAtIndex:0]; + id credential = [account credential]; + + return [credential oauthToken]; + } + } + return nil; +} + +#pragma mark - Public properties and methods + +- (void)requestAccessToFacebookAccountStore:(NSSet *)permissions + defaultAudience:(NSString *)defaultAudience + isReauthorize:(BOOL)isReauthorize + appID:(NSString *)appID + handler:(FBSDKGraphRequestAccessToAccountsHandler)handler +{ + if (appID == nil) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"appID cannot be nil" + userInfo:nil]; + } + + // no publish_* permissions are permitted with a nil audience + if (!defaultAudience && isReauthorize) { + for (NSString *p in permissions) { + if ([p hasPrefix:@"publish"]) { + [[NSException exceptionWithName:NSInvalidArgumentException + reason:@"FBSDKLoginManager: One or more publish permission was requested " + @"without specifying an audience; use FBSDKDefaultAudienceOnlyMe, " + @"FBSDKDefaultAudienceFriends, or FBSDKDefaultAudienceEveryone" + userInfo:nil] + raise]; + } + } + } + + // construct access options + NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: + appID, fbsdkdfl_ACFacebookAppIdKey(), + [permissions allObjects], fbsdkdfl_ACFacebookPermissionsKey(), + defaultAudience, fbsdkdfl_ACFacebookAudienceKey(), // must end on this key/value due to audience possibly being nil + nil]; + + if (self.forceBlockingRenew + && [self.accountStore accountsWithAccountType:self.accountType].count > 0) { + // If the force renew flag is set and an iOS FB account is still set, + // chain the requestAccessBlock to a successful renew result + [self renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *error) { + if (result == ACAccountCredentialRenewResultRenewed) { + self.forceBlockingRenew = NO; + [self requestAccessToFacebookAccountStore:options retrying:NO handler:handler]; + } else if (handler) { + // Otherwise, invoke the caller's handler back on the main thread with an + // error that will trigger the password change user message. + dispatch_async(dispatch_get_main_queue(), ^{ + handler(nil, error); + }); + } + }]; + } else { + // Otherwise go ahead and invoke normal request. + [self requestAccessToFacebookAccountStore:options retrying:NO handler:handler]; + } +} + +- (void)requestAccessToFacebookAccountStore:(NSDictionary *)options + retrying:(BOOL)retrying + handler:(FBSDKGraphRequestAccessToAccountsHandler)handler +{ + if (!self.accountType) { + if (handler) { + handler(nil, [FBSDKError errorWithCode:FBSDKUnknownErrorCode message:@"Invalid request to account store"]); + } + return; + } + // we will attempt an iOS integrated facebook login + [self.accountStore + requestAccessToAccountsWithType:self.accountType + options:options + completion:^(BOOL granted, NSError *error) { + if (!granted && + error.code == ACErrorPermissionDenied && + [error.description rangeOfString:@"remote_app_id does not match stored id"].location != NSNotFound) { + + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors formatString: + @"System authorization failed:'%@'. This may be caused by a mismatch between" + @" the bundle identifier and your app configuration on the server" + @" at developers.facebook.com/apps.", + error.localizedDescription]; + } + + // requestAccessToAccountsWithType:options:completion: completes on an + // arbitrary thread; let's process this back on our main thread + dispatch_async(dispatch_get_main_queue(), ^{ + NSError *accountStoreError = error; + NSString *oauthToken = nil; + id account = nil; + if (granted) { + NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType]; + if (fbAccounts.count > 0) { + account = [fbAccounts objectAtIndex:0]; + + id credential = [account credential]; + + oauthToken = [credential oauthToken]; + } + self.forceBlockingRenew = NO; + } + + if (!accountStoreError && !oauthToken) { + if (!retrying) { + // This can happen as a result of, e.g., restoring from iCloud to a different device. Try once to renew. + [self renewSystemAuthorization:^(ACAccountCredentialRenewResult renewResult, NSError *renewError) { + // Call block again, regardless of result -- either we'll get credentials or we'll fail with the + // exception below. We want to treat failure here the same regardless of whether it was before or after the refresh attempt. + [self requestAccessToFacebookAccountStore:options retrying:YES handler:handler]; + }]; + return; + } + // else call handler with nils. + } + handler(oauthToken, accountStoreError); + }); + }]; +} + +- (void)renewSystemAuthorization:(void(^)(ACAccountCredentialRenewResult, NSError *))handler +{ + // if the slider has been set to off, renew calls to iOS simply hang, so we must + // preemptively check for that condition. + if (self.accountStore && self.accountType && self.accountType.accessGranted) { + NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType]; + id account; + if (fbAccounts && [fbAccounts count] > 0 && + (account = [fbAccounts objectAtIndex:0])) { + + FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken]; + if (![currentToken.tokenString isEqualToString:[self accessTokenString]]) { + currentToken = nil; + } + [self.accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { + if (error) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAccessTokens + logEntry:[NSString stringWithFormat:@"renewCredentialsForAccount result:%ld, error: %@", + (long)renewResult, + error]]; + } + if (renewResult == ACAccountCredentialRenewResultRenewed && + currentToken && + [currentToken isEqual:[FBSDKAccessToken currentAccessToken]]) { + // account store renewals can change the stored oauth token so we need to update the currentAccessToken + // so future comparisons to -[ accessTokenString] work correctly (e.g., error recovery). + FBSDKAccessToken *updatedToken = [[FBSDKAccessToken alloc] initWithTokenString:[self accessTokenString] + permissions:[currentToken.permissions allObjects] declinedPermissions:[currentToken.declinedPermissions allObjects] + appID:currentToken.appID + userID:currentToken.userID + expirationDate:[NSDate distantFuture] + refreshDate:[NSDate date]]; + [FBSDKAccessToken setCurrentAccessToken:updatedToken]; + } + if (handler) { + handler(renewResult, error); + } + }]; + return; + } + } + + if (handler) { + handler(ACAccountCredentialRenewResultFailed, nil); + } +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h new file mode 100644 index 0000000..8fe3e9e --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h @@ -0,0 +1,32 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +typedef NS_ENUM(NSInteger, FBSDKTriStateBOOL) +{ + FBSDKTriStateBOOLValueUnknown = -1, + FBSDKTriStateBOOLValueNO = 0, + FBSDKTriStateBOOLValueYES = 1, +}; + +FBSDK_EXTERN FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value); +FBSDK_EXTERN FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value); +FBSDK_EXTERN BOOL BOOLFromFBSDKTriStateBOOL(FBSDKTriStateBOOL value, BOOL defaultValue); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m new file mode 100644 index 0000000..c25d365 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m @@ -0,0 +1,43 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKTriStateBOOL.h" + +FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value) +{ + return value ? FBSDKTriStateBOOLValueYES : FBSDKTriStateBOOLValueNO; +} + +FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value) +{ + return ([value isKindOfClass:[NSNumber class]] ? + FBSDKTriStateBOOLFromBOOL([value boolValue]) : + FBSDKTriStateBOOLValueUnknown); +} + +BOOL BOOLFromFBSDKTriStateBOOL(FBSDKTriStateBOOL value, BOOL defaultValue) +{ + switch (value) { + case FBSDKTriStateBOOLValueYES: + return YES; + case FBSDKTriStateBOOLValueNO: + return NO; + case FBSDKTriStateBOOLValueUnknown: + return defaultValue; + } +} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h new file mode 100644 index 0000000..7daa2fc --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h @@ -0,0 +1,32 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKTypeUtility : NSObject + ++ (NSArray *)arrayValue:(id)object; ++ (BOOL)boolValue:(id)object; ++ (NSDictionary *)dictionaryValue:(id)object; ++ (NSInteger)integerValue:(id)object; ++ (id)objectValue:(id)object; ++ (NSString *)stringValue:(id)object; ++ (NSUInteger)unsignedIntegerValue:(id)object; ++ (NSURL *)URLValue:(id)object; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m new file mode 100644 index 0000000..84de948 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m @@ -0,0 +1,120 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKTypeUtility.h" + +#import "FBSDKMacros.h" + +@implementation FBSDKTypeUtility + +#pragma mark - Class Methods + ++ (NSArray *)arrayValue:(id)object +{ + return (NSArray *)[self _objectValue:object ofClass:[NSArray class]]; +} + ++ (BOOL)boolValue:(id)object +{ + if ([object isKindOfClass:[NSNumber class]]) { + // @0 or @NO returns NO, otherwise YES + return [(NSNumber *)object boolValue]; + } else if ([object isKindOfClass:[NSString class]]) { + // Returns YES on encountering one of "Y", "y", "T", "t", or a digit 1-9, otherwise NO + return [(NSString *)object boolValue]; + } else { + return ([self objectValue:object] != nil); + } +} + ++ (NSDictionary *)dictionaryValue:(id)object +{ + return (NSDictionary *)[self _objectValue:object ofClass:[NSDictionary class]]; +} + ++ (NSInteger)integerValue:(id)object +{ + if ([object isKindOfClass:[NSNumber class]]) { + return [(NSNumber *)object integerValue]; + } else if ([object isKindOfClass:[NSString class]]) { + return [(NSString *)object integerValue]; + } else { + return 0; + } +} + ++ (id)objectValue:(id)object +{ + return ([object isKindOfClass:[NSNull class]] ? nil : object); +} + ++ (NSString *)stringValue:(id)object +{ + if ([object isKindOfClass:[NSString class]]) { + return (NSString *)object; + } else if ([object isKindOfClass:[NSNumber class]]) { + return [(NSNumber *)object stringValue]; + } else if ([object isKindOfClass:[NSURL class]]) { + return [(NSURL *)object absoluteString]; + } else { + return nil; + } +} + ++ (NSUInteger)unsignedIntegerValue:(id)object +{ + if ([object isKindOfClass:[NSNumber class]]) { + return [(NSNumber *)object unsignedIntegerValue]; + } else { + // there is no direct support for strings containing unsigned values > NSIntegerMax - not worth writing ourselves + // right now, so just cap unsigned values at NSIntegerMax until we have a need for larger + NSInteger integerValue = [self integerValue:object]; + if (integerValue < 0) { + integerValue = 0; + } + return (NSUInteger)integerValue; + } +} + ++ (NSURL *)URLValue:(id)object +{ + if ([object isKindOfClass:[NSURL class]]) { + return (NSURL *)object; + } else if ([object isKindOfClass:[NSString class]]) { + return [[NSURL alloc] initWithString:(NSString *)object]; + } else { + return nil; + } +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +#pragma mark - Helper Methods + ++ (id)_objectValue:(id)object ofClass:(Class)expectedClass +{ + return ([object isKindOfClass:expectedClass] ? object : nil); +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h new file mode 100644 index 0000000..86fedc6 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h @@ -0,0 +1,56 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +typedef NS_OPTIONS(NSUInteger, FBSDKGraphRequestFlags) +{ + FBSDKGraphRequestFlagNone = 0, + // indicates this request should not use a client token as its token parameter + FBSDKGraphRequestFlagSkipClientToken = 1 << 1, + // indicates this request should not close the session if its response is an oauth error + FBSDKGraphRequestFlagDoNotInvalidateTokenOnError = 1 << 2, + // indicates this request should not perform error recovery + FBSDKGraphRequestFlagDisableErrorRecovery = 1 << 3, +}; +@interface FBSDKGraphRequest (Internal) + +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + flags:(FBSDKGraphRequestFlags)flags; +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + tokenString:(NSString *)tokenString + HTTPMethod:(NSString *)HTTPMethod + flags:(FBSDKGraphRequestFlags)flags; +// Generally, requests automatically issued by the SDK +// should not invalidate the token and should disableErrorRecovery +// so that we don't cause a sudden change in token state or trigger recovery +// out of context of any user action. +@property (nonatomic, assign) FBSDKGraphRequestFlags flags; + +- (BOOL)isGraphErrorRecoveryDisabled; +- (BOOL)hasAttachments; ++ (BOOL)isAttachment:(id)item; ++ (NSString *)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params + httpMethod:(NSString *)httpMethod; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h new file mode 100644 index 0000000..b61c782 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h @@ -0,0 +1,47 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +@class FBSDKGraphRequestDataAttachment; +@class FBSDKLogger; + +@interface FBSDKGraphRequestBody : NSObject + +@property (nonatomic, retain, readonly) NSData *data; + +- (void)appendWithKey:(NSString *)key + formValue:(NSString *)value + logger:(FBSDKLogger *)logger; + +- (void)appendWithKey:(NSString *)key + imageValue:(UIImage *)image + logger:(FBSDKLogger *)logger; + +- (void)appendWithKey:(NSString *)key + dataValue:(NSData *)data + logger:(FBSDKLogger *)logger; + +- (void)appendWithKey:(NSString *)key + dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)dataAttachment + logger:(FBSDKLogger *)logger; + ++ (NSString *)mimeContentType; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m new file mode 100644 index 0000000..5462576 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m @@ -0,0 +1,131 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGraphRequestBody.h" + +#import "FBSDKGraphRequestDataAttachment.h" +#import "FBSDKLogger.h" +#import "FBSDKSettings.h" + +#define kStringBoundary @"3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f" +#define kNewline @"\r\n" + +@implementation FBSDKGraphRequestBody +{ + NSMutableData *_data; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _data = [[NSMutableData alloc] init]; + } + + return self; +} + ++ (NSString *)mimeContentType +{ + return [NSString stringWithFormat:@"multipart/form-data; boundary=%@", kStringBoundary]; +} + +- (void)appendUTF8:(NSString *)utf8 +{ + if (![_data length]) { + NSString *headerUTF8 = [NSString stringWithFormat:@"--%@%@", kStringBoundary, kNewline]; + NSData *headerData = [headerUTF8 dataUsingEncoding:NSUTF8StringEncoding]; + [_data appendData:headerData]; + } + NSData *data = [utf8 dataUsingEncoding:NSUTF8StringEncoding]; + [_data appendData:data]; +} + +- (void)appendWithKey:(NSString *)key + formValue:(NSString *)value + logger:(FBSDKLogger *)logger +{ + [self _appendWithKey:key filename:nil contentType:nil contentBlock:^{ + [self appendUTF8:value]; + }]; + [logger appendFormat:@"\n %@:\t%@", key, (NSString *)value]; +} + +- (void)appendWithKey:(NSString *)key + imageValue:(UIImage *)image + logger:(FBSDKLogger *)logger +{ + NSData *data = UIImageJPEGRepresentation(image, [FBSDKSettings JPEGCompressionQuality]); + [self _appendWithKey:key filename:key contentType:@"image/jpeg" contentBlock:^{ + [_data appendData:data]; + }]; + [logger appendFormat:@"\n %@:\t", key, (unsigned long)([data length] / 1024)]; +} + +- (void)appendWithKey:(NSString *)key + dataValue:(NSData *)data + logger:(FBSDKLogger *)logger +{ + [self _appendWithKey:key filename:key contentType:@"content/unknown" contentBlock:^{ + [_data appendData:data]; + }]; + [logger appendFormat:@"\n %@:\t", key, (unsigned long)([data length] / 1024)]; +} + +- (void)appendWithKey:(NSString *)key + dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)dataAttachment + logger:(FBSDKLogger *)logger +{ + NSString *filename = dataAttachment.filename ?: key; + NSString *contentType = dataAttachment.contentType ?: @"content/unknown"; + NSData *data = dataAttachment.data; + [self _appendWithKey:key filename:filename contentType:contentType contentBlock:^{ + [_data appendData:data]; + }]; + [logger appendFormat:@"\n %@:\t", key, (unsigned long)([data length] / 1024)]; +} + +- (NSData *)data +{ + return [_data copy]; +} + +- (void)_appendWithKey:(NSString *)key + filename:(NSString *)filename + contentType:(NSString *)contentType + contentBlock:(void(^)(void))contentBlock +{ + NSMutableArray *disposition = [[NSMutableArray alloc] init]; + [disposition addObject:@"Content-Disposition: form-data"]; + if (key) { + [disposition addObject:[[NSString alloc] initWithFormat:@"name=\"%@\"", key]]; + } + if (filename) { + [disposition addObject:[[NSString alloc] initWithFormat:@"filename=\"%@\"", filename]]; + } + [self appendUTF8:[[NSString alloc] initWithFormat:@"%@%@", [disposition componentsJoinedByString:@"; "], kNewline]]; + if (contentType) { + [self appendUTF8:[[NSString alloc] initWithFormat:@"Content-Type: %@%@", contentType, kNewline]]; + } + [self appendUTF8:kNewline]; + if (contentBlock != NULL) { + contentBlock(); + } + [self appendUTF8:[[NSString alloc] initWithFormat:@"%@--%@%@", kNewline, kStringBoundary, kNewline]]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h new file mode 100644 index 0000000..c63688c --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKGraphRequestConnection(Internal) + +@property (nonatomic, readonly) NSMutableArray *requests; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h new file mode 100644 index 0000000..cd218c4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h @@ -0,0 +1,40 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +// Internal only class to facilitate FBSDKGraphRequest processing, specifically +// associating FBSDKGraphRequest and FBSDKGraphRequestHandler instances and necessary +// data for retry processing. +@interface FBSDKGraphRequestMetadata : NSObject + +@property (nonatomic, retain) FBSDKGraphRequest *request; +@property (nonatomic, copy) FBSDKGraphRequestHandler completionHandler; +@property (nonatomic, copy) NSDictionary *batchParameters; + +- (instancetype)initWithRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchParameters:(NSDictionary *)batchParameters +NS_DESIGNATED_INITIALIZER; + +- (void)invokeCompletionHandlerForConnection:(FBSDKGraphRequestConnection *)connection + withResults:(id)results + error:(NSError *)error; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m new file mode 100644 index 0000000..3b0ee78 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m @@ -0,0 +1,62 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGraphRequestMetadata.h" + +#import "FBSDKGraphRequest.h" +#import "FBSDKMacros.h" + +@implementation FBSDKGraphRequestMetadata + +- (instancetype)initWithRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchParameters:(NSDictionary *)batchParameters { + + if ((self = [super init])) { + _request = request; + _batchParameters = [batchParameters copy]; + _completionHandler = [handler copy]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:completionHandler:batchParameters:); + return [self initWithRequest:nil completionHandler:NULL batchParameters:nil]; +} + +- (void)invokeCompletionHandlerForConnection:(FBSDKGraphRequestConnection *)connection + withResults:(id)results + error:(NSError *)error { + if (self.completionHandler) { + self.completionHandler(connection, results, error); + } +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p, batchParameters: %@, completionHandler: %@, request: %@>", + NSStringFromClass([self class]), + self, + self.batchParameters, + self.completionHandler, + self.request.description]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h new file mode 100644 index 0000000..567f8ec --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h @@ -0,0 +1,30 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKCoreKit+Internal.h" + +@interface FBSDKGraphRequestPiggybackManager : NSObject + ++ (void)addPiggybackRequests:(FBSDKGraphRequestConnection *)connection; + ++ (void)addRefreshPiggyback:(FBSDKGraphRequestConnection *)connection permissionHandler:(FBSDKGraphRequestHandler)permissionHandler; + ++ (void)addRefreshPiggybackIfStale:(FBSDKGraphRequestConnection *)connection; + ++ (void)addServerConfigurationPiggyback:(FBSDKGraphRequestConnection *)connection; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m new file mode 100644 index 0000000..e0e4866 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m @@ -0,0 +1,140 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGraphRequestPiggybackManager.h" + +#import "FBSDKCoreKit+Internal.h" + +static int const FBSDKTokenRefreshThresholdSeconds = 24 * 60 * 60; // day +static int const FBSDKTokenRefreshRetrySeconds = 60 * 60; // hour + +@implementation FBSDKGraphRequestPiggybackManager + ++ (void)addPiggybackRequests:(FBSDKGraphRequestConnection *)connection +{ + if ([FBSDKSettings appID].length > 0) { + BOOL safeForPiggyback = YES; + for (FBSDKGraphRequestMetadata *metadata in connection.requests) { + if (![metadata.request.version isEqualToString:FBSDK_TARGET_PLATFORM_VERSION] || + [metadata.request hasAttachments]) { + safeForPiggyback = NO; + break; + } + } + if (safeForPiggyback) { + [[self class] addRefreshPiggybackIfStale:connection]; + [[self class] addServerConfigurationPiggyback:connection]; + } + } +} + ++ (void)addRefreshPiggyback:(FBSDKGraphRequestConnection *)connection permissionHandler:(FBSDKGraphRequestHandler)permissionHandler +{ + FBSDKAccessToken *expectedToken = [FBSDKAccessToken currentAccessToken]; + __block NSMutableSet *permissions = nil; + __block NSMutableSet *declinedPermissions = nil; + __block NSString *tokenString = nil; + __block NSNumber *expirationDateNumber = nil; + __block int expectingCallbacksCount = 2; + void (^expectingCallbackComplete)(void) = ^{ + if (--expectingCallbacksCount == 0) { + FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken]; + NSDate *expirationDate = currentToken.expirationDate; + if (expirationDateNumber) { + expirationDate = ([expirationDateNumber doubleValue] > 0 ? + [NSDate dateWithTimeIntervalSince1970:[expirationDateNumber doubleValue]] : + [NSDate distantFuture]); + } + FBSDKAccessToken *refreshedToken = [[FBSDKAccessToken alloc] initWithTokenString:tokenString ?: currentToken.tokenString + permissions:[(permissions ?: currentToken.permissions) allObjects] + declinedPermissions:[(declinedPermissions ?: currentToken.declinedPermissions) allObjects] + appID:currentToken.appID + userID:currentToken.userID + expirationDate:expirationDate + refreshDate:[NSDate date]]; + if (expectedToken == currentToken) { + [FBSDKAccessToken setCurrentAccessToken:refreshedToken]; + } + } + }; + FBSDKGraphRequest *extendRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"oauth/access_token" + parameters:@{@"grant_type" : @"fb_extend_sso_token", + @"fields": @"" + } + flags:FBSDKGraphRequestFlagDisableErrorRecovery]; + + [connection addRequest:extendRequest completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + tokenString = result[@"access_token"]; + expirationDateNumber = result[@"expires_at"]; + expectingCallbackComplete(); + }]; + FBSDKGraphRequest *permissionsRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" + parameters:@{@"fields": @""} + flags:FBSDKGraphRequestFlagDisableErrorRecovery]; + + [connection addRequest:permissionsRequest completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + if (!error) { + permissions = [NSMutableSet set]; + declinedPermissions = [NSMutableSet set]; + + [FBSDKInternalUtility extractPermissionsFromResponse:result + grantedPermissions:permissions + declinedPermissions:declinedPermissions]; + } + expectingCallbackComplete(); + if (permissionHandler) { + permissionHandler(innerConnection, result, error); + } + }]; +} + ++ (void)addRefreshPiggybackIfStale:(FBSDKGraphRequestConnection *)connection +{ + // don't piggy back more than once an hour as a cheap way of + // retrying in cases of errors and preventing duplicate refreshes. + // obviously this is not foolproof but is simple and sufficient. + static NSDate *lastRefreshTry; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lastRefreshTry = [NSDate distantPast]; + }); + + NSDate *now = [NSDate date]; + NSDate *tokenRefreshDate = [FBSDKAccessToken currentAccessToken].refreshDate; + if (tokenRefreshDate && + [now timeIntervalSinceDate:lastRefreshTry] > FBSDKTokenRefreshRetrySeconds && + [now timeIntervalSinceDate:tokenRefreshDate] > FBSDKTokenRefreshThresholdSeconds) { + [self addRefreshPiggyback:connection permissionHandler:NULL]; + lastRefreshTry = [NSDate date]; + } +} + ++ (void)addServerConfigurationPiggyback:(FBSDKGraphRequestConnection *)connection +{ + if (![[FBSDKServerConfigurationManager cachedServerConfiguration] isDefaults]) { + return; + } + NSString *appID = [FBSDKSettings appID]; + FBSDKGraphRequest *serverConfigurationRequest = [FBSDKServerConfigurationManager requestToLoadServerConfiguration:appID]; + [connection addRequest:serverConfigurationRequest + completionHandler:^(FBSDKGraphRequestConnection *conn, id result, NSError *error) { + [FBSDKServerConfigurationManager processLoadRequestResponse:result error:error appID:appID]; + }]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h new file mode 100644 index 0000000..cbe80a0 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h @@ -0,0 +1,51 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKURLConnection; + +typedef void (^FBSDKURLConnectionHandler)(FBSDKURLConnection *connection, + NSError *error, + NSURLResponse *response, + NSData *responseData); + +@protocol FBSDKURLConnectionDelegate + +@optional + +- (void)facebookURLConnection:(FBSDKURLConnection *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten + totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; + +@end + +@interface FBSDKURLConnection : NSObject + +- (FBSDKURLConnection *)initWithRequest:(NSURLRequest *)request + completionHandler:(FBSDKURLConnectionHandler)handler +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, assign) id delegate; + +- (void)cancel; +- (void)start; +- (void)setDelegateQueue:(NSOperationQueue *)queue; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m new file mode 100644 index 0000000..613fb8b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m @@ -0,0 +1,191 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKURLConnection.h" + +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKMacros.h" +#import "FBSDKSettings.h" + +@interface FBSDKURLConnection () + +@property (nonatomic, retain) NSURLConnection *connection; +@property (nonatomic, retain) NSMutableData *data; +@property (nonatomic, copy) FBSDKURLConnectionHandler handler; +@property (nonatomic, retain) NSURLResponse *response; +@property (nonatomic) unsigned long requestStartTime; +@property (nonatomic, readonly) NSUInteger loggerSerialNumber; + +@end + +@implementation FBSDKURLConnection + +#pragma mark - Lifecycle + +- (FBSDKURLConnection *)initWithRequest:(NSURLRequest *)request + completionHandler:(FBSDKURLConnectionHandler)handler { + if ((self = [super init])) { + _requestStartTime = [FBSDKInternalUtility currentTimeInMilliseconds]; + _loggerSerialNumber = [FBSDKLogger generateSerialNumber]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + _connection = [[NSURLConnection alloc] + initWithRequest:request + delegate:self + startImmediately:NO]; +#pragma clang diagnostic pop + _data = [[NSMutableData alloc] init]; + + _handler = [handler copy]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:completionHandler:); + return [self initWithRequest:nil completionHandler:NULL]; +} + +- (void)logAndInvokeHandler:(FBSDKURLConnectionHandler)handler + error:(NSError *)error { + if (error) { + NSString *logEntry = [NSString + stringWithFormat:@"FBSDKURLConnection <#%lu>:\n Error: '%@'\n%@\n", + (unsigned long)self.loggerSerialNumber, + [error localizedDescription], + [error userInfo]]; + + [self logMessage:logEntry]; + } + + [self invokeHandler:handler error:error response:nil responseData:nil]; +} + +- (void)logAndInvokeHandler:(FBSDKURLConnectionHandler)handler + response:(NSURLResponse *)response + responseData:(NSData *)responseData { + // Basic FBSDKURLConnection logging just prints out the URL. FBSDKGraphRequest logging provides more details. + NSString *mimeType = [response MIMEType]; + NSMutableString *mutableLogEntry = [NSMutableString stringWithFormat:@"FBSDKURLConnection <#%lu>:\n Duration: %lu msec\nResponse Size: %lu kB\n MIME type: %@\n", + (unsigned long)self.loggerSerialNumber, + [FBSDKInternalUtility currentTimeInMilliseconds] - self.requestStartTime, + (unsigned long)[responseData length] / 1024, + mimeType]; + + if ([mimeType isEqualToString:@"text/javascript"]) { + NSString *responseUTF8 = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; + [mutableLogEntry appendFormat:@" Response:\n%@\n\n", responseUTF8]; + } + + [self logMessage:mutableLogEntry]; + + [self invokeHandler:handler error:nil response:response responseData:responseData]; +} + +- (void)invokeHandler:(FBSDKURLConnectionHandler)handler + error:(NSError *)error + response:(NSURLResponse *)response + responseData:(NSData *)responseData { + if (handler != nil) { + handler(self, error, response, responseData); + } +} + +- (void)logMessage:(NSString *)message +{ + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorNetworkRequests formatString:@"%@", message]; +} + +- (void)cancel +{ + [self.connection cancel]; + self.handler = nil; +} + +- (void)connection:(NSURLConnection *)connection +didReceiveResponse:(NSURLResponse *)response +{ + self.response = response; + [self.data setLength:0]; +} + +- (void)connection:(NSURLResponse *)connection + didReceiveData:(NSData *)data { + [self.data appendData:data]; +} + +- (void)connection:(NSURLConnection *)connection + didFailWithError:(NSError *)error { + @try { + if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == kCFURLErrorSecureConnectionFailed) { + NSOperatingSystemVersion iOS9Version = { .majorVersion = 9, .minorVersion = 0, .patchVersion = 0 }; + if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS9Version]) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors + logEntry:@"WARNING: FBSDK secure network request failed. Please verify you have configured your " + "app for Application Transport Security compatibility described at https://developers.facebook.com/docs/ios/ios9"]; + } + } + [self logAndInvokeHandler:self.handler error:error]; + } @finally { + self.handler = nil; + } +} + +- (void)connectionDidFinishLoading:(NSURLConnection *)connection +{ + @try { + [self logAndInvokeHandler:self.handler response:self.response responseData:self.data]; + } @finally { + self.handler = nil; + } +} + +- (NSURLRequest *)connection:(NSURLConnection *)connection + willSendRequest:(NSURLRequest *)request + redirectResponse:(NSURLResponse *)redirectResponse { + return request; +} + +- (void) connection:(NSURLConnection *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite +{ + id delegate = self.delegate; + + if ([delegate respondsToSelector:@selector(facebookURLConnection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)]) { + [delegate facebookURLConnection:self + didSendBodyData:bytesWritten + totalBytesWritten:totalBytesWritten + totalBytesExpectedToWrite:totalBytesExpectedToWrite]; + } +} + +- (void)start +{ + [_connection start]; +} + +- (void)setDelegateQueue:(NSOperationQueue*)queue +{ + [_connection setDelegateQueue:queue]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h new file mode 100644 index 0000000..8913cc0 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h @@ -0,0 +1,34 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@interface FBSDKDialogConfiguration : NSObject + +- (instancetype)initWithName:(NSString *)name + URL:(NSURL *)URL + appVersions:(NSArray *)appVersions +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, copy, readonly) NSArray *appVersions; +@property (nonatomic, copy, readonly) NSString *name; +@property (nonatomic, copy, readonly) NSURL *URL; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m new file mode 100644 index 0000000..a8986c0 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m @@ -0,0 +1,78 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKDialogConfiguration.h" + +#import "FBSDKMacros.h" + +#define FBSDK_DIALOG_CONFIGURATION_APP_VERSIONS_KEY @"appVersions" +#define FBSDK_DIALOG_CONFIGURATION_NAME_KEY @"name" +#define FBSDK_DIALOG_CONFIGURATION_URL_KEY @"url" + +@implementation FBSDKDialogConfiguration + +#pragma mark - Object Lifecycle + +- (instancetype)initWithName:(NSString *)name URL:(NSURL *)URL appVersions:(NSArray *)appVersions +{ + if ((self = [super init])) { + _name = [name copy]; + _URL = [URL copy]; + _appVersions = [appVersions copy]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithName:URL:appVersions:); + return [self initWithName:nil URL:nil appVersions:nil]; +} + +#pragma mark NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *name = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_DIALOG_CONFIGURATION_NAME_KEY]; + NSURL *URL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_DIALOG_CONFIGURATION_URL_KEY]; + NSSet *appVersionsClasses = [NSSet setWithObjects:[NSArray class], [NSNumber class], nil]; + NSArray *appVersions = [decoder decodeObjectOfClasses:appVersionsClasses + forKey:FBSDK_DIALOG_CONFIGURATION_APP_VERSIONS_KEY]; + return [self initWithName:name URL:URL appVersions:appVersions]; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_appVersions forKey:FBSDK_DIALOG_CONFIGURATION_APP_VERSIONS_KEY]; + [encoder encodeObject:_name forKey:FBSDK_DIALOG_CONFIGURATION_NAME_KEY]; + [encoder encodeObject:_URL forKey:FBSDK_DIALOG_CONFIGURATION_URL_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + return self; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h new file mode 100644 index 0000000..ae8bce7 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h @@ -0,0 +1,36 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKErrorRecoveryConfiguration.h" + +@class FBSDKGraphRequest; + +// maps codes and subcodes pairs to FBSDKErrorRecoveryConfiguration instances. +@interface FBSDKErrorConfiguration : NSObject + +// initialize from optional dictionary of existing configurations. If not supplied a fallback will be created. +- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; + +// parses the array (supplied from app settings endpoint) +- (void)parseArray:(NSArray *)array; + +// NSString "code" instances support "*" wildcard semantics (nil is treated as "*" also) +// 'request' is optional, typically for identifying special graph request semantics (e.g., no recovery for client token) +- (FBSDKErrorRecoveryConfiguration *)recoveryConfigurationForCode:(NSString *)code subcode:(NSString *)subcode request:(FBSDKGraphRequest *)request; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m new file mode 100644 index 0000000..81589c4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m @@ -0,0 +1,176 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKErrorConfiguration.h" + +#import + +#import "FBSDKErrorRecoveryConfiguration.h" + +static NSString *const kErrorCategoryOther = @"other"; +static NSString *const kErrorCategoryTransient = @"transient"; +static NSString *const kErrorCategoryLogin = @"login"; + +#define FBSDKERRORCONFIGURATION_DICTIONARY_KEY @"configurationDictionary" + +@implementation FBSDKErrorConfiguration +{ + NSMutableDictionary *_configurationDictionary; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithDictionary:); + return [self initWithDictionary:nil]; +} + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary +{ + if ((self = [super init])) { + if (dictionary) { + _configurationDictionary = [NSMutableDictionary dictionaryWithDictionary:dictionary]; + } else { + _configurationDictionary = [NSMutableDictionary dictionary]; + NSString *localizedOK = + NSLocalizedStringWithDefaultValue(@"ErrorRecovery.OK", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"OK", + @"The title of the label to start attempting error recovery"); + NSString *localizedCancel = + NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Cancel", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"Cancel", + @"The title of the label to decline attempting error recovery"); + NSString *localizedTransientSuggestion = + NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Transient.Suggestion", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"The server is temporarily busy, please try again.", + @"The fallback message to display to retry transient errors"); + NSString *localizedLoginRecoverableSuggestion = + NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Login.Suggestion", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"Please log into this app again to reconnect your Facebook account.", + @"The fallback message to display to recover invalidated tokens"); + NSArray *fallbackArray = @[ + @{ @"name" : @"login", + @"items" : @[ @{ @"code" : @102 }, + @{ @"code" : @190 } ], + @"recovery_message" : localizedLoginRecoverableSuggestion, + @"recovery_options" : @[ localizedOK, localizedCancel] + }, + @{ @"name" : @"transient", + @"items" : @[ @{ @"code" : @1 }, + @{ @"code" : @2 }, + @{ @"code" : @4 }, + @{ @"code" : @9 }, + @{ @"code" : @17 }, + @{ @"code" : @341 } ], + @"recovery_message" : localizedTransientSuggestion, + @"recovery_options" : @[ localizedOK] + }, + ]; + [self parseArray:fallbackArray]; + } + } + return self; +} + +- (FBSDKErrorRecoveryConfiguration *)recoveryConfigurationForCode:(NSString *)code subcode:(NSString *)subcode request:(FBSDKGraphRequest *)request +{ + code = code ?: @"*"; + subcode = subcode ?: @"*"; + FBSDKErrorRecoveryConfiguration *configuration = (_configurationDictionary[code][subcode] ?: + _configurationDictionary[code][@"*"] ?: + _configurationDictionary[@"*"][subcode] ?: + _configurationDictionary[@"*"][@"*"]); + if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryRecoverable && + [FBSDKSettings clientToken] && + [request.parameters[@"access_token"] hasSuffix:[FBSDKSettings clientToken]]) { + // do not attempt to recovery client tokens. + return nil; + } + return configuration; +} + +- (void)parseArray:(NSArray *)array +{ + for (NSDictionary *dictionary in array) { + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { + FBSDKGraphRequestErrorCategory category; + NSString *action = dictionary[@"name"]; + if ([action isEqualToString:kErrorCategoryOther]) { + category = FBSDKGraphRequestErrorCategoryOther; + } else if ([action isEqualToString:kErrorCategoryTransient]) { + category = FBSDKGraphRequestErrorCategoryTransient; + } else { + category = FBSDKGraphRequestErrorCategoryRecoverable; + } + NSString *suggestion = dictionary[@"recovery_message"]; + NSArray *options = dictionary[@"recovery_options"]; + for (NSDictionary *codeSubcodesDictionary in dictionary[@"items"]) { + NSString *code = [codeSubcodesDictionary[@"code"] stringValue]; + + NSMutableDictionary *currentSubcodes = _configurationDictionary[code]; + if (!currentSubcodes) { + currentSubcodes = [NSMutableDictionary dictionary]; + _configurationDictionary[code] = currentSubcodes; + } + + NSArray *subcodes = codeSubcodesDictionary[@"subcodes"]; + if (subcodes.count > 0) { + for (NSNumber *subcodeNumber in subcodes) { + currentSubcodes[[subcodeNumber stringValue]] = [[FBSDKErrorRecoveryConfiguration alloc] + initWithRecoveryDescription:suggestion + optionDescriptions:options + category:category + recoveryActionName:action]; + } + } else { + currentSubcodes[@"*"] = [[FBSDKErrorRecoveryConfiguration alloc] + initWithRecoveryDescription:suggestion + optionDescriptions:options + category:category + recoveryActionName:action]; + } + } + }]; + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSDictionary *configurationDictionary = [decoder decodeObjectOfClass:[NSDictionary class] forKey:FBSDKERRORCONFIGURATION_DICTIONARY_KEY]; + return [self initWithDictionary:configurationDictionary]; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_configurationDictionary forKey:FBSDKERRORCONFIGURATION_DICTIONARY_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + return self; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h new file mode 100644 index 0000000..105618f --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +//immutable +@interface FBSDKErrorRecoveryConfiguration : NSObject + +@property (nonatomic, readonly) NSString *localizedRecoveryDescription; +@property (nonatomic, readonly) NSArray *localizedRecoveryOptionDescriptions; +@property (nonatomic, readonly) FBSDKGraphRequestErrorCategory errorCategory; +@property (nonatomic, readonly) NSString *recoveryActionName; + +- (instancetype)initWithRecoveryDescription:(NSString *)description + optionDescriptions:(NSArray *)optionDescriptions + category:(FBSDKGraphRequestErrorCategory)category + recoveryActionName:(NSString *)recoveryActionName NS_DESIGNATED_INITIALIZER; +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m new file mode 100644 index 0000000..3c0642d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m @@ -0,0 +1,86 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKErrorRecoveryConfiguration.h" + +#define FBSDK_ERROR_RECOVERY_CONFIGURATION_DESCRIPTION_KEY @"description" +#define FBSDK_ERROR_RECOVERY_CONFIGURATION_OPTIONS_KEY @"options" +#define FBSDK_ERROR_RECOVERY_CONFIGURATION_CATEGORY_KEY @"category" +#define FBSDK_ERROR_RECOVERY_CONFIGURATION_ACTION_KEY @"action" + +@implementation FBSDKErrorRecoveryConfiguration + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRecoveryDescription:optionDescriptions:category:recoveryActionName:); + return [self initWithRecoveryDescription:nil + optionDescriptions:nil + category:0 + recoveryActionName:nil]; +} + +- (instancetype)initWithRecoveryDescription:(NSString *)description + optionDescriptions:(NSArray *)optionDescriptions + category:(FBSDKGraphRequestErrorCategory)category + recoveryActionName:(NSString *)recoveryActionName { + if ((self = [super init])) { + _localizedRecoveryDescription = [description copy]; + _localizedRecoveryOptionDescriptions = [optionDescriptions copy]; + _errorCategory = category; + _recoveryActionName = [recoveryActionName copy]; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *description = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_DESCRIPTION_KEY]; + NSArray *options = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_OPTIONS_KEY]; + NSNumber *category = [decoder decodeObjectOfClass:[NSNumber class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_CATEGORY_KEY]; + NSString *action = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_ACTION_KEY]; + + return [self initWithRecoveryDescription:description + optionDescriptions:options + category:[category unsignedIntegerValue] + recoveryActionName:action]; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_localizedRecoveryDescription forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_DESCRIPTION_KEY]; + [encoder encodeObject:_localizedRecoveryOptionDescriptions forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_OPTIONS_KEY]; + [encoder encodeObject:@(_errorCategory) forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_CATEGORY_KEY]; + [encoder encodeObject:_recoveryActionName forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_ACTION_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + //immutable + return self; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h new file mode 100644 index 0000000..5096c03 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +extern NSString *const FBSDKDialogConfigurationNameDefault; +extern NSString *const FBSDKDialogConfigurationNameSharing; + +extern NSString *const FBSDKDialogConfigurationFeatureUseNativeFlow; +extern NSString *const FBSDKDialogConfigurationFeatureUseSafariViewController; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h new file mode 100644 index 0000000..9cd1825 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h @@ -0,0 +1,74 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKDialogConfiguration.h" +#import "FBSDKErrorConfiguration.h" + +// login kit +extern NSString *const FBSDKDialogConfigurationNameLogin; + +// share kit +extern NSString *const FBSDKDialogConfigurationNameAppInvite; +extern NSString *const FBSDKDialogConfigurationNameGameRequest; +extern NSString *const FBSDKDialogConfigurationNameGroup; +extern NSString *const FBSDKDialogConfigurationNameLike; +extern NSString *const FBSDKDialogConfigurationNameMessage; +extern NSString *const FBSDKDialogConfigurationNameShare; + +@interface FBSDKServerConfiguration : NSObject + +- (instancetype)initWithAppID:(NSString *)appID + appName:(NSString *)appName + loginTooltipEnabled:(BOOL)loginTooltipEnabled + loginTooltipText:(NSString *)loginTooltipText + defaultShareMode:(NSString *)defaultShareMode + advertisingIDEnabled:(BOOL)advertisingIDEnabled + implicitLoggingEnabled:(BOOL)implicitLoggingEnabled +implicitPurchaseLoggingEnabled:(BOOL)implicitPurchaseLoggingEnabled + systemAuthenticationEnabled:(BOOL)systemAuthenticationEnabled + nativeAuthFlowEnabled:(BOOL)nativeAuthFlowEnabled + dialogConfigurations:(NSDictionary *)dialogConfigurations + dialogFlows:(NSDictionary *)dialogFlows + timestamp:(NSDate *)timestamp + errorConfiguration:(FBSDKErrorConfiguration *)errorConfiguration + defaults:(BOOL)defaults +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, assign, readonly, getter=isAdvertisingIDEnabled) BOOL advertisingIDEnabled; +@property (nonatomic, copy, readonly) NSString *appID; +@property (nonatomic, copy, readonly) NSString *appName; +@property (nonatomic, assign, readonly, getter=isDefaults) BOOL defaults; +@property (nonatomic, copy, readonly) NSString *defaultShareMode; +@property (nonatomic, strong, readonly) FBSDKErrorConfiguration *errorConfiguration; +@property (nonatomic, assign, readonly, getter=isImplicitLoggingSupported) BOOL implicitLoggingEnabled; +@property (nonatomic, assign, readonly, getter=isImplicitPurchaseLoggingSupported) BOOL implicitPurchaseLoggingEnabled; +@property (nonatomic, assign, readonly, getter=isLoginTooltipEnabled) BOOL loginTooltipEnabled; +@property (nonatomic, assign, readonly, getter=isNativeAuthFlowEnabled) BOOL nativeAuthFlowEnabled; +@property (nonatomic, assign, readonly, getter=isSystemAuthenticationEnabled) BOOL systemAuthenticationEnabled; +@property (nonatomic, copy, readonly) NSString *loginTooltipText; +@property (nonatomic, copy, readonly) NSDate *timestamp; + +- (FBSDKDialogConfiguration *)dialogConfigurationForDialogName:(NSString *)dialogName; +- (BOOL)useNativeDialogForDialogName:(NSString *)dialogName; +- (BOOL)useSafariViewControllerForDialogName:(NSString *)dialogName; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m new file mode 100644 index 0000000..5faac5b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m @@ -0,0 +1,219 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKServerConfiguration.h" +#import "FBSDKServerConfiguration+Internal.h" + +#import "FBSDKInternalUtility.h" +#import "FBSDKMacros.h" + +#define FBSDK_SERVER_CONFIGURATION_ADVERTISING_ID_ENABLED_KEY @"advertisingIDEnabled" +#define FBSDK_SERVER_CONFIGURATION_APP_ID_KEY @"appID" +#define FBSDK_SERVER_CONFIGURATION_APP_NAME_KEY @"appName" +#define FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_KEY @"dialogConfigs" +#define FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_KEY @"dialogFlows" +#define FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGS_KEY @"errorConfigs" +#define FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_KEY @"implicitLoggingEnabled" +#define FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_KEY @"defaultShareMode" +#define FBSDK_SERVER_CONFIGURATION_IMPLICIT_PURCHASE_LOGGING_ENABLED_KEY @"implicitPurchaseLoggingEnabled" +#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_KEY @"loginTooltipEnabled" +#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_KEY @"loginTooltipText" +#define FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_KEY @"systemAuthenticationEnabled" +#define FBSDK_SERVER_CONFIGURATION_NATIVE_AUTH_FLOW_ENABLED_KEY @"nativeAuthFlowEnabled" +#define FBSDK_SERVER_CONFIGURATION_TIMESTAMP_KEY @"timestamp" + +#pragma mark - Dialog Names + +NSString *const FBSDKDialogConfigurationNameDefault = @"default"; + +NSString *const FBSDKDialogConfigurationNameLogin = @"login"; + +NSString *const FBSDKDialogConfigurationNameSharing = @"sharing"; + +NSString *const FBSDKDialogConfigurationNameAppInvite = @"app_invite"; +NSString *const FBSDKDialogConfigurationNameGameRequest = @"game_request"; +NSString *const FBSDKDialogConfigurationNameGroup = @"group"; +NSString *const FBSDKDialogConfigurationNameLike = @"like"; +NSString *const FBSDKDialogConfigurationNameMessage = @"message"; +NSString *const FBSDKDialogConfigurationNameShare = @"share"; + +NSString *const FBSDKDialogConfigurationFeatureUseNativeFlow = @"use_native_flow"; +NSString *const FBSDKDialogConfigurationFeatureUseSafariViewController = @"use_safari_vc"; + +@implementation FBSDKServerConfiguration +{ + NSDictionary *_dialogConfigurations; + NSDictionary *_dialogFlows; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init NS_UNAVAILABLE +{ + assert(0); +} + +- (instancetype)initWithAppID:(NSString *)appID + appName:(NSString *)appName + loginTooltipEnabled:(BOOL)loginTooltipEnabled + loginTooltipText:(NSString *)loginTooltipText + defaultShareMode:(NSString*)defaultShareMode + advertisingIDEnabled:(BOOL)advertisingIDEnabled + implicitLoggingEnabled:(BOOL)implicitLoggingEnabled +implicitPurchaseLoggingEnabled:(BOOL)implicitPurchaseLoggingEnabled + systemAuthenticationEnabled:(BOOL)systemAuthenticationEnabled + nativeAuthFlowEnabled:(BOOL)nativeAuthFlowEnabled + dialogConfigurations:(NSDictionary *)dialogConfigurations + dialogFlows:(NSDictionary *)dialogFlows + timestamp:(NSDate *)timestamp + errorConfiguration:(FBSDKErrorConfiguration *)errorConfiguration + defaults:(BOOL)defaults +{ + if ((self = [super init])) { + _appID = [appID copy]; + _appName = [appName copy]; + _loginTooltipEnabled = loginTooltipEnabled; + _loginTooltipText = [loginTooltipText copy]; + _defaultShareMode = defaultShareMode; + _advertisingIDEnabled = advertisingIDEnabled; + _implicitLoggingEnabled = implicitLoggingEnabled; + _implicitPurchaseLoggingEnabled = implicitPurchaseLoggingEnabled; + _systemAuthenticationEnabled = systemAuthenticationEnabled; + _nativeAuthFlowEnabled = nativeAuthFlowEnabled; + _dialogConfigurations = [dialogConfigurations copy]; + _dialogFlows = [dialogFlows copy]; + _timestamp = [timestamp copy]; + _errorConfiguration = [errorConfiguration copy]; + _defaults = defaults; + } + return self; +} + +#pragma mark - Public Methods + +- (FBSDKDialogConfiguration *)dialogConfigurationForDialogName:(NSString *)dialogName +{ + return _dialogConfigurations[dialogName]; +} + +- (BOOL)useNativeDialogForDialogName:(NSString *)dialogName +{ + return [self _useFeatureWithKey:FBSDKDialogConfigurationFeatureUseNativeFlow dialogName:dialogName]; +} + +- (BOOL)useSafariViewControllerForDialogName:(NSString *)dialogName +{ + return [self _useFeatureWithKey:FBSDKDialogConfigurationFeatureUseSafariViewController dialogName:dialogName]; +} + +#pragma mark - Helper Methods + +- (BOOL)_useFeatureWithKey:(NSString *)key dialogName:(NSString *)dialogName +{ + if ([dialogName isEqualToString:FBSDKDialogConfigurationNameLogin]) { + return [(NSNumber *)(_dialogFlows[dialogName][key] ?: + _dialogFlows[FBSDKDialogConfigurationNameDefault][key]) boolValue]; + } else { + return [(NSNumber *)(_dialogFlows[dialogName][key] ?: + _dialogFlows[FBSDKDialogConfigurationNameSharing][key] ?: + _dialogFlows[FBSDKDialogConfigurationNameDefault][key]) boolValue]; + } +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SERVER_CONFIGURATION_APP_ID_KEY]; + NSString *appName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SERVER_CONFIGURATION_APP_NAME_KEY]; + BOOL loginTooltipEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_KEY]; + NSString *loginTooltipText = [decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_KEY]; + NSString *defaultShareMode = [decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_KEY]; + BOOL advertisingIDEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_ADVERTISING_ID_ENABLED_KEY]; + BOOL implicitLoggingEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_KEY]; + BOOL implicitPurchaseLoggingEnabbled = + [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_PURCHASE_LOGGING_ENABLED_KEY]; + BOOL systemAuthenticationEnabled = + [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_KEY]; + BOOL nativeAuthFlowEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_NATIVE_AUTH_FLOW_ENABLED_KEY]; + NSDate *timestamp = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_SERVER_CONFIGURATION_TIMESTAMP_KEY]; + NSSet *dialogConfigurationsClasses = [[NSSet alloc] initWithObjects: + [NSDictionary class], + [FBSDKDialogConfiguration class], + nil]; + NSDictionary *dialogConfigurations = [decoder decodeObjectOfClasses:dialogConfigurationsClasses + forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_KEY]; + NSSet *dialogFlowsClasses = [[NSSet alloc] initWithObjects: + [NSDictionary class], + [NSString class], + [NSNumber class], + nil]; + NSDictionary *dialogFlows = [decoder decodeObjectOfClasses:dialogFlowsClasses + forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_KEY]; + FBSDKErrorConfiguration *errorConfiguration = [decoder decodeObjectOfClass:[FBSDKErrorConfiguration class] forKey:FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGS_KEY]; + return [self initWithAppID:appID + appName:appName + loginTooltipEnabled:loginTooltipEnabled + loginTooltipText:loginTooltipText + defaultShareMode:defaultShareMode + advertisingIDEnabled:advertisingIDEnabled + implicitLoggingEnabled:implicitLoggingEnabled +implicitPurchaseLoggingEnabled:implicitPurchaseLoggingEnabbled + systemAuthenticationEnabled:systemAuthenticationEnabled + nativeAuthFlowEnabled:nativeAuthFlowEnabled + dialogConfigurations:dialogConfigurations + dialogFlows:dialogFlows + timestamp:timestamp + errorConfiguration:errorConfiguration + defaults:NO]; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeBool:_advertisingIDEnabled forKey:FBSDK_SERVER_CONFIGURATION_ADVERTISING_ID_ENABLED_KEY]; + [encoder encodeObject:_appID forKey:FBSDK_SERVER_CONFIGURATION_APP_ID_KEY]; + [encoder encodeObject:_appName forKey:FBSDK_SERVER_CONFIGURATION_APP_NAME_KEY]; + [encoder encodeObject:_defaultShareMode forKey:FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_KEY]; + [encoder encodeObject:_dialogConfigurations forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_KEY]; + [encoder encodeObject:_dialogFlows forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_KEY]; + [encoder encodeObject:_errorConfiguration forKey:FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGS_KEY]; + [encoder encodeBool:_implicitLoggingEnabled forKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_KEY]; + [encoder encodeBool:_implicitPurchaseLoggingEnabled + forKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_PURCHASE_LOGGING_ENABLED_KEY]; + [encoder encodeBool:_loginTooltipEnabled forKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_KEY]; + [encoder encodeObject:_loginTooltipText forKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_KEY]; + [encoder encodeBool:_nativeAuthFlowEnabled forKey:FBSDK_SERVER_CONFIGURATION_NATIVE_AUTH_FLOW_ENABLED_KEY]; + [encoder encodeBool:_systemAuthenticationEnabled forKey:FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_KEY]; + [encoder encodeObject:_timestamp forKey:FBSDK_SERVER_CONFIGURATION_TIMESTAMP_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + return self; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h new file mode 100644 index 0000000..1edec6f --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKServerConfigurationManager.h" + +@class FBSDKGraphRequest; + +@interface FBSDKServerConfigurationManager () + ++ (void)processLoadRequestResponse:(id)result error:(NSError *)error appID:(NSString *)appID; + ++ (FBSDKGraphRequest *)requestToLoadServerConfiguration:(NSString *)appID; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h new file mode 100644 index 0000000..ed79efb --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h @@ -0,0 +1,40 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKServerConfiguration.h" + +typedef void(^FBSDKServerConfigurationManagerLoadBlock)(FBSDKServerConfiguration *serverConfiguration, NSError *error); + +@interface FBSDKServerConfigurationManager : NSObject + +/** + @abstract Returns the locally cached configuration. + @discussion The result will be valid for the appID from FBSDKSettings, but may be expired. A network request will be + initiated to update the configuration if a valid and unexpired configuration is not available. + */ ++ (FBSDKServerConfiguration *)cachedServerConfiguration; + +/** + @abstract Executes the completionBlock with a valid and current configuration when it is available. + @discussion This method will use a cached configuration if it is valid and not expired. + */ ++ (void)loadServerConfigurationWithCompletionBlock:(FBSDKServerConfigurationManagerLoadBlock)completionBlock; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m new file mode 100644 index 0000000..116e235 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m @@ -0,0 +1,357 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKServerConfigurationManager+Internal.h" + +#import "FBSDKGraphRequest+Internal.h" +#import "FBSDKGraphRequest.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKLogger.h" +#import "FBSDKServerConfiguration+Internal.h" +#import "FBSDKServerConfiguration.h" +#import "FBSDKSettings.h" +#import "FBSDKTypeUtility.h" + +// one hour +#define FBSDK_SERVER_CONFIGURATION_MANAGER_CACHE_TIMEOUT (60 * 60) + +#define FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY @"com.facebook.sdk:serverConfiguration%@" + +#define FBSDK_SERVER_CONFIGURATION_APP_EVENTS_FEATURES_FIELD @"app_events_feature_bitmask" +#define FBSDK_SERVER_CONFIGURATION_APP_NAME_FIELD @"name" +#define FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_FIELD @"default_share_mode" +#define FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_FIELD @"ios_dialog_configs" +#define FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_FIELD @"ios_sdk_dialog_flows" +#define FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGURATION_FIELD @"ios_sdk_error_categories" +#define FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_FIELD @"supports_implicit_sdk_logging" +#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_FIELD @"gdpv4_nux_enabled" +#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_FIELD @"gdpv4_nux_content" +#define FBSDK_SERVER_CONFIGURATION_NATIVE_PROXY_AUTH_FLOW_ENABLED_FIELD @"ios_supports_native_proxy_auth_flow" +#define FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_FIELD @"ios_supports_system_auth" + +@implementation FBSDKServerConfigurationManager + +static NSMutableArray *_completionBlocks; +static BOOL _loadingServerConfiguration; +static FBSDKServerConfiguration *_serverConfiguration; +static NSError *_serverConfigurationError; +static NSDate *_serverConfigurationErrorTimestamp; +static const NSTimeInterval kTimeout = 4.0; + +typedef NS_OPTIONS(NSUInteger, FBSDKServerConfigurationManagerAppEventsFeatures) +{ + FBSDKServerConfigurationManagerAppEventsFeaturesNone = 0, + FBSDKServerConfigurationManagerAppEventsFeaturesAdvertisingIDEnabled = 1 << 0, + FBSDKServerConfigurationManagerAppEventsFeaturesImplicitPurchaseLoggingEnabled = 1 << 1, +}; + +#pragma mark - Public Class Methods + ++ (void)initialize +{ + if (self == [FBSDKServerConfigurationManager class]) { + _completionBlocks = [[NSMutableArray alloc] init]; + } +} + ++ (FBSDKServerConfiguration *)cachedServerConfiguration +{ + NSString *appID = [FBSDKSettings appID]; + @synchronized(self) { + // load the server configuration if we don't have it already + [self loadServerConfigurationWithCompletionBlock:NULL]; + + // use whatever configuration we have or the default + return _serverConfiguration ?: [self _defaultServerConfigurationForAppID:appID]; + } +} + ++ (void)loadServerConfigurationWithCompletionBlock:(FBSDKServerConfigurationManagerLoadBlock)completionBlock +{ + void (^loadBlock)(void) = NULL; + NSString *appID = [FBSDKSettings appID]; + @synchronized(self) { + // validate the cached configuration has the correct appID + if (_serverConfiguration && ![_serverConfiguration.appID isEqualToString:appID]) { + _serverConfiguration = nil; + _serverConfigurationError = nil; + _serverConfigurationErrorTimestamp = nil; + } + + // load the configuration from NSUserDefaults + if (!_serverConfiguration) { + // load the defaults + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *defaultsKey = [NSString stringWithFormat:FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY, appID]; + NSData *data = [defaults objectForKey:defaultsKey]; + if ([data isKindOfClass:[NSData class]]) { + // decode the configuration + FBSDKServerConfiguration *serverConfiguration = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + if ([serverConfiguration isKindOfClass:[FBSDKServerConfiguration class]]) { + // ensure that the configuration points to the current appID + if ([serverConfiguration.appID isEqualToString:appID]) { + _serverConfiguration = serverConfiguration; + } + } + } + } + + if ((_serverConfiguration && [self _serverConfigurationTimestampIsValid:_serverConfiguration.timestamp]) || + (_serverConfigurationErrorTimestamp && [self _serverConfigurationTimestampIsValid:_serverConfigurationErrorTimestamp])) { + // we have a valid server configuration, use that + loadBlock = [self _wrapperBlockForLoadBlock:completionBlock]; + } else { + // hold onto the completion block + [FBSDKInternalUtility array:_completionBlocks addObject:[completionBlock copy]]; + + // check if we are already loading + if (!_loadingServerConfiguration) { + // load the configuration from the network + _loadingServerConfiguration = YES; + FBSDKGraphRequest *request = [[self class] requestToLoadServerConfiguration:appID]; + + // start request with specified timeout instead of the default 180s + FBSDKGraphRequestConnection *requestConnection = [[FBSDKGraphRequestConnection alloc] init]; + requestConnection.timeout = kTimeout; + [requestConnection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + [self processLoadRequestResponse:result error:error appID:appID]; + }]; + [requestConnection start]; + } + } + } + + if (loadBlock != NULL) { + loadBlock(); + } +} + +#pragma mark - Internal Class Methods + ++ (void)processLoadRequestResponse:(id)result error:(NSError *)error appID:(NSString *)appID +{ + if (error) { + [self _didProcessConfigurationFromNetwork:nil appID:appID error:error]; + return; + } + + NSDictionary *resultDictionary = [FBSDKTypeUtility dictionaryValue:result]; + NSUInteger appEventsFeatures = [FBSDKTypeUtility unsignedIntegerValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_APP_EVENTS_FEATURES_FIELD]]; + BOOL advertisingIDEnabled = (appEventsFeatures & FBSDKServerConfigurationManagerAppEventsFeaturesAdvertisingIDEnabled); + BOOL implicitPurchaseLoggingEnabled = (appEventsFeatures & FBSDKServerConfigurationManagerAppEventsFeaturesImplicitPurchaseLoggingEnabled); + + NSString *appName = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_APP_NAME_FIELD]]; + BOOL loginTooltipEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_FIELD]]; + NSString *loginTooltipText = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_FIELD]]; + NSString *defaultShareMode = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_FIELD]]; + BOOL implicitLoggingEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_FIELD]]; + BOOL systemAuthenticationEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_FIELD]]; + BOOL nativeAuthFlowEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_NATIVE_PROXY_AUTH_FLOW_ENABLED_FIELD]]; + NSDictionary *dialogConfigurations = [FBSDKTypeUtility dictionaryValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_FIELD]]; + dialogConfigurations = [self _parseDialogConfigurations:dialogConfigurations]; + NSDictionary *dialogFlows = [FBSDKTypeUtility dictionaryValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_FIELD]]; + FBSDKErrorConfiguration *errorConfiguration = [[FBSDKErrorConfiguration alloc] initWithDictionary:nil]; + [errorConfiguration parseArray:resultDictionary[FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGURATION_FIELD]]; + FBSDKServerConfiguration *serverConfiguration = [[FBSDKServerConfiguration alloc] initWithAppID:appID + appName:appName + loginTooltipEnabled:loginTooltipEnabled + loginTooltipText:loginTooltipText + defaultShareMode:defaultShareMode + advertisingIDEnabled:advertisingIDEnabled + implicitLoggingEnabled:implicitLoggingEnabled + implicitPurchaseLoggingEnabled:implicitPurchaseLoggingEnabled + systemAuthenticationEnabled:systemAuthenticationEnabled + nativeAuthFlowEnabled:nativeAuthFlowEnabled + dialogConfigurations:dialogConfigurations + dialogFlows:dialogFlows + timestamp:[NSDate date] + errorConfiguration:errorConfiguration + defaults:NO]; + [self _didProcessConfigurationFromNetwork:serverConfiguration appID:appID error:nil]; +} + ++ (FBSDKGraphRequest *)requestToLoadServerConfiguration:(NSString *)appID +{ + NSOperatingSystemVersion operatingSystemVersion = [FBSDKInternalUtility operatingSystemVersion]; + NSString *dialogFlowsField = [NSString stringWithFormat:@"%@.os_version(%ti.%ti.%ti)", + FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_FIELD, + operatingSystemVersion.majorVersion, + operatingSystemVersion.minorVersion, + operatingSystemVersion.patchVersion]; + NSArray *fields = @[FBSDK_SERVER_CONFIGURATION_APP_EVENTS_FEATURES_FIELD, + FBSDK_SERVER_CONFIGURATION_APP_NAME_FIELD, + FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_FIELD, + FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_FIELD, + dialogFlowsField, + FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGURATION_FIELD, + FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_FIELD, + FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_FIELD, + FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_FIELD, + FBSDK_SERVER_CONFIGURATION_NATIVE_PROXY_AUTH_FLOW_ENABLED_FIELD, + FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_FIELD, + ]; + NSDictionary *parameters = @{ @"fields": [fields componentsJoinedByString:@","] }; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:appID + parameters:parameters + tokenString:nil + HTTPMethod:nil + flags:FBSDKGraphRequestFlagSkipClientToken | FBSDKGraphRequestFlagDisableErrorRecovery]; + return request; +} + +#pragma mark - Helper Class Methods + ++ (FBSDKServerConfiguration *)_defaultServerConfigurationForAppID:(NSString *)appID +{ + // Use a default configuration while we do not have a configuration back from the server. This allows us to set + // the default values for any of the dialog sets or anything else in a centralized location while we are waiting for + // the server to respond. + static FBSDKServerConfiguration *_defaultServerConfiguration = nil; + if (![_defaultServerConfiguration.appID isEqualToString:appID]) { + // Bypass the native dialog flow for iOS 9+, as it produces a series of additional confirmation dialogs that lead to + // extra friction that is not desirable. + NSOperatingSystemVersion iOS9Version = { .majorVersion = 9, .minorVersion = 0, .patchVersion = 0 }; + BOOL useNativeFlow = ![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS9Version]; + // Also enable SFSafariViewController by default. + NSDictionary *dialogFlows = @{ + FBSDKDialogConfigurationNameDefault: @{ + FBSDKDialogConfigurationFeatureUseNativeFlow: @(useNativeFlow), + FBSDKDialogConfigurationFeatureUseSafariViewController: @YES, + }, + FBSDKDialogConfigurationNameMessage: @{ + FBSDKDialogConfigurationFeatureUseNativeFlow: @YES, + }, + }; + _defaultServerConfiguration = [[FBSDKServerConfiguration alloc] initWithAppID:appID + appName:nil + loginTooltipEnabled:NO + loginTooltipText:nil + defaultShareMode:nil + advertisingIDEnabled:NO + implicitLoggingEnabled:NO + implicitPurchaseLoggingEnabled:NO + systemAuthenticationEnabled:NO + nativeAuthFlowEnabled:NO + dialogConfigurations:nil + dialogFlows:dialogFlows + timestamp:nil + errorConfiguration:nil + defaults:YES]; + } + return _defaultServerConfiguration; +} + ++ (void)_didProcessConfigurationFromNetwork:(FBSDKServerConfiguration *)serverConfiguration + appID:(NSString *)appID + error:(NSError *)error +{ + NSMutableArray *completionBlocks = [[NSMutableArray alloc] init]; + @synchronized(self) { + if (error) { + // Only set the error if we don't have previously fetched app settings. + // (i.e., if we have app settings and a new call gets an error, we'll + // ignore the error and surface the last successfully fetched settings). + if (_serverConfiguration && [_serverConfiguration.appID isEqualToString:appID]) { + // We have older app settings but the refresh received an error. + // Log and ignore the error. + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational + formatString:@"loadServerConfigurationWithCompletionBlock failed with %@", error]; + } else { + _serverConfiguration = nil; + } + _serverConfigurationError = error; + _serverConfigurationErrorTimestamp = [NSDate date]; + } else { + _serverConfiguration = serverConfiguration; + _serverConfigurationError = nil; + _serverConfigurationErrorTimestamp = nil; + } + + // update the cached copy in NSUserDefaults + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *defaultsKey = [NSString stringWithFormat:FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY, appID]; + if (serverConfiguration) { + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:serverConfiguration]; + [defaults setObject:data forKey:defaultsKey]; + } + + // wrap the completion blocks + for (FBSDKServerConfigurationManagerLoadBlock completionBlock in _completionBlocks) { + [completionBlocks addObject:[self _wrapperBlockForLoadBlock:completionBlock]]; + } + [_completionBlocks removeAllObjects]; + _loadingServerConfiguration = NO; + } + + // release the lock before calling out of this class + for (void (^completionBlock)(void) in completionBlocks) { + completionBlock(); + } +} + ++ (NSDictionary *)_parseDialogConfigurations:(NSDictionary *)dictionary +{ + NSMutableDictionary *dialogConfigurations = [[NSMutableDictionary alloc] init]; + NSArray *dialogConfigurationsArray = [FBSDKTypeUtility arrayValue:dictionary[@"data"]]; + for (id dialogConfiguration in dialogConfigurationsArray) { + NSDictionary *dialogConfigurationDictionary = [FBSDKTypeUtility dictionaryValue:dialogConfiguration]; + if (dialogConfigurationDictionary) { + NSString *name = [FBSDKTypeUtility stringValue:dialogConfigurationDictionary[@"name"]]; + if ([name length]) { + NSURL *URL = [FBSDKTypeUtility URLValue:dialogConfigurationDictionary[@"url"]]; + NSArray *appVersions = [FBSDKTypeUtility arrayValue:dialogConfigurationDictionary[@"versions"]]; + dialogConfigurations[name] = [[FBSDKDialogConfiguration alloc] initWithName:name + URL:URL + appVersions:appVersions]; + } + } + } + return dialogConfigurations; +} + ++ (BOOL)_serverConfigurationTimestampIsValid:(NSDate *)timestamp +{ + return ([[NSDate date] timeIntervalSinceDate:timestamp] < FBSDK_SERVER_CONFIGURATION_MANAGER_CACHE_TIMEOUT); +} + ++ (void(^)(void))_wrapperBlockForLoadBlock:(FBSDKServerConfigurationManagerLoadBlock)loadBlock +{ + if (loadBlock == NULL) { + return NULL; + } + + // create local vars to capture the current values from the ivars to allow this wrapper to be called outside of a lock + FBSDKServerConfiguration *serverConfiguration; + NSError *serverConfigurationError; + @synchronized(self) { + serverConfiguration = _serverConfiguration; + serverConfigurationError = _serverConfigurationError; + } + return ^{ + loadBlock(serverConfiguration, serverConfigurationError); + }; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + return nil; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h new file mode 100644 index 0000000..0d7a492 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h @@ -0,0 +1,27 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKAccessTokenCaching.h" + +@interface FBSDKAccessTokenCache : NSObject + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m new file mode 100644 index 0000000..aeb1103 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m @@ -0,0 +1,82 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessTokenCache.h" + +#import "FBSDKAccessTokenCacheV3.h" +#import "FBSDKAccessTokenCacheV3_17.h" +#import "FBSDKAccessTokenCacheV3_21.h" +#import "FBSDKAccessTokenCacheV4.h" + +static BOOL g_tryDeprecatedCaches = YES; + +@implementation FBSDKAccessTokenCache + +- (FBSDKAccessToken*)fetchAccessToken +{ + FBSDKAccessToken *token = [[[FBSDKAccessTokenCacheV4 alloc] init] fetchAccessToken]; + if (token || !g_tryDeprecatedCaches) { + return token; + } + + g_tryDeprecatedCaches = NO; + NSArray *oldCacheClasses = [[self class] deprecatedCacheClasses]; + __block FBSDKAccessToken *oldToken = nil; + [oldCacheClasses enumerateObjectsUsingBlock:^(Class obj, NSUInteger idx, BOOL *stop) { + id cache = [[obj alloc] init]; + oldToken = [cache fetchAccessToken]; + if (oldToken) { + *stop = YES; + [cache clearCache]; + } + }]; + if (oldToken) { + [self cacheAccessToken:oldToken]; + } + return oldToken; +} + +- (void)cacheAccessToken:(FBSDKAccessToken *)token +{ + [[[FBSDKAccessTokenCacheV4 alloc] init] cacheAccessToken:token]; + if (g_tryDeprecatedCaches) { + g_tryDeprecatedCaches = NO; + NSArray *oldCacheClasses = [[self class] deprecatedCacheClasses]; + [oldCacheClasses enumerateObjectsUsingBlock:^(Class obj, NSUInteger idx, BOOL *stop) { + id cache = [[obj alloc] init]; + [cache clearCache]; + }]; + } +} + +- (void)clearCache +{ + [[[FBSDKAccessTokenCacheV4 alloc] init] clearCache]; +} + +// used by FBSDKAccessTokenCacheIntegrationTests ++ (void)resetV3CacheChecks +{ + g_tryDeprecatedCaches = YES; +} + ++ (NSArray *)deprecatedCacheClasses +{ + return @[ [FBSDKAccessTokenCacheV3_21 class], [FBSDKAccessTokenCacheV3_17 class], [FBSDKAccessTokenCacheV3 class]]; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h new file mode 100644 index 0000000..28134a0 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h @@ -0,0 +1,30 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKAccessTokenCaching.h" +#import "FBSDKMacros.h" + +FBSDK_EXTERN NSString *const FBSDKTokenInformationUUIDKey; + +@interface FBSDKAccessTokenCacheV3 : NSObject + ++ (FBSDKAccessToken *)accessTokenForV3Dictionary:(NSDictionary *)dictionary; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m new file mode 100644 index 0000000..356a1a6 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m @@ -0,0 +1,79 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessTokenCacheV3.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKSettings.h" +#import "FBSDKTypeUtility.h" + +NSString *const FBSDKTokenInformationUUIDKey = @"com.facebook.sdk:TokenInformationUUIDKey"; + +#define FBSDK_TOKEN_INFORMATION_TOKEN_KEY @"com.facebook.sdk:TokenInformationTokenKey" +#define FBSDK_TOKEN_INFORMATION_EXPIRATION_DATE_KEY @"com.facebook.sdk:TokenInformationExpirationDateKey" +#define FBSDK_TOKEN_INFORMATION_USER_FBID_KEY @"com.facebook.sdk:TokenInformationUserFBIDKey" +#define FBSDK_TOKEN_INFORMATION_PERMISSIONS_KEY @"com.facebook.sdk:TokenInformationPermissionsKey" +#define FBSDK_TOKEN_INFORMATION_DECLINED_PERMISSIONS_KEY @"com.facebook.sdk:TokenInformationDeclinedPermissionsKey" +#define FBSDK_TOKEN_INFORMATION_APP_ID_KEY @"com.facebook.sdk:TokenInformationAppIDKey" +#define FBSDK_TOKEN_INFORMATION_REFRESH_DATE_KEY @"com.facebook.sdk:TokenInformationRefreshDateKey" + + +@implementation FBSDKAccessTokenCacheV3 + +- (FBSDKAccessToken *)fetchAccessToken +{ + // Check NSUserDefaults ( <= v3.16 ) + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *tokenDictionary = [defaults objectForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; + return [[self class] accessTokenForV3Dictionary:tokenDictionary]; +} + +- (void)clearCache +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults removeObjectForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; + [defaults synchronize]; +} + +- (void)cacheAccessToken:(FBSDKAccessToken *)token +{ + //no-op. + NSAssert(NO, @"deprecated cache FBSDKAccessTokenCacheV3 should not be used to cache a token"); +} + ++ (FBSDKAccessToken *)accessTokenForV3Dictionary:(NSDictionary *)dictionary +{ + NSString *tokenString = [FBSDKTypeUtility stringValue:dictionary[FBSDK_TOKEN_INFORMATION_TOKEN_KEY]]; + if (tokenString.length > 0) { + NSDate *expirationDate = dictionary[FBSDK_TOKEN_INFORMATION_EXPIRATION_DATE_KEY]; + // Note we default to valid in cases where expiration date is missing. + BOOL isExpired = ([expirationDate compare:[NSDate date]] == NSOrderedAscending); + if (isExpired) { + return nil; + } + return [[FBSDKAccessToken alloc] initWithTokenString:tokenString + permissions:dictionary[FBSDK_TOKEN_INFORMATION_PERMISSIONS_KEY] + declinedPermissions:dictionary[FBSDK_TOKEN_INFORMATION_DECLINED_PERMISSIONS_KEY] + appID:dictionary[FBSDK_TOKEN_INFORMATION_APP_ID_KEY] + userID:dictionary[FBSDK_TOKEN_INFORMATION_USER_FBID_KEY] + expirationDate:expirationDate + refreshDate:dictionary[FBSDK_TOKEN_INFORMATION_REFRESH_DATE_KEY]]; + } + return nil; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h new file mode 100644 index 0000000..7f486f3 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKAccessTokenCaching.h" + +@interface FBSDKAccessTokenCacheV3_17 : NSObject + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m new file mode 100644 index 0000000..18626e5 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m @@ -0,0 +1,63 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessTokenCacheV3_17.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKAccessTokenCacheV3.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKKeychainStoreViaBundleID.h" +#import "FBSDKSettings.h" + +@implementation FBSDKAccessTokenCacheV3_17 +{ + FBSDKKeychainStoreViaBundleID *_keychainStore; +} + +- (instancetype)init +{ + if ((self = [super init])) { + _keychainStore = [[FBSDKKeychainStoreViaBundleID alloc] init]; + } + return self; +} +- (FBSDKAccessToken *)fetchAccessToken +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *uuidKey = [[FBSDKSettings legacyUserDefaultTokenInformationKeyName] stringByAppendingString:@"UUID"]; + NSString *uuid = [defaults objectForKey:uuidKey]; + NSDictionary *tokenDictionary = [_keychainStore dictionaryForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; + if (![tokenDictionary[FBSDKTokenInformationUUIDKey] isEqualToString:uuid]) { + [self clearCache]; + } + + return [FBSDKAccessTokenCacheV3 accessTokenForV3Dictionary:tokenDictionary]; +} + +- (void)clearCache +{ + [_keychainStore setDictionary:nil forKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName] accessibility:nil]; +} + +- (void)cacheAccessToken:(FBSDKAccessToken *)token +{ + //no-op. + NSAssert(NO, @"deprecated cache FBSDKAccessTokenCacheV3_17 should not be used to cache a token"); +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h new file mode 100644 index 0000000..da1ac64 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKAccessTokenCaching.h" + +@interface FBSDKAccessTokenCacheV3_21 : NSObject + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m new file mode 100644 index 0000000..845138b --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m @@ -0,0 +1,66 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessTokenCacheV3_21.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKAccessTokenCacheV3.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKKeychainStore.h" +#import "FBSDKSettings.h" + +@implementation FBSDKAccessTokenCacheV3_21 +{ + FBSDKKeychainStore *_keychainStore; +} + +- (instancetype)init +{ + if ((self = [super init])) { + NSString *keyChainServiceIdentifier = [NSString stringWithFormat:@"com.facebook.sdk.tokencache.%@", [[NSBundle mainBundle] bundleIdentifier]]; + _keychainStore = [[FBSDKKeychainStore alloc] initWithService:keyChainServiceIdentifier accessGroup:nil]; + } + return self; +} + +- (FBSDKAccessToken *)fetchAccessToken +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *uuidKey = [[FBSDKSettings legacyUserDefaultTokenInformationKeyName] stringByAppendingString:@"UUID"]; + NSString *uuid = [defaults objectForKey:uuidKey]; + NSDictionary *tokenDictionary = [_keychainStore dictionaryForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; + if (![tokenDictionary[FBSDKTokenInformationUUIDKey] isEqualToString:uuid]) { + [self clearCache]; + } + + return [FBSDKAccessTokenCacheV3 accessTokenForV3Dictionary:tokenDictionary]; +} + +- (void)clearCache +{ + [_keychainStore setDictionary:nil forKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName] accessibility:nil]; +} + +- (void)cacheAccessToken:(FBSDKAccessToken *)token +{ + //no-op. + NSAssert(NO, @"deprecated cache FBSDKAccessTokenCacheV3_21 should not be used to cache a token"); +} + + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h new file mode 100644 index 0000000..7fa7d7f --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKAccessToken.h" +#import "FBSDKAccessTokenCaching.h" + +@interface FBSDKAccessTokenCacheV4 : NSObject + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m new file mode 100644 index 0000000..84d4151 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m @@ -0,0 +1,97 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAccessTokenCacheV4.h" + +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKKeychainStore.h" + +static NSString *const kFBSDKAccessTokenUserDefaultsKey = @"com.facebook.sdk.v4.FBSDKAccessTokenInformationKey"; +static NSString *const kFBSDKAccessTokenUUIDKey = @"tokenUUID"; +static NSString *const kFBSDKAccessTokenEncodedKey = @"tokenEncoded"; + +@implementation FBSDKAccessTokenCacheV4 +{ + FBSDKKeychainStore *_keychainStore; +} + +- (instancetype)init +{ + if ((self = [super init])) { + NSString *keyChainServiceIdentifier = [NSString stringWithFormat:@"com.facebook.sdk.tokencache.%@", [[NSBundle mainBundle] bundleIdentifier]]; + _keychainStore = [[FBSDKKeychainStore alloc] initWithService:keyChainServiceIdentifier accessGroup:nil]; + } + return self; +} + +- (FBSDKAccessToken *)fetchAccessToken +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *uuid = [defaults objectForKey:kFBSDKAccessTokenUserDefaultsKey]; + + NSDictionary *dict = [_keychainStore dictionaryForKey:kFBSDKAccessTokenUserDefaultsKey]; + if (![dict[kFBSDKAccessTokenUUIDKey] isEqualToString:uuid]) { + // if the uuid doesn't match (including if there is no uuid in defaults which means uninstalled case) + // clear the keychain and return nil. + [self clearCache]; + return nil; + } + + id tokenData = dict[kFBSDKAccessTokenEncodedKey]; + if ([tokenData isKindOfClass:[NSData class]]) { + return [NSKeyedUnarchiver unarchiveObjectWithData:tokenData]; + } else { + return nil; + } +} + +- (void)cacheAccessToken:(FBSDKAccessToken *)token +{ + if (!token) { + [self clearCache]; + return; + } + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *uuid = [defaults objectForKey:kFBSDKAccessTokenUserDefaultsKey]; + if (!uuid) { + uuid = [[NSUUID UUID] UUIDString]; + [defaults setObject:uuid forKey:kFBSDKAccessTokenUserDefaultsKey]; + [defaults synchronize]; + } + NSData *tokenData = [NSKeyedArchiver archivedDataWithRootObject:token]; + NSDictionary *dict = @{ + kFBSDKAccessTokenUUIDKey : uuid, + kFBSDKAccessTokenEncodedKey : tokenData + }; + + [_keychainStore setDictionary:dict + forKey:kFBSDKAccessTokenUserDefaultsKey + accessibility:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly]]; +} + +- (void)clearCache +{ + [_keychainStore setDictionary:nil + forKey:kFBSDKAccessTokenUserDefaultsKey + accessibility:NULL]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults removeObjectForKey:kFBSDKAccessTokenUserDefaultsKey]; + [defaults synchronize]; +} +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h new file mode 100644 index 0000000..8562245 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKAccessToken; + +@protocol FBSDKAccessTokenCaching + +- (FBSDKAccessToken *)fetchAccessToken; + +- (void)cacheAccessToken:(FBSDKAccessToken *)token; + +- (void)clearCache; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h new file mode 100644 index 0000000..f603635 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h @@ -0,0 +1,40 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKKeychainStore : NSObject + +@property (nonatomic, readonly, copy) NSString *service; +@property (nonatomic, readonly, copy) NSString *accessGroup; + +- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup NS_DESIGNATED_INITIALIZER; + +- (BOOL)setDictionary:(NSDictionary *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; +- (NSDictionary *)dictionaryForKey:(NSString *)key; + +- (BOOL)setString:(NSString *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; +- (NSString *)stringForKey:(NSString *)key; + +- (BOOL)setData:(NSData *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; +- (NSData *)dataForKey:(NSString *)key; + +// hook for subclasses to override keychain query construction. +- (NSMutableDictionary *)queryForKey:(NSString *)key; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m new file mode 100644 index 0000000..b2e4f56 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m @@ -0,0 +1,161 @@ +/** + * Contains code from UICKeyChainStore + * + * Copyright (c) 2011 kishikawa katsumi + * + * 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. + */ + +#import "FBSDKKeychainStore.h" + +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKMacros.h" + +@implementation FBSDKKeychainStore + +- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup +{ + if ((self = [super init])) { + _service = service ? [service copy] : [[NSBundle mainBundle] bundleIdentifier]; + _accessGroup = [accessGroup copy]; + NSAssert(_service, @"Keychain must be initialized with service"); + } + + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithService:accessGroup:); + return [self initWithService:nil accessGroup:nil]; +} + +- (BOOL)setDictionary:(NSDictionary *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility +{ + NSData *data = value == nil ? nil : [NSKeyedArchiver archivedDataWithRootObject:value]; + return [self setData:data forKey:key accessibility:accessibility]; +} + +- (NSDictionary *)dictionaryForKey:(NSString *)key +{ + NSData *data = [self dataForKey:key]; + if (!data) { + return nil; + } + + NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + if (![dict isKindOfClass:[NSDictionary class]]) { + return nil; + } + + return dict; +} + +- (BOOL)setString:(NSString *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility +{ + NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding]; + return [self setData:data forKey:key accessibility:accessibility]; +} + +- (NSString *)stringForKey:(NSString *)key +{ + NSData *data = [self dataForKey:key]; + if (!data) { + return nil; + } + + return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +} + +- (BOOL)setData:(NSData *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility +{ + if (!key) { + return NO; + } + + NSMutableDictionary *query = [self queryForKey:key]; + + OSStatus status; + if (value) { + NSMutableDictionary *attributesToUpdate = [NSMutableDictionary dictionary]; + [attributesToUpdate setObject:value forKey:[FBSDKDynamicFrameworkLoader loadkSecValueData]]; + + status = fbsdkdfl_SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributesToUpdate); + if (status == errSecItemNotFound) { +#if TARGET_OS_IPHONE || (defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) + if (accessibility) { + [query setObject:(__bridge id)(accessibility) forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessible]]; + } +#endif + [query setObject:value forKey:[FBSDKDynamicFrameworkLoader loadkSecValueData]]; + + status = fbsdkdfl_SecItemAdd((__bridge CFDictionaryRef)query, NULL); + } + } else { + status = fbsdkdfl_SecItemDelete((__bridge CFDictionaryRef)query); + if (status == errSecItemNotFound) { + status = errSecSuccess; + } + } + + return (status == errSecSuccess); +} + +- (NSData *)dataForKey:(NSString *)key +{ + if (!key) { + return nil; + } + + NSMutableDictionary *query = [self queryForKey:key]; + [query setObject:(id)kCFBooleanTrue forKey:[FBSDKDynamicFrameworkLoader loadkSecReturnData]]; + [query setObject:[FBSDKDynamicFrameworkLoader loadkSecMatchLimitOne] forKey:[FBSDKDynamicFrameworkLoader loadkSecMatchLimit]]; + + CFTypeRef data = nil; + OSStatus status = fbsdkdfl_SecItemCopyMatching((__bridge CFDictionaryRef)query, &data); + if (status != errSecSuccess) { + return nil; + } + + if (!data || CFGetTypeID(data) != CFDataGetTypeID()) { + return nil; + } + + NSData *ret = [NSData dataWithData:(__bridge NSData *)(data)]; + CFRelease(data); + + return ret; +} + +- (NSMutableDictionary *)queryForKey:(NSString *)key +{ + NSMutableDictionary *query = [NSMutableDictionary dictionary]; + [query setObject:[FBSDKDynamicFrameworkLoader loadkSecClassGenericPassword] forKey:[FBSDKDynamicFrameworkLoader loadkSecClass]]; + [query setObject:_service forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrService]]; + [query setObject:key forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccount]]; +#if !TARGET_IPHONE_SIMULATOR + if (_accessGroup) { + [query setObject:_accessGroup forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessGroup]]; + } +#endif + + return query; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h new file mode 100644 index 0000000..0a0fb86 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h @@ -0,0 +1,29 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKKeychainStore.h" + +// This is the keychainstore defined in 3.17 that incorrectly used the bundle id as the service id +// and should NOT be used outside of this cache. +@interface FBSDKKeychainStoreViaBundleID : FBSDKKeychainStore + +// since this subclass represents the old keychainstore behavior, +// the designated initializer is just the `init`. +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m new file mode 100644 index 0000000..d36335c --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m @@ -0,0 +1,50 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKKeychainStoreViaBundleID.h" + +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKInternalUtility.h" + +@implementation FBSDKKeychainStoreViaBundleID + +- (instancetype)init +{ + return [super initWithService:[[NSBundle mainBundle] bundleIdentifier] accessGroup:nil]; +} + +- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup +{ + return [self init]; +} + +- (NSMutableDictionary*)queryForKey:(NSString *)key +{ + NSMutableDictionary *query = [NSMutableDictionary dictionary]; + query[(__bridge id)[FBSDKDynamicFrameworkLoader loadkSecClass]] = (__bridge id)([FBSDKDynamicFrameworkLoader loadkSecClassGenericPassword]); + query[(__bridge id)[FBSDKDynamicFrameworkLoader loadkSecAttrService]] = self.service; + query[(__bridge id)[FBSDKDynamicFrameworkLoader loadkSecAttrGeneric]] = key; + +#if !TARGET_IPHONE_SIMULATOR + [FBSDKInternalUtility dictionary:query setObject:self.accessGroup forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessGroup]]; +#endif + + return query; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h new file mode 100644 index 0000000..788d94d --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h @@ -0,0 +1,59 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKIcon.h" + +@protocol FBSDKButtonImpressionTracking + +- (NSDictionary *)analyticsParameters; +- (NSString *)impressionTrackingEventName; +- (NSString *)impressionTrackingIdentifier; + +@end + +@interface FBSDKButton () + +- (void)logTapEventWithEventName:(NSString *)eventName + parameters:(NSDictionary *)parameters; +- (void)checkImplicitlyDisabled; +- (void)configureButton; +- (void)configureWithIcon:(FBSDKIcon *)icon + title:(NSString *)title + backgroundColor:(UIColor *)backgroundColor + highlightedColor:(UIColor *)highlightedColor; +- (void)configureWithIcon:(FBSDKIcon *)icon + title:(NSString *)title + backgroundColor:(UIColor *)backgroundColor + highlightedColor:(UIColor *)highlightedColor + selectedTitle:(NSString *)selectedTitle + selectedIcon:(FBSDKIcon *)selectedIcon + selectedColor:(UIColor *)selectedColor + selectedHighlightedColor:(UIColor *)selectedHighlightedColor; +- (UIColor *)defaultBackgroundColor; +- (UIColor *)defaultDisabledColor; +- (UIColor *)defaultHighlightedColor; +- (FBSDKIcon *)defaultIcon; +- (UIColor *)defaultSelectedColor; +- (BOOL)isImplicitlyDisabled; +- (CGSize)sizeThatFits:(CGSize)size title:(NSString *)title; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h new file mode 100644 index 0000000..ec55385 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKCloseIcon : NSObject + +- (UIImage *)imageWithSize:(CGSize)size; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m new file mode 100644 index 0000000..1bbb746 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m @@ -0,0 +1,89 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKCloseIcon.h" + +#import "FBSDKMacros.h" + +@implementation FBSDKCloseIcon + +#pragma mark - Public API + +- (UIImage *)imageWithSize:(CGSize)size +{ + CGFloat scale = [UIScreen mainScreen].scale; + UIGraphicsBeginImageContextWithOptions(size, NO, scale); + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGFloat iconSize = MIN(size.width, size.height); + + CGRect rect = CGRectMake((size.width - iconSize) / 2, (size.height - iconSize) / 2, iconSize, iconSize); + CGFloat step = iconSize / 12; + + // shadow + rect = CGRectIntegral(CGRectInset(rect, step, step)); + NSArray *colors = @[ + (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.7].CGColor, + (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.3].CGColor, + (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.1].CGColor, + (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.0].CGColor, + ]; + CGFloat locations[4] = { + 0.70, + 0.80, + 0.90, + 1.0, + }; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); + CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations); + CGColorSpaceRelease(colorSpace); + CGPoint center = CGPointMake(CGRectGetMidX(rect) - step / 6, CGRectGetMidY(rect) + step / 4); + CGContextDrawRadialGradient(context, gradient, center, 0.0, center, (CGRectGetWidth(rect) - step / 2) / 2, 0); + CGGradientRelease(gradient); + + // outer circle + rect = CGRectIntegral(CGRectInset(rect, step, step)); + [[UIColor whiteColor] setFill]; + CGContextFillEllipseInRect(context, rect); + + // inner circle + rect = CGRectIntegral(CGRectInset(rect, step, step)); + [[UIColor blackColor] setFill]; + CGContextFillEllipseInRect(context, rect); + + // cross + rect = CGRectIntegral(CGRectInset(rect, step, step)); + CGFloat lineWidth = step * 5 / 4; + rect.origin.y = CGRectGetMidY(rect) - lineWidth / 2; + rect.size.height = lineWidth; + [[UIColor whiteColor] setFill]; + CGContextTranslateCTM(context, size.width / 2, size.height / 2); + CGContextRotateCTM(context, M_PI_4); + CGContextTranslateCTM(context, -size.width / 2, -size.height / 2); + CGContextFillRect(context, rect); + CGContextTranslateCTM(context, size.width / 2, size.height / 2); + CGContextRotateCTM(context, M_PI_2); + CGContextTranslateCTM(context, -size.width / 2, -size.height / 2); + CGContextFillRect(context, rect); + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h new file mode 100644 index 0000000..54825b6 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h @@ -0,0 +1,22 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +UIColor *FBSDKUIColorWithRGBA(uint8_t r, uint8_t g, uint8_t b, CGFloat a); +UIColor *FBSDKUIColorWithRGB(uint8_t r, uint8_t g, uint8_t b); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m new file mode 100644 index 0000000..71b3d80 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKColor.h" + +static const CGFloat kFBRGBMax = 255.0; + +UIColor *FBSDKUIColorWithRGBA(uint8_t r, uint8_t g, uint8_t b, CGFloat a) +{ + return [UIColor colorWithRed:(r / kFBRGBMax) green:(g / kFBRGBMax) blue:(b / kFBRGBMax) alpha:a]; +} + +UIColor *FBSDKUIColorWithRGB(uint8_t r, uint8_t g, uint8_t b) +{ + return FBSDKUIColorWithRGBA(r, g, b, 1.0); +} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h new file mode 100644 index 0000000..5be3445 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKIcon : NSObject + +- (instancetype)initWithColor:(UIColor *)color NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, strong, readonly) UIColor *color; + +- (UIImage *)imageWithSize:(CGSize)size; + +- (CGPathRef)pathWithSize:(CGSize)size; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m new file mode 100644 index 0000000..06b778e --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m @@ -0,0 +1,64 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKIcon.h" + +#import "FBSDKMacros.h" + +@implementation FBSDKIcon + +#pragma mark - Object Lifecycle + +- (instancetype)initWithColor:(UIColor *)color +{ + if ((self = [super init])) { + _color = [color copy]; + } + return self; +} + +- (instancetype)init +{ + return [self initWithColor:[UIColor whiteColor]]; +} + +#pragma mark - Public API + +- (UIImage *)imageWithSize:(CGSize)size +{ + if ((size.width == 0) || (size.height == 0)) { + return nil; + } + CGFloat scale = [UIScreen mainScreen].scale; + UIGraphicsBeginImageContextWithOptions(size, NO, scale); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGPathRef path = [self pathWithSize:size]; + CGContextAddPath(context, path); + CGContextSetFillColorWithColor(context, self.color.CGColor); + CGContextFillPath(context); + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + +- (CGPathRef)pathWithSize:(CGSize)size +{ + return NULL; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h new file mode 100644 index 0000000..76affe6 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKIcon.h" + +@interface FBSDKLogo : FBSDKIcon + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m new file mode 100644 index 0000000..47d0dc4 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m @@ -0,0 +1,59 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLogo.h" + +@implementation FBSDKLogo + +- (CGPathRef)pathWithSize:(CGSize)size +{ + CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 136.0, size.height / 136.0); + const CGAffineTransform *transform = &transformValue; + CGMutablePathRef path = CGPathCreateMutable(); + CGPathMoveToPoint(path, transform, 127.856, 0.676); + CGPathAddLineToPoint(path, transform, 7.469, 0.676); + CGPathAddCurveToPoint(path, transform, 3.344, 0.676, 0.0, 4.02, 0.0, 8.145); + CGPathAddLineToPoint(path, transform, 0.0, 128.531); + CGPathAddCurveToPoint(path, transform, 0.0, 132.656, 3.344, 136.0, 7.469, 136.0); + CGPathAddLineToPoint(path, transform, 72.282, 136.0); + CGPathAddLineToPoint(path, transform, 72.282, 83.596); + CGPathAddLineToPoint(path, transform, 54.646, 83.596); + CGPathAddLineToPoint(path, transform, 54.646, 63.173); + CGPathAddLineToPoint(path, transform, 72.282, 63.173); + CGPathAddLineToPoint(path, transform, 72.282, 48.112); + CGPathAddCurveToPoint(path, transform, 72.282, 30.633, 82.957, 21.116, 98.549, 21.116); + CGPathAddCurveToPoint(path, transform, 106.018, 21.116, 112.438, 21.671, 114.309, 21.92); + CGPathAddLineToPoint(path, transform, 114.309, 40.187); + CGPathAddLineToPoint(path, transform, 103.495, 40.191); + CGPathAddCurveToPoint(path, transform, 95.014, 40.191, 93.372, 44.221, 93.372, 50.133); + CGPathAddLineToPoint(path, transform, 93.372, 63.173); + CGPathAddLineToPoint(path, transform, 113.596, 63.173); + CGPathAddLineToPoint(path, transform, 110.963, 83.596); + CGPathAddLineToPoint(path, transform, 93.372, 83.596); + CGPathAddLineToPoint(path, transform, 93.372, 136.0); + CGPathAddLineToPoint(path, transform, 127.856, 136.0); + CGPathAddCurveToPoint(path, transform, 131.981, 136.0, 135.325, 132.656, 135.325, 128.531); + CGPathAddLineToPoint(path, transform, 135.325, 8.145); + CGPathAddCurveToPoint(path, transform, 135.325, 4.02, 131.981, 0.676, 127.856, 0.676); + CGPathCloseSubpath(path); + CGPathRef result = CGPathCreateCopy(path); + CGPathRelease(path); + return CFAutorelease(result); +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h new file mode 100644 index 0000000..1a44797 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKIcon.h" + +@interface FBSDKMaleSilhouetteIcon : FBSDKIcon + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m new file mode 100644 index 0000000..6e0e1ed --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m @@ -0,0 +1,51 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKMaleSilhouetteIcon.h" + +@implementation FBSDKMaleSilhouetteIcon + +- (CGPathRef)pathWithSize:(CGSize)size +{ + CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 158.783, size.height / 158.783); + CGAffineTransform *transform = &transformValue; + CGMutablePathRef path = CGPathCreateMutable(); + CGPathMoveToPoint(path, transform, 158.783, 158.783); + CGPathAddCurveToPoint(path, transform, 156.39, 131.441, 144.912, 136.964, 105.607, 117.32); + CGPathAddCurveToPoint(path, transform, 103.811, 113.941, 103.348, 108.8965, 103.013, 107.4781); + CGPathAddLineToPoint(path, transform, 100.434, 106.7803); + CGPathAddCurveToPoint(path, transform, 97.2363, 82.7701, 100.67, 101.5845, 106.006, 75.2188); + CGPathAddCurveToPoint(path, transform, 107.949, 76.2959, 108.268, 70.7417, 108.971, 66.5743); + CGPathAddCurveToPoint(path, transform, 109.673, 62.4068, 110.864, 58.9082, 107.139, 58.9082); + CGPathAddCurveToPoint(path, transform, 107.94, 42.7652, 110.299, 31.3848, 101.335, 23.3072); + CGPathAddCurveToPoint(path, transform, 92.3808, 15.23781, 87.874, 15.52349, 95.0483, 9.6036128); + CGPathAddCurveToPoint(path, transform, 91.2319, 8.892613, 70.2036, 12.01861, 57.4487, 23.3072); + CGPathAddCurveToPoint(path, transform, 48.4121, 31.3042, 50.8437, 42.7652, 51.6445, 58.9082); + CGPathAddCurveToPoint(path, transform, 47.9194, 58.9082, 49.1108, 62.4068, 49.813, 66.5743); + CGPathAddCurveToPoint(path, transform, 50.5156, 70.7417, 50.8349, 76.2959, 52.7778, 75.2188); + CGPathAddCurveToPoint(path, transform, 58.1138, 110.1135, 61.5478, 82.7701, 58.3501, 106.7803); + CGPathAddLineToPoint(path, transform, 55.7705, 107.4781); + CGPathAddCurveToPoint(path, transform, 55.4355, 108.8965, 54.9722, 113.941, 53.1767, 117.32); + CGPathAddCurveToPoint(path, transform, 13.8711, 136.964, 2.3945, 131.441, 0.0, 158.783); + CGPathAddLineToPoint(path, transform, 158.783, 158.783); + CGPathRef result = CGPathCreateCopy(path); + CGPathRelease(path); + return CFAutorelease(result); +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h new file mode 100644 index 0000000..60458e1 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h @@ -0,0 +1,89 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "../FBSDKMath.h" + +/*! + @abstract Insets a CGSize with the insets in a UIEdgeInsets. + */ +FBSDK_STATIC_INLINE CGSize FBSDKEdgeInsetsInsetSize(CGSize size, UIEdgeInsets insets) +{ + CGRect rect = CGRectZero; + rect.size = size; + return UIEdgeInsetsInsetRect(rect, insets).size; +} + +/*! + @abstract Outsets a CGSize with the insets in a UIEdgeInsets. + */ +FBSDK_STATIC_INLINE CGSize FBSDKEdgeInsetsOutsetSize(CGSize size, UIEdgeInsets insets) +{ + CGRect rect = CGRectZero; + rect.size = size; + return CGSizeMake(insets.left + size.width + insets.right, + insets.top + size.height + insets.bottom); +} + +/*! + @abstract Limits a CGFloat value, using the scale to limit to pixels (instead of points). + + @discussion The limitFunction is frequention floorf, ceilf or roundf. If the scale is 2.0, + you may get back values of *.5 to correspond to pixels. + */ +typedef float (*FBSDKLimitFunctionType)(float); +FBSDK_STATIC_INLINE CGFloat FBSDKPointsForScreenPixels(FBSDKLimitFunctionType limitFunction, + CGFloat screenScale, + CGFloat pointValue) +{ + return limitFunction(pointValue * screenScale) / screenScale; +} + +FBSDK_STATIC_INLINE CGSize FBSDKTextSize(NSString *text, + UIFont *font, + CGSize constrainedSize, + NSLineBreakMode lineBreakMode) +{ + if (!text) { + return CGSizeZero; + } + CGSize size; + if ([NSAttributedString instancesRespondToSelector:@selector(boundingRectWithSize:options:context:)]) { + NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; + paragraphStyle.lineBreakMode = lineBreakMode; + NSDictionary *attributes = @{ + NSFontAttributeName: font, + NSParagraphStyleAttributeName: paragraphStyle, + }; + NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text attributes:attributes]; + size = [FBSDKMath ceilForSize:[attributedString boundingRectWithSize:constrainedSize + options:(NSStringDrawingUsesDeviceMetrics | + NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading) + context:NULL].size]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + size = [text sizeWithFont:font constrainedToSize:constrainedSize lineBreakMode:lineBreakMode]; +#pragma clang diagnostic pop + } + return [FBSDKMath ceilForSize:size]; +} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h new file mode 100644 index 0000000..f280228 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h @@ -0,0 +1,29 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKViewImpressionTracker : NSObject + ++ (instancetype)impressionTrackerWithEventName:(NSString *)eventName; + +@property (nonatomic, copy, readonly) NSString *eventName; + +- (void)logImpressionWithIdentifier:(NSString *)identifier parameters:(NSDictionary *)parameters; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m new file mode 100644 index 0000000..4f95ad7 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m @@ -0,0 +1,97 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKViewImpressionTracker.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKAppEvents+Internal.h" + +@implementation FBSDKViewImpressionTracker +{ + NSMutableSet *_trackedImpressions; +} + +#pragma mark - Class Methods + ++ (instancetype)impressionTrackerWithEventName:(NSString *)eventName +{ + static NSMutableDictionary *_impressionTrackers = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _impressionTrackers = [[NSMutableDictionary alloc] init]; + }); + // Maintains a single instance of an impression tracker for each event name + FBSDKViewImpressionTracker *impressionTracker = _impressionTrackers[eventName]; + if (!impressionTracker) { + impressionTracker = [[self alloc] initWithEventName:eventName]; + _impressionTrackers[eventName] = impressionTracker; + } + return impressionTracker; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithEventName:(NSString *)eventName +{ + if ((self = [super init])) { + _eventName = [eventName copy]; + _trackedImpressions = [[NSMutableSet alloc] init]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(_applicationDidEnterBackgroundNotification:) + name:UIApplicationDidEnterBackgroundNotification + object:[UIApplication sharedApplication]]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Public API + +- (void)logImpressionWithIdentifier:(NSString *)identifier parameters:(NSDictionary *)parameters +{ + NSMutableDictionary *keys = [NSMutableDictionary dictionary]; + keys[@"__view_impression_identifier__"] = identifier; + [keys addEntriesFromDictionary:parameters]; + NSDictionary *impressionKey = [keys copy]; + // Ensure that each impression is only tracked once + if ([_trackedImpressions containsObject:impressionKey]) { + return; + } + [_trackedImpressions addObject:impressionKey]; + + [FBSDKAppEvents logImplicitEvent:self.eventName + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; +} + +#pragma mark - Helper Methods + +- (void)_applicationDidEnterBackgroundNotification:(NSNotification *)notification +{ + // reset all tracked impressions when the app backgrounds so we will start tracking them again the next time they + // are triggered. + [_trackedImpressions removeAllObjects]; +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h new file mode 100644 index 0000000..3ad35f3 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h @@ -0,0 +1,44 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@protocol FBSDKWebDialogDelegate; + +@interface FBSDKWebDialog : NSObject + ++ (instancetype)showWithName:(NSString *)name + parameters:(NSDictionary *)parameters + delegate:(id)delegate; + +@property (nonatomic, assign) BOOL deferVisibility; +@property (nonatomic, assign) id delegate; +@property (nonatomic, copy) NSString *name; +@property (nonatomic, copy) NSDictionary *parameters; + +- (BOOL)show; + +@end + +@protocol FBSDKWebDialogDelegate + +- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results; +- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error; +- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m new file mode 100644 index 0000000..d398891 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m @@ -0,0 +1,340 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKWebDialog.h" + +#import "FBSDKAccessToken.h" +#import "FBSDKDynamicFrameworkLoader.h" +#import "FBSDKInternalUtility.h" +#import "FBSDKSettings.h" +#import "FBSDKTypeUtility.h" +#import "FBSDKWebDialogView.h" + +#define FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION 0.2 +#define FBSDK_WEB_DIALOG_DISMISS_ANIMATION_DURATION 0.3 + +static FBSDKWebDialog *g_currentDialog = nil; + +@interface FBSDKWebDialog () +@end + +@implementation FBSDKWebDialog +{ + UIView *_backgroundView; + FBSDKWebDialogView *_dialogView; +} + +#pragma mark - Class Methods + ++ (instancetype)showWithName:(NSString *)name + parameters:(NSDictionary *)parameters + delegate:(id)delegate +{ + FBSDKWebDialog *dialog = [[self alloc] init]; + dialog.name = name; + dialog.parameters = parameters; + dialog.delegate = delegate; + [dialog show]; + return dialog; +} + +#pragma mark - Object Lifecycle + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + _dialogView.delegate = nil; + [_dialogView removeFromSuperview]; + [_backgroundView removeFromSuperview]; +} + +#pragma mark - Public Methods + +- (BOOL)show +{ + if (g_currentDialog == self) { + return NO; + } + [g_currentDialog _dismissAnimated:YES]; + + NSError *error; + NSURL *URL = [self _generateURL:&error]; + if (!URL) { + [self _failWithError:error]; + return NO; + } + + g_currentDialog = self; + + UIWindow *window = [self _findWindow]; + if (!window) { + [self _failWithError:nil]; + return NO; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + _dialogView = [[FBSDKWebDialogView alloc] initWithFrame:window.screen.applicationFrame]; +#pragma clang diagnostic pop + + _dialogView.delegate = self; + [_dialogView loadURL:URL]; + + if (!_deferVisibility) { + [self _showWebView]; + } + + return YES; +} + +#pragma mark - FBSDKWebDialogViewDelegate + +- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didCompleteWithResults:(NSDictionary *)results +{ + [self _completeWithResults:results]; +} + +- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didFailWithError:(NSError *)error +{ + [self _failWithError:error]; +} + +- (void)webDialogViewDidCancel:(FBSDKWebDialogView *)webDialogView +{ + [self _cancel]; +} + +- (void)webDialogViewDidFinishLoad:(FBSDKWebDialogView *)webDialogView +{ + if (_deferVisibility) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (_dialogView) { + [self _showWebView]; + } + }); + } +} + +#pragma mark - Notifications + +- (void)_addObservers +{ + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(_deviceOrientationDidChangeNotification:) + name:UIDeviceOrientationDidChangeNotification + object:nil]; +} + +- (void)_deviceOrientationDidChangeNotification:(NSNotification *)notification +{ + BOOL animated = [FBSDKTypeUtility boolValue:notification.userInfo[@"UIDeviceOrientationRotateAnimatedUserInfoKey"]]; + Class CATransactionClass = fbsdkdfl_CATransactionClass(); + CFTimeInterval animationDuration = (animated ? [CATransactionClass animationDuration] : 0.0); + [self _updateViewsWithScale:1.0 alpha:1.0 animationDuration:animationDuration completion:NULL]; +} + +- (void)_removeObservers +{ + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; +} + +#pragma mark - Helper Methods + +- (void)_cancel +{ + FBSDKWebDialog *dialog = self; + [self _dismissAnimated:YES]; // may cause the receiver to be released + [_delegate webDialogDidCancel:dialog]; +} + +- (void)_completeWithResults:(NSDictionary *)results +{ + FBSDKWebDialog *dialog = self; + [self _dismissAnimated:YES]; // may cause the receiver to be released + [_delegate webDialog:dialog didCompleteWithResults:results]; +} + +- (void)_dismissAnimated:(BOOL)animated +{ + [self _removeObservers]; + UIView *backgroundView = _backgroundView; + _backgroundView = nil; + FBSDKWebDialogView *dialogView = _dialogView; + _dialogView.delegate = nil; + _dialogView = nil; + void(^didDismiss)(BOOL) = ^(BOOL finished){ + [backgroundView removeFromSuperview]; + [dialogView removeFromSuperview]; + }; + if (animated) { + [UIView animateWithDuration:FBSDK_WEB_DIALOG_DISMISS_ANIMATION_DURATION animations:^{ + dialogView.alpha = 0.0; + backgroundView.alpha = 0.0; + } completion:didDismiss]; + } else { + didDismiss(YES); + } + if (g_currentDialog == self) { + g_currentDialog = nil; + } +} + +- (void)_failWithError:(NSError *)error +{ + // defer so that the consumer is guaranteed to have an opportunity to set the delegate before we fail + dispatch_async(dispatch_get_main_queue(), ^{ + [self _dismissAnimated:YES]; + [_delegate webDialog:self didFailWithError:error]; + }); +} + +- (UIWindow *)_findWindow +{ + UIWindow *window = [UIApplication sharedApplication].keyWindow; + if (window == nil || window.windowLevel != UIWindowLevelNormal) { + for (window in [UIApplication sharedApplication].windows) { + if (window.windowLevel == UIWindowLevelNormal) { + break; + } + } + } + return window; +} + +- (NSURL *)_generateURL:(NSError **)errorRef +{ + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + parameters[@"display"] = @"touch"; + parameters[@"sdk"] = [NSString stringWithFormat:@"ios-%@", [FBSDKSettings sdkVersion]]; + parameters[@"redirect_uri"] = @"fbconnect://success"; + [FBSDKInternalUtility dictionary:parameters setObject:[FBSDKSettings appID] forKey:@"app_id"]; + [FBSDKInternalUtility dictionary:parameters + setObject:[FBSDKAccessToken currentAccessToken].tokenString + forKey:@"access_token"]; + [parameters addEntriesFromDictionary:self.parameters]; + return [FBSDKInternalUtility facebookURLWithHostPrefix:@"m" + path:[@"/dialog/" stringByAppendingString:self.name] + queryParameters:parameters + error:errorRef]; +} + +- (BOOL)_showWebView +{ + UIWindow *window = [self _findWindow]; + if (!window) { + [self _failWithError:nil]; + return NO; + } + + [self _addObservers]; + + _backgroundView = [[UIView alloc] initWithFrame:window.bounds]; + _backgroundView.alpha = 0.0; + _backgroundView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); + _backgroundView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:0.8]; + [window addSubview:_backgroundView]; + + [window addSubview:_dialogView]; + + [_dialogView becomeFirstResponder]; // dismisses the keyboard if it there was another first responder with it + [self _updateViewsWithScale:0.001 alpha:0.0 animationDuration:0.0 completion:NULL]; + [self _updateViewsWithScale:1.1 alpha:1.0 animationDuration:FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION completion:^(BOOL finished1) { + [self _updateViewsWithScale:0.9 alpha:1.0 animationDuration:FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION completion:^(BOOL finished2) { + [self _updateViewsWithScale:1.0 alpha:1.0 animationDuration:FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION completion:NULL]; + }]; + }]; + return YES; +} + +- (CGAffineTransform)_transformForOrientation +{ + // iOS 8 simply adjusts the application frame to adapt to the current orientation and deprecated the concept of + // interface orientations + if ([FBSDKInternalUtility shouldManuallyAdjustOrientation]) { + switch ([UIApplication sharedApplication].statusBarOrientation) { + case UIInterfaceOrientationLandscapeLeft: + return CGAffineTransformMakeRotation(M_PI * 1.5); + case UIInterfaceOrientationLandscapeRight: + return CGAffineTransformMakeRotation(M_PI/2); + case UIInterfaceOrientationPortraitUpsideDown: + return CGAffineTransformMakeRotation(-M_PI); + case UIInterfaceOrientationPortrait: + case UIInterfaceOrientationUnknown: + // don't adjust the orientation + break; + } + } + return CGAffineTransformIdentity; +} + +- (CGRect)_applicationFrameForOrientation +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + CGRect applicationFrame = _dialogView.window.screen.applicationFrame; +#pragma clang diagnostic pop + if ([FBSDKInternalUtility shouldManuallyAdjustOrientation]) { + switch ([UIApplication sharedApplication].statusBarOrientation) { + case UIInterfaceOrientationLandscapeLeft: + case UIInterfaceOrientationLandscapeRight: + return CGRectMake(0, 0, CGRectGetHeight(applicationFrame), CGRectGetWidth(applicationFrame)); + case UIInterfaceOrientationPortraitUpsideDown: + case UIInterfaceOrientationPortrait: + case UIInterfaceOrientationUnknown: + return applicationFrame; + } + } else { + return applicationFrame; + } +} + +- (void)_updateViewsWithScale:(CGFloat)scale + alpha:(CGFloat)alpha + animationDuration:(CFTimeInterval)animationDuration + completion:(void(^)(BOOL finished))completion +{ + CGAffineTransform transform; + CGRect applicationFrame = [self _applicationFrameForOrientation]; + if (scale == 1.0) { + transform = _dialogView.transform; + _dialogView.transform = CGAffineTransformIdentity; + _dialogView.frame = applicationFrame; + _dialogView.transform = transform; + } + transform = CGAffineTransformScale([self _transformForOrientation], scale, scale); + void(^updateBlock)(void) = ^{ + _dialogView.transform = transform; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + CGRect mainFrame = _dialogView.window.screen.applicationFrame; +#pragma clang diagnostic pop + _dialogView.center = CGPointMake(CGRectGetMidX(mainFrame), + CGRectGetMidY(mainFrame)); + _backgroundView.alpha = alpha; + }; + if (animationDuration == 0.0) { + updateBlock(); + } else { + [UIView animateWithDuration:animationDuration animations:updateBlock completion:completion]; + } +} + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h new file mode 100644 index 0000000..9ad7427 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h @@ -0,0 +1,39 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@protocol FBSDKWebDialogViewDelegate; + +@interface FBSDKWebDialogView : UIView + +@property (nonatomic, assign) id delegate; + +- (void)loadURL:(NSURL *)URL; +- (void)stopLoading; + +@end + +@protocol FBSDKWebDialogViewDelegate + +- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didCompleteWithResults:(NSDictionary *)results; +- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didFailWithError:(NSError *)error; +- (void)webDialogViewDidCancel:(FBSDKWebDialogView *)webDialogView; +- (void)webDialogViewDidFinishLoad:(FBSDKWebDialogView *)webDialogView; + +@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m new file mode 100644 index 0000000..92df897 --- /dev/null +++ b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m @@ -0,0 +1,188 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKWebDialogView.h" + +#import "FBSDKCloseIcon.h" +#import "FBSDKError.h" +#import "FBSDKTypeUtility.h" +#import "FBSDKUtility.h" + +#define FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH 10.0 + +@interface FBSDKWebDialogView () +@end + +@implementation FBSDKWebDialogView +{ + UIButton *_closeButton; + UIActivityIndicatorView *_loadingView; + UIWebView *_webView; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + self.backgroundColor = [UIColor clearColor]; + self.opaque = NO; + + _webView = [[UIWebView alloc] initWithFrame:CGRectZero]; + _webView.delegate = self; + [self addSubview:_webView]; + + _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + UIImage *closeImage = [[[FBSDKCloseIcon alloc] init] imageWithSize:CGSizeMake(29.0, 29.0)]; + [_closeButton setImage:closeImage forState:UIControlStateNormal]; + [_closeButton setTitleColor:[UIColor colorWithRed:167.0/255.0 + green:184.0/255.0 + blue:216.0/255.0 + alpha:1.0] forState:UIControlStateNormal]; + [_closeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; + _closeButton.showsTouchWhenHighlighted = YES; + [_closeButton sizeToFit]; + [self addSubview:_closeButton]; + [_closeButton addTarget:self action:@selector(_close:) forControlEvents:UIControlEventTouchUpInside]; + + _loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + _loadingView.color = [UIColor grayColor]; + [_webView addSubview:_loadingView]; + } + return self; +} + +- (void)dealloc +{ + _webView.delegate = nil; +} + +#pragma mark - Public Methods + +- (void)loadURL:(NSURL *)URL +{ + [_loadingView startAnimating]; + [_webView loadRequest:[NSURLRequest requestWithURL:URL]]; +} + +- (void)stopLoading +{ + [_webView stopLoading]; +} + +#pragma mark - Layout + +- (void)drawRect:(CGRect)rect +{ + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSaveGState(context); + [self.backgroundColor setFill]; + CGContextFillRect(context, self.bounds); + [[UIColor blackColor] setStroke]; + CGContextSetLineWidth(context, 1.0 / self.layer.contentsScale); + CGContextStrokeRect(context, _webView.frame); + CGContextRestoreGState(context); + [super drawRect:rect]; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + CGRect bounds = self.bounds; + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + CGFloat horizontalInset = CGRectGetWidth(bounds) * 0.2; + CGFloat verticalInset = CGRectGetHeight(bounds) * 0.2; + UIEdgeInsets iPadInsets = UIEdgeInsetsMake(verticalInset, horizontalInset, verticalInset, horizontalInset); + bounds = UIEdgeInsetsInsetRect(bounds, iPadInsets); + } + UIEdgeInsets webViewInsets = UIEdgeInsetsMake(FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH, + FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH, + FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH, + FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH); + _webView.frame = UIEdgeInsetsInsetRect(bounds, webViewInsets); + + CGRect webViewBounds = _webView.bounds; + _loadingView.center = CGPointMake(CGRectGetMidX(webViewBounds), CGRectGetMidY(webViewBounds)); + + CGRect closeButtonFrame = _closeButton.bounds; + closeButtonFrame.origin = bounds.origin; + _closeButton.frame = closeButtonFrame; +} + +#pragma mark - Actions + +- (void)_close:(id)sender +{ + [_delegate webDialogViewDidCancel:self]; +} + +#pragma mark - UIWebViewDelegate + +- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error +{ + [_loadingView stopAnimating]; + + // 102 == WebKitErrorFrameLoadInterruptedByPolicyChange + // NSURLErrorCancelled == "Operation could not be completed", note NSURLErrorCancelled occurs when the user clicks + // away before the page has completely loaded, if we find cases where we want this to result in dialog failure + // (usually this just means quick-user), then we should add something more robust here to account for differences in + // application needs + if (!(([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) || + ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102))) { + [_delegate webDialogView:self didFailWithError:error]; + } +} + +- (BOOL)webView:(UIWebView *)webView +shouldStartLoadWithRequest:(NSURLRequest *)request + navigationType:(UIWebViewNavigationType)navigationType +{ + NSURL *URL = request.URL; + + if ([URL.scheme isEqualToString:@"fbconnect"]) { + NSMutableDictionary *parameters = [[FBSDKUtility dictionaryWithQueryString:URL.query] mutableCopy]; + [parameters addEntriesFromDictionary:[FBSDKUtility dictionaryWithQueryString:URL.fragment]]; + if ([URL.resourceSpecifier hasPrefix:@"//cancel"]) { + NSInteger errorCode = [FBSDKTypeUtility integerValue:parameters[@"error_code"]]; + if (errorCode) { + NSString *errorMessage = [FBSDKTypeUtility stringValue:parameters[@"error_msg"]]; + NSError *error = [FBSDKError errorWithCode:errorCode message:errorMessage]; + [_delegate webDialogView:self didFailWithError:error]; + } else { + [_delegate webDialogViewDidCancel:self]; + } + } else { + [_delegate webDialogView:self didCompleteWithResults:parameters]; + } + return NO; + } else if (navigationType == UIWebViewNavigationTypeLinkClicked) { + [[UIApplication sharedApplication] openURL:request.URL]; + return NO; + } else { + return YES; + } +} + +- (void)webViewDidFinishLoad:(UIWebView *)webView +{ + [_loadingView stopAnimating]; + [_delegate webDialogViewDidFinishLoad:self]; +} + +@end diff --git a/Pods/FBSDKCoreKit/LICENSE b/Pods/FBSDKCoreKit/LICENSE new file mode 100644 index 0000000..bdb9fc5 --- /dev/null +++ b/Pods/FBSDKCoreKit/LICENSE @@ -0,0 +1,17 @@ +Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +copy, modify, and distribute this software in source code or binary form for use +in connection with the web services and APIs provided by Facebook. + +As with any software that integrates with the Facebook platform, your use of +this software is subject to the Facebook Developer Principles and Policies +[http://developers.facebook.com/policy/]. This copyright 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. diff --git a/Pods/FBSDKCoreKit/README.mdown b/Pods/FBSDKCoreKit/README.mdown new file mode 100644 index 0000000..d14a5e4 --- /dev/null +++ b/Pods/FBSDKCoreKit/README.mdown @@ -0,0 +1,46 @@ +Facebook SDK for iOS +==================== + +This open-source library allows you to integrate Facebook into your iOS app. + +Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more at https://developers.facebook.com/docs/ios + +NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookSDK + +TRY IT OUT +---------- +1. Download the SDK at https://developers.facebook.com/docs/ios or via Cocoapods by adding the 'FBSDKCoreKit', 'FBSDKLoginKit', and 'FBSDKShareKit' pods. +2. Test your install: build and run the project at ~/Documents/FacebookSDK/Samples/Scrumptious/Scrumptious.xcodeproj +3. Check-out the tutorials available online at: https://developers.facebook.com/docs/ios/getting-started +4. Start coding! Visit https://developers.facebook.com/docs/ios for tutorials and reference documentation. + +FEATURES +-------- +* Login - https://developers.facebook.com/docs/facebook-login +* Sharing - https://developers.facebook.com/docs/sharing +* App Links - https://developers.facebook.com/docs/applinks +* Graph API - https://developers.facebook.com/docs/ios/graph +* Analytics for Apps - https://developers.facebook.com/docs/analytics + +GIVE FEEDBACK +------------- +Please report bugs or issues to https://developers.facebook.com/bugs/ + +You can also join the Facebook Developers Group on Facebook (https://www.facebook.com/groups/fbdevelopers/) or ask questions on Stack Overflow (http://facebook.stackoverflow.com) + +LICENSE +------- +See the LICENSE file. + +DEVELOPER TERMS +--------------- + +- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including information about people’s use of your app. Facebook will use information received in accordance with our Data Use Policy [https://www.facebook.com/about/privacy/], including to provide you with insights about the effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on and off Facebook. + +- You may limit your sharing of information with us by updating the Insights control in the developer tool [https://developers.facebook.com/apps/{app_id}/settings/advanced]. + +- If you use a Facebook integration, including to share information with us, you agree and confirm that you have provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further agree that you will not share information with us about children under the age of 13. + +- You agree to comply with all applicable laws and regulations and also agree to our Terms , including our Platform Policies .and Advertising Guidelines, as applicable . + +By using the Facebook SDK for iOS you agree to these terms. diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h new file mode 100644 index 0000000..05b26ff --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h @@ -0,0 +1,101 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@protocol FBSDKAppGroupAddDialogDelegate; + +/*! + @abstract A dialog for creating app groups. + */ +@interface FBSDKAppGroupAddDialog : NSObject + +/*! + @abstract Convenience method to build up an app group dialog with content and a delegate. + @param content The content for the app group. + @param delegate The receiver's delegate. + */ ++ (instancetype)showWithContent:(FBSDKAppGroupContent *)content + delegate:(id)delegate; + +/*! + @abstract The receiver's delegate or nil if it doesn't have a delegate. + */ +@property (nonatomic, weak) id delegate; + +/*! + @abstract The content for app group. + */ +@property (nonatomic, copy) FBSDKAppGroupContent *content; + +/*! + @abstract A Boolean value that indicates whether the receiver can initiate an app group dialog. + @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is + required but not available. This method does not validate the content on the receiver, so this can be checked before + building up the content. + @see validateWithError: + @result YES if the receiver can share, otherwise NO. + */ +- (BOOL)canShow; + +/*! + @abstract Begins the app group dialog from the receiver. + @result YES if the receiver was able to show the dialog, otherwise NO. + */ +- (BOOL)show; + +/*! + @abstract Validates the content on the receiver. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return YES if the content is valid, otherwise NO. + */ +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; + +@end + +/*! + @abstract A delegate for FBSDKAppGroupAddDialog. + @discussion The delegate is notified with the results of the app group request as long as the application has + permissions to receive the information. For example, if the person is not signed into the containing app, the shower + may not be able to distinguish between completion of an app group request and cancellation. + */ +@protocol FBSDKAppGroupAddDialogDelegate + +/*! + @abstract Sent to the delegate when the app group request completes without error. + @param appGroupAddDialog The FBSDKAppGroupAddDialog that completed. + @param results The results from the dialog. This may be nil or empty. + */ +- (void)appGroupAddDialog:(FBSDKAppGroupAddDialog *)appGroupAddDialog didCompleteWithResults:(NSDictionary *)results; + +/*! + @abstract Sent to the delegate when the app group request encounters an error. + @param appGroupAddDialog The FBSDKAppGroupAddDialog that completed. + @param error The error. + */ +- (void)appGroupAddDialog:(FBSDKAppGroupAddDialog *)appGroupAddDialog didFailWithError:(NSError *)error; + +/*! + @abstract Sent to the delegate when the app group dialog is cancelled. + @param appGroupAddDialog The FBSDKAppGroupAddDialog that completed. + */ +- (void)appGroupAddDialogDidCancel:(FBSDKAppGroupAddDialog *)appGroupAddDialog; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m new file mode 100644 index 0000000..805ccef --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m @@ -0,0 +1,185 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppGroupAddDialog.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareError.h" +#import "FBSDKShareUtility.h" + +@interface FBSDKAppGroupAddDialog () +@end + +@implementation FBSDKAppGroupAddDialog +{ + FBSDKWebDialog *_webDialog; +} + +#define FBSDK_APP_GROUP_CREATE_METHOD_NAME @"game_group_create" + +#pragma mark - Class Methods + ++ (instancetype)showWithContent:(FBSDKAppGroupContent *)content + delegate:(id)delegate +{ + FBSDKAppGroupAddDialog *dialog = [[self alloc] init]; + dialog.content = content; + dialog.delegate = delegate; + [dialog show]; + return dialog; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + _webDialog = [[FBSDKWebDialog alloc] init]; + _webDialog.delegate = self; + _webDialog.name = FBSDK_APP_GROUP_CREATE_METHOD_NAME; + } + return self; +} + +- (void)dealloc +{ + _webDialog.delegate = nil; +} + +#pragma mark - Public Methods + +- (BOOL)canShow +{ + return YES; +} + +- (BOOL)show +{ + NSError *error; + if (![self canShow]) { + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"App group create dialog is not available."]; + [_delegate appGroupAddDialog:self didFailWithError:error]; + return NO; + } + if (![self validateWithError:&error]) { + [_delegate appGroupAddDialog:self didFailWithError:error]; + return NO; + } + + FBSDKAppGroupContent *content = self.content; + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:parameters setObject:content.name forKey:@"name"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.groupDescription forKey:@"description"]; + [FBSDKInternalUtility dictionary:parameters + setObject:NSStringFromFBSDKAppGroupPrivacy(content.privacy) + forKey:@"privacy"]; + + _webDialog.parameters = parameters; + [_webDialog show]; + [FBSDKInternalUtility registerTransientObject:self]; + return YES; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + FBSDKAppGroupContent *content = self.content; + if (!content) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"content" message:nil]; + } + return NO; + } + if (![content.name length]) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"name" message:nil]; + } + return NO; + } + if (![content.groupDescription length]) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"groupDescription" message:nil]; + } + return NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + +#pragma mark - FBSDKWebDialogDelegate + +- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results +{ + if (_webDialog != webDialog) { + return; + } + NSError *error = [FBSDKShareError errorWithCode:[FBSDKTypeUtility unsignedIntegerValue:results[@"error_code"]] + message:[FBSDKTypeUtility stringValue:results[@"error_message"]]]; + [self _handleCompletionWithDialogResults:results error:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error +{ + if (_webDialog != webDialog) { + return; + } + [self _handleCompletionWithDialogResults:nil error:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog +{ + if (_webDialog != webDialog) { + return; + } + [_delegate appGroupAddDialogDidCancel:self]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +#pragma mark - Helper Methods + +- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error +{ + if (!_delegate) { + return; + } + switch (error.code) { + case 0:{ + [_delegate appGroupAddDialog:self didCompleteWithResults:results]; + break; + } + case 4201:{ + [_delegate appGroupAddDialogDidCancel:self]; + break; + } + default:{ + [_delegate appGroupAddDialog:self didFailWithError:error]; + break; + } + } + if (error) { + return; + } else { + } +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h new file mode 100644 index 0000000..a5c5823 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h @@ -0,0 +1,68 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKAppGroupPrivacy) + @abstract Specifies the privacy of a group. + */ +typedef NS_ENUM(NSUInteger, FBSDKAppGroupPrivacy) +{ + /*! Anyone can see the group, who's in it and what members post. */ + FBSDKAppGroupPrivacyOpen = 0, + /*! Anyone can see the group and who's in it, but only members can see posts. */ + FBSDKAppGroupPrivacyClosed, +}; + +/*! + @abstract Converts an FBSDKAppGroupPrivacy to an NSString. + */ +FBSDK_EXTERN NSString *NSStringFromFBSDKAppGroupPrivacy(FBSDKAppGroupPrivacy privacy); + +/*! + @abstract A model for creating an app group. + */ +@interface FBSDKAppGroupContent : NSObject + +/*! + @abstract The description of the group. + */ +@property (nonatomic, copy) NSString *groupDescription; + +/*! + @abstract The name of the group. + */ +@property (nonatomic, copy) NSString *name; + +/*! + @abstract The privacy for the group. + */ +@property (nonatomic, assign) FBSDKAppGroupPrivacy privacy; + +/*! + @abstract Compares the receiver to another app group content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToAppGroupContent:(FBSDKAppGroupContent *)content; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m new file mode 100644 index 0000000..d3f429f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m @@ -0,0 +1,109 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppGroupContent.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_APP_GROUP_CONTENT_GROUP_DESCRIPTION_KEY @"groupDescription" +#define FBSDK_APP_GROUP_CONTENT_NAME_KEY @"name" +#define FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY @"privacy" + +NSString *NSStringFromFBSDKAppGroupPrivacy(FBSDKAppGroupPrivacy privacy) +{ + switch (privacy) { + case FBSDKAppGroupPrivacyClosed:{ + return @"closed"; + } + case FBSDKAppGroupPrivacyOpen:{ + return @"open"; + } + } +} + +@implementation FBSDKAppGroupContent + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_groupDescription hash], + [_name hash], + _privacy, + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKAppGroupContent class]]) { + return NO; + } + return [self isEqualToAppGroupContent:(FBSDKAppGroupContent *)object]; +} + +- (BOOL)isEqualToAppGroupContent:(FBSDKAppGroupContent *)content +{ + return (content && + (_privacy == content.privacy) && + [FBSDKInternalUtility object:_name isEqualToObject:content.name] && + [FBSDKInternalUtility object:_groupDescription isEqualToObject:content.groupDescription]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _groupDescription = [decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_APP_GROUP_CONTENT_GROUP_DESCRIPTION_KEY]; + _name = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY]; + _privacy = [decoder decodeIntegerForKey:FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_groupDescription forKey:FBSDK_APP_GROUP_CONTENT_GROUP_DESCRIPTION_KEY]; + [encoder encodeObject:_name forKey:FBSDK_APP_GROUP_CONTENT_NAME_KEY]; + [encoder encodeInteger:_privacy forKey:FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKAppGroupContent *copy = [[FBSDKAppGroupContent alloc] init]; + copy->_groupDescription = [_groupDescription copy]; + copy->_name = [_name copy]; + copy->_privacy = _privacy; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h new file mode 100644 index 0000000..70e4e7a --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h @@ -0,0 +1,99 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@protocol FBSDKAppGroupJoinDialogDelegate; + +/*! + @abstract A dialog for joining app groups. + */ +@interface FBSDKAppGroupJoinDialog : NSObject + +/*! + @abstract Convenience method to build up an app group dialog with content and a delegate. + @param groupID The ID for the group. + @param delegate The receiver's delegate. + */ ++ (instancetype)showWithGroupID:(NSString *)groupID + delegate:(id)delegate; + +/*! + @abstract The receiver's delegate or nil if it doesn't have a delegate. + */ +@property (nonatomic, weak) id delegate; + +/*! + @abstract The ID for group. + */ +@property (nonatomic, copy) NSString *groupID; + +/*! + @abstract A Boolean value that indicates whether the receiver can initiate an app group dialog. + @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is + required but not available. This method does not validate the content on the receiver, so this can be checked before + building up the content. + @see validateWithError: + @result YES if the receiver can share, otherwise NO. + */ +- (BOOL)canShow; + +/*! + @abstract Begins the app group dialog from the receiver. + @result YES if the receiver was able to show the dialog, otherwise NO. + */ +- (BOOL)show; + +/*! + @abstract Validates the content on the receiver. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return YES if the content is valid, otherwise NO. + */ +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; + +@end + +/*! + @abstract A delegate for FBSDKAppGroupJoinDialog. + @discussion The delegate is notified with the results of the app group request as long as the application has + permissions to receive the information. For example, if the person is not signed into the containing app, the shower + may not be able to distinguish between completion of an app group request and cancellation. + */ +@protocol FBSDKAppGroupJoinDialogDelegate + +/*! + @abstract Sent to the delegate when the app group request completes without error. + @param appGroupJoinDialog The FBSDKAppGroupJoinDialog that completed. + @param results The results from the dialog. This may be nil or empty. + */ +- (void)appGroupJoinDialog:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog didCompleteWithResults:(NSDictionary *)results; + +/*! + @abstract Sent to the delegate when the app group request encounters an error. + @param appGroupJoinDialog The FBSDKAppGroupJoinDialog that completed. + @param error The error. + */ +- (void)appGroupJoinDialog:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog didFailWithError:(NSError *)error; + +/*! + @abstract Sent to the delegate when the app group dialog is cancelled. + @param appGroupJoinDialog The FBSDKAppGroupJoinDialog that completed. + */ +- (void)appGroupJoinDialogDidCancel:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m new file mode 100644 index 0000000..dd7a11a --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m @@ -0,0 +1,167 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppGroupJoinDialog.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareError.h" +#import "FBSDKShareUtility.h" + +@interface FBSDKAppGroupJoinDialog () +@end + +@implementation FBSDKAppGroupJoinDialog +{ + FBSDKWebDialog *_webDialog; +} + +#define FBSDK_APP_GROUP_JOIN_METHOD_NAME @"game_group_join" + +#pragma mark - Class Methods + ++ (instancetype)showWithGroupID:(NSString *)groupID + delegate:(id)delegate +{ + FBSDKAppGroupJoinDialog *dialog = [[self alloc] init]; + dialog.groupID = groupID; + dialog.delegate = delegate; + [dialog show]; + return dialog; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + _webDialog = [[FBSDKWebDialog alloc] init]; + _webDialog.delegate = self; + _webDialog.name = FBSDK_APP_GROUP_JOIN_METHOD_NAME; + } + return self; +} + +- (void)dealloc +{ + _webDialog.delegate = nil; +} + +#pragma mark - Public Methods + +- (BOOL)canShow +{ + return YES; +} + +- (BOOL)show +{ + NSError *error; + if (![self canShow]) { + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"App group join dialog is not available."]; + [_delegate appGroupJoinDialog:self didFailWithError:error]; + return NO; + } + if (![self validateWithError:&error]) { + [_delegate appGroupJoinDialog:self didFailWithError:error]; + return NO; + } + + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:parameters setObject:self.groupID forKey:@"id"]; + + _webDialog.parameters = parameters; + [_webDialog show]; + [FBSDKInternalUtility registerTransientObject:self]; + return YES; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + if (![self.groupID length]) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"groupID" message:nil]; + } + return NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + +#pragma mark - FBSDKWebDialogDelegate + +- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results +{ + if (_webDialog != webDialog) { + return; + } + NSError *error = [FBSDKShareError errorWithCode:[FBSDKTypeUtility unsignedIntegerValue:results[@"error_code"]] + message:[FBSDKTypeUtility stringValue:results[@"error_message"]]]; + [self _handleCompletionWithDialogResults:results error:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error +{ + if (_webDialog != webDialog) { + return; + } + [self _handleCompletionWithDialogResults:nil error:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog +{ + if (_webDialog != webDialog) { + return; + } + [_delegate appGroupJoinDialogDidCancel:self]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +#pragma mark - Helper Methods + +- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error +{ + if (!_delegate) { + return; + } + switch (error.code) { + case 0:{ + [_delegate appGroupJoinDialog:self didCompleteWithResults:results]; + break; + } + case 4201:{ + [_delegate appGroupJoinDialogDidCancel:self]; + break; + } + default:{ + [_delegate appGroupJoinDialog:self didFailWithError:error]; + break; + } + } + if (error) { + return; + } else { + } +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h new file mode 100644 index 0000000..1feb828 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h @@ -0,0 +1,54 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A model for app invite. + */ +@interface FBSDKAppInviteContent : NSObject + +/*! + @abstract A URL to a preview image that will be displayed with the app invite + + @discussion This is optional. If you don't include it a fallback image will be used. +*/ +@property (nonatomic, copy) NSURL *appInvitePreviewImageURL; + +/*! + @abstract An app link target that will be used as a target when the user accept the invite. + + @discussion This is a requirement. + */ +@property (nonatomic, copy) NSURL *appLinkURL; + +/*! + @deprecated Use `appInvitePreviewImageURL` instead. + */ +@property (nonatomic, copy) NSURL *previewImageURL __attribute__ ((deprecated("use appInvitePreviewImageURL instead"))); + +/*! + @abstract Compares the receiver to another app invite content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToAppInviteContent:(FBSDKAppInviteContent *)content; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m new file mode 100644 index 0000000..d54ff1c --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m @@ -0,0 +1,99 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppInviteContent.h" + +#import "FBSDKCoreKit+Internal.h" + +#define FBSDK_APP_INVITE_CONTENT_APP_LINK_URL_KEY @"appLinkURL" +#define FBSDK_APP_INVITE_CONTENT_PREVIEW_IMAGE_KEY @"previewImage" + +@implementation FBSDKAppInviteContent + +- (NSURL *)previewImageURL +{ + return self.appInvitePreviewImageURL; +} + +- (void)setPreviewImageURL:(NSURL *)previewImageURL +{ + self.appInvitePreviewImageURL = previewImageURL; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_appLinkURL hash], + [_appInvitePreviewImageURL hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKAppInviteContent class]]) { + return NO; + } + return [self isEqualToAppInviteContent:(FBSDKAppInviteContent *)object]; +} + +- (BOOL)isEqualToAppInviteContent:(FBSDKAppInviteContent *)content +{ + return (content && + [FBSDKInternalUtility object:_appLinkURL isEqualToObject:content.appLinkURL] && + [FBSDKInternalUtility object:_appInvitePreviewImageURL isEqualToObject:content.appInvitePreviewImageURL]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _appLinkURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_APP_INVITE_CONTENT_APP_LINK_URL_KEY]; + _appInvitePreviewImageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_APP_INVITE_CONTENT_PREVIEW_IMAGE_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_appLinkURL forKey:FBSDK_APP_INVITE_CONTENT_APP_LINK_URL_KEY]; + [encoder encodeObject:_appInvitePreviewImageURL forKey:FBSDK_APP_INVITE_CONTENT_PREVIEW_IMAGE_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKAppInviteContent *copy = [[FBSDKAppInviteContent alloc] init]; + copy->_appLinkURL = [_appLinkURL copy]; + copy->_appInvitePreviewImageURL = [_appInvitePreviewImageURL copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h new file mode 100644 index 0000000..0859d4c --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h @@ -0,0 +1,111 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +#import + +@protocol FBSDKAppInviteDialogDelegate; + +/*! + @abstract A dialog for sending App Invites. + */ +@interface FBSDKAppInviteDialog : NSObject + +/*! + @abstract Convenience method to show a FBSDKAppInviteDialog + @param viewController A UIViewController to present the dialog from. + @param content The content for the app invite. + @param delegate The receiver's delegate. +*/ ++ (instancetype)showFromViewController:(UIViewController *)viewController + withContent:(FBSDKAppInviteContent *)content + delegate:(id)delegate; + + +/*! + @deprecated use showFromViewController:withContent:delegate: instead + */ ++ (instancetype)showWithContent:(FBSDKAppInviteContent *)content delegate:(id)delegate +__attribute__ ((deprecated("use showFromViewController:withContent:delegate: instead"))); + +/*! + @abstract A UIViewController to present the dialog from. + @discussion If not specified, the top most view controller will be automatically determined as best as possible. + */ +@property (nonatomic, weak) UIViewController *fromViewController; + +/*! + @abstract The receiver's delegate or nil if it doesn't have a delegate. + */ +@property (nonatomic, weak) id delegate; + +/*! + @abstract The content for app invite. + */ +@property (nonatomic, copy) FBSDKAppInviteContent *content; + +/*! + @abstract A Boolean value that indicates whether the receiver can initiate an app invite. + @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is + required but not available. This method does not validate the content on the receiver, so this can be checked before + building up the content. + @see validateWithError: + @result YES if the receiver can show the dialog, otherwise NO. + */ +- (BOOL)canShow; + +/*! + @abstract Begins the app invite from the receiver. + @result YES if the receiver was able to show the dialog, otherwise NO. + */ +- (BOOL)show; + +/*! + @abstract Validates the content on the receiver. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return YES if the content is valid, otherwise NO. + */ +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; + +@end + +/*! + @abstract A delegate for FBSDKAppInviteDialog. + @discussion The delegate is notified with the results of the app invite as long as the application has permissions to + receive the information. For example, if the person is not signed into the containing app, the shower may not be able + to distinguish between completion of an app invite and cancellation. + */ +@protocol FBSDKAppInviteDialogDelegate + +/*! + @abstract Sent to the delegate when the app invite completes without error. + @param appInviteDialog The FBSDKAppInviteDialog that completed. + @param results The results from the dialog. This may be nil or empty. + */ +- (void)appInviteDialog:(FBSDKAppInviteDialog *)appInviteDialog didCompleteWithResults:(NSDictionary *)results; + +/*! + @abstract Sent to the delegate when the app invite encounters an error. + @param appInviteDialog The FBSDKAppInviteDialog that completed. + @param error The error. + */ +- (void)appInviteDialog:(FBSDKAppInviteDialog *)appInviteDialog didFailWithError:(NSError *)error; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m new file mode 100644 index 0000000..15fdcc6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m @@ -0,0 +1,197 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKAppInviteDialog.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareDefines.h" +#import "FBSDKShareError.h" +#import "FBSDKShareUtility.h" + +@implementation FBSDKAppInviteDialog + +#define FBSDK_APP_INVITE_METHOD_MIN_VERSION @"20140410" +#define FBSDK_APP_INVITE_METHOD_NAME @"appinvites" + ++ (void)initialize +{ + if ([FBSDKAppInviteDialog class] == self) { + [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; + // ensure that we have updated the dialog configs if we haven't already + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; + } +} + +#pragma mark - Class Methods + + ++ (instancetype)showWithContent:(FBSDKAppInviteContent *)content delegate:(id)delegate +{ + return [self showFromViewController:nil withContent:content delegate:delegate]; +} + ++ (instancetype)showFromViewController:(UIViewController *)viewController + withContent:(FBSDKAppInviteContent *)content + delegate:(id)delegate; +{ + FBSDKAppInviteDialog *appInvite = [[self alloc] init]; + appInvite.content = content; + appInvite.delegate = delegate; + appInvite.fromViewController = viewController; + [appInvite show]; + return appInvite; +} + +#pragma mark - Public Methods + +- (BOOL)canShow +{ + return YES; +} + +- (BOOL)show +{ + NSError *error; + if (![self canShow]) { + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"App invite dialog is not available."]; + [self _invokeDelegateDidFailWithError:error]; + return NO; + } + if (![self validateWithError:&error]) { + [self _invokeDelegateDidFailWithError:error]; + return NO; + } + + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:parameters setObject:self.content.appLinkURL forKey:@"app_link_url"]; + [FBSDKInternalUtility dictionary:parameters setObject:self.content.appInvitePreviewImageURL forKey:@"preview_image_url"]; + FBSDKBridgeAPIRequest *webBridgeRequest = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb + scheme:FBSDK_SHARE_JS_DIALOG_SCHEME + methodName:FBSDK_APP_INVITE_METHOD_NAME + methodVersion:nil + parameters:parameters + userInfo:nil]; + FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { + [self _handleCompletionWithDialogResults:response.responseParameters error:response.error]; + }; + + [self _logDialogShow]; + + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + BOOL useSafariViewController = [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameAppInvite]; + if ([self _canShowNative]) { + FBSDKBridgeAPIRequest *nativeRequest = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative + scheme:FBSDK_CANOPENURL_FACEBOOK + methodName:FBSDK_APP_INVITE_METHOD_NAME + methodVersion:FBSDK_APP_INVITE_METHOD_MIN_VERSION + parameters:parameters + userInfo:nil]; + void (^nativeCompletionBlock)(FBSDKBridgeAPIResponse *) = ^(FBSDKBridgeAPIResponse *response) { + if (response.error.code == FBSDKAppVersionUnsupportedErrorCode) { + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:webBridgeRequest + useSafariViewController:useSafariViewController + fromViewController:self.fromViewController + completionBlock:completionBlock]; + } else { + completionBlock(response); + } + }; + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:nativeRequest + useSafariViewController:useSafariViewController + fromViewController:self.fromViewController + completionBlock:nativeCompletionBlock]; + } else { + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:webBridgeRequest + useSafariViewController:useSafariViewController + fromViewController:self.fromViewController + completionBlock:completionBlock]; + } + return YES; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + return [FBSDKShareUtility validateAppInviteContent:self.content error:errorRef]; +} + +#pragma mark - Helper Methods + +- (BOOL)_canShowNative +{ + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + BOOL useNativeDialog = [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameAppInvite]; + return (useNativeDialog && [FBSDKInternalUtility isFacebookAppInstalled]); +} + +- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error +{ + if (error) { + [self _invokeDelegateDidFailWithError:error]; + } else { + [self _invokeDelegateDidCompleteWithResults:results]; + } +} + +- (void)_invokeDelegateDidCompleteWithResults:(NSDictionary *)results +{ + NSDictionary * parameters =@{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Completed, + }; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + if (!_delegate) { + return; + } + + [_delegate appInviteDialog:self didCompleteWithResults:[results copy]]; +} + +- (void)_invokeDelegateDidFailWithError:(NSError *)error +{ + NSDictionary * parameters =@{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Failed, + FBSDKAppEventParameterDialogErrorMessage : [NSString stringWithFormat:@"%@", error] + }; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + if (!_delegate) { + return; + } + + [_delegate appInviteDialog:self didFailWithError:error]; +} + +- (void)_logDialogShow +{ + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow + valueToSum:nil + parameters:nil + accessToken:[FBSDKAccessToken currentAccessToken]]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h new file mode 100644 index 0000000..13edc06 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h @@ -0,0 +1,131 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKGameRequestActionType) + @abstract Additional context about the nature of the request. + */ +typedef NS_ENUM(NSUInteger, FBSDKGameRequestActionType) +{ + /*! No action type */ + FBSDKGameRequestActionTypeNone = 0, + /*! Send action type: The user is sending an object to the friends. */ + FBSDKGameRequestActionTypeSend, + /*! Ask For action type: The user is asking for an object from friends. */ + FBSDKGameRequestActionTypeAskFor, + /*! Turn action type: It is the turn of the friends to play against the user in a match. (no object) */ + FBSDKGameRequestActionTypeTurn, +}; + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKGameRequestFilters) + @abstract Filter for who can be displayed in the multi-friend selector. + */ +typedef NS_ENUM(NSUInteger, FBSDKGameRequestFilter) +{ + /*! No filter, all friends can be displayed. */ + FBSDKGameRequestFilterNone = 0, + /*! Friends using the app can be displayed. */ + FBSDKGameRequestFilterAppUsers, + /*! Friends not using the app can be displayed. */ + FBSDKGameRequestFilterAppNonUsers, +}; + +/*! + @abstract A model for a game request. + */ +@interface FBSDKGameRequestContent : NSObject + +/*! + @abstract Used when defining additional context about the nature of the request. + @discussion The parameter 'objectID' is required if the action type is either + 'FBSDKGameRequestSendActionType' or 'FBSDKGameRequestAskForActionType'. + @seealso objectID + */ +@property (nonatomic, assign) FBSDKGameRequestActionType actionType; + +/*! + @abstract Compares the receiver to another game request content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToGameRequestContent:(FBSDKGameRequestContent *)content; + +/*! + @abstract Additional freeform data you may pass for tracking. This will be stored as part of + the request objects created. The maximum length is 255 characters. + */ +@property (nonatomic, copy) NSString *data; + +/*! + @abstract This controls the set of friends someone sees if a multi-friend selector is shown. + It is FBSDKGameRequestNoFilter by default, meaning that all friends can be shown. + If specify as FBSDKGameRequestAppUsersFilter, only friends who use the app will be shown. + On the other hands, use FBSDKGameRequestAppNonUsersFilter to filter only friends who do not use the app. + @discussion The parameter name is preserved to be consistent with the counter part on desktop. + */ +@property (nonatomic, assign) FBSDKGameRequestFilter filters; + +/*! + @abstract A plain-text message to be sent as part of the request. This text will surface in the App Center view + of the request, but not on the notification jewel. Required parameter. + */ +@property (nonatomic, copy) NSString *message; + +/*! + @abstract The Open Graph object ID of the object being sent. + @seealso actionType + */ +@property (nonatomic, copy) NSString *objectID; + +/*! + @abstract An array of user IDs, usernames or invite tokens (NSString) of people to send request. + @discussion These may or may not be a friend of the sender. If this is specified by the app, + the sender will not have a choice of recipients. If not, the sender will see a multi-friend selector + + This is equivalent to the "to" parameter when using the web game request dialog. + */ +@property (nonatomic, copy) NSArray *recipients; + +/*! + @abstract An array of user IDs that will be included in the dialog as the first suggested friends. + Cannot be used together with filters. + @discussion This is equivalent to the "suggestions" parameter when using the web game request dialog. +*/ +@property (nonatomic, copy) NSArray *recipientSuggestions; + +/*! + @deprecated Use `recipientSuggestions` instead. +*/ +@property (nonatomic, copy) NSArray *suggestions __attribute__ ((deprecated("use recipientSuggestions instead"))); + +/*! + @abstract The title for the dialog. + */ +@property (nonatomic, copy) NSString *title; + +/*! + @deprecated Use `recipients` instead. + */ +@property (nonatomic, copy) NSArray *to __attribute__ ((deprecated("use recipients instead"))); + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m new file mode 100644 index 0000000..c2f629e --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m @@ -0,0 +1,164 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGameRequestContent.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_APP_REQUEST_CONTENT_TO_KEY @"to" +#define FBSDK_APP_REQUEST_CONTENT_MESSAGE_KEY @"message" +#define FBSDK_APP_REQUEST_CONTENT_ACTION_TYPE_KEY @"actionType" +#define FBSDK_APP_REQUEST_CONTENT_OBJECT_ID_KEY @"objectID" +#define FBSDK_APP_REQUEST_CONTENT_FILTERS_KEY @"filters" +#define FBSDK_APP_REQUEST_CONTENT_SUGGESTIONS_KEY @"suggestions" +#define FBSDK_APP_REQUEST_CONTENT_DATA_KEY @"data" +#define FBSDK_APP_REQUEST_CONTENT_TITLE_KEY @"title" + +@implementation FBSDKGameRequestContent + +#pragma mark - Properties + +-(void)setRecipients:(NSArray *)recipients +{ + [FBSDKShareUtility assertCollection:recipients ofClass:[NSString class] name:@"recipients"]; + if (![_recipients isEqual:recipients]) { + _recipients = [recipients copy]; + } +} + +- (void)setRecipientSuggestions:(NSArray *)recipientSuggestions +{ + [FBSDKShareUtility assertCollection:recipientSuggestions ofClass:[NSString class] name:@"recipientSuggestions"]; + if (![_recipientSuggestions isEqual:recipientSuggestions]) { + _recipientSuggestions = [recipientSuggestions copy]; + } +} + +- (NSArray *)suggestions +{ + return self.recipientSuggestions; +} + +- (void)setSuggestions:(NSArray *)suggestions +{ + self.recipientSuggestions = suggestions; +} + +- (NSArray *)to +{ + return self.recipients; +} + +- (void)setTo:(NSArray *)to +{ + self.recipients = to; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [FBSDKMath hashWithInteger:_actionType], + [_data hash], + [FBSDKMath hashWithInteger:_filters], + [_message hash], + [_objectID hash], + [_recipientSuggestions hash], + [_title hash], + [_recipients hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKGameRequestContent class]]) { + return NO; + } + return [self isEqualToGameRequestContent:(FBSDKGameRequestContent *)object]; +} + +- (BOOL)isEqualToGameRequestContent:(FBSDKGameRequestContent *)content +{ + return (content && + _actionType == content.actionType && + _filters == content.filters && + [FBSDKInternalUtility object:_data isEqualToObject:content.data] && + [FBSDKInternalUtility object:_message isEqualToObject:content.message] && + [FBSDKInternalUtility object:_objectID isEqualToObject:content.objectID] && + [FBSDKInternalUtility object:_recipientSuggestions isEqualToObject:content.recipientSuggestions] && + [FBSDKInternalUtility object:_title isEqualToObject:content.title] && + [FBSDKInternalUtility object:_recipients isEqualToObject:content.recipients]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _actionType = [decoder decodeIntegerForKey:FBSDK_APP_REQUEST_CONTENT_ACTION_TYPE_KEY]; + _data = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_DATA_KEY]; + _filters = [decoder decodeIntegerForKey:FBSDK_APP_REQUEST_CONTENT_FILTERS_KEY]; + _message = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_MESSAGE_KEY]; + _objectID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_OBJECT_ID_KEY]; + _recipientSuggestions = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_APP_REQUEST_CONTENT_SUGGESTIONS_KEY]; + _title = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_TITLE_KEY]; + _recipients = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_APP_REQUEST_CONTENT_TO_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeInteger:_actionType forKey:FBSDK_APP_REQUEST_CONTENT_ACTION_TYPE_KEY]; + [encoder encodeObject:_data forKey:FBSDK_APP_REQUEST_CONTENT_DATA_KEY]; + [encoder encodeInteger:_filters forKey:FBSDK_APP_REQUEST_CONTENT_FILTERS_KEY]; + [encoder encodeObject:_message forKey:FBSDK_APP_REQUEST_CONTENT_MESSAGE_KEY]; + [encoder encodeObject:_objectID forKey:FBSDK_APP_REQUEST_CONTENT_OBJECT_ID_KEY]; + [encoder encodeObject:_recipientSuggestions forKey:FBSDK_APP_REQUEST_CONTENT_SUGGESTIONS_KEY]; + [encoder encodeObject:_title forKey:FBSDK_APP_REQUEST_CONTENT_TITLE_KEY]; + [encoder encodeObject:_recipients forKey:FBSDK_APP_REQUEST_CONTENT_TO_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKGameRequestContent *copy = [[FBSDKGameRequestContent alloc] init]; + copy->_actionType = _actionType; + copy->_data = [_data copy]; + copy->_filters = _filters; + copy->_message = [_message copy]; + copy->_objectID = [_objectID copy]; + copy->_recipientSuggestions = [_recipientSuggestions copy]; + copy->_title = [_title copy]; + copy->_recipients = [_recipients copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h new file mode 100644 index 0000000..2f5acc5 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h @@ -0,0 +1,105 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@protocol FBSDKGameRequestDialogDelegate; + +/*! + @abstract A dialog for sending game requests. + */ +@interface FBSDKGameRequestDialog : NSObject + +/*! + @abstract Convenience method to build up a game request with content and a delegate. + @param content The content for the game request. + @param delegate The receiver's delegate. + */ ++ (instancetype)showWithContent:(FBSDKGameRequestContent *)content delegate:(id)delegate; + +/*! + @abstract The receiver's delegate or nil if it doesn't have a delegate. + */ +@property (nonatomic, weak) id delegate; + +/*! + @abstract The content for game request. + */ +@property (nonatomic, copy) FBSDKGameRequestContent *content; + +/*! + @abstract Specifies whether frictionless requests are enabled. + */ +@property (nonatomic, assign) BOOL frictionlessRequestsEnabled; + +/*! + @abstract A Boolean value that indicates whether the receiver can initiate a game request. + @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is + required but not available. This method does not validate the content on the receiver, so this can be checked before + building up the content. + @see validateWithError: + @result YES if the receiver can share, otherwise NO. + */ +- (BOOL)canShow; + +/*! + @abstract Begins the game request from the receiver. + @result YES if the receiver was able to show the dialog, otherwise NO. + */ +- (BOOL)show; + +/*! + @abstract Validates the content on the receiver. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return YES if the content is valid, otherwise NO. + */ +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; + +@end + +/*! + @abstract A delegate for FBSDKGameRequestDialog. + @discussion The delegate is notified with the results of the game request as long as the application has permissions to + receive the information. For example, if the person is not signed into the containing app, the shower may not be able + to distinguish between completion of a game request and cancellation. + */ +@protocol FBSDKGameRequestDialogDelegate + +/*! + @abstract Sent to the delegate when the game request completes without error. + @param gameRequestDialog The FBSDKGameRequestDialog that completed. + @param results The results from the dialog. This may be nil or empty. + */ +- (void)gameRequestDialog:(FBSDKGameRequestDialog *)gameRequestDialog didCompleteWithResults:(NSDictionary *)results; + +/*! + @abstract Sent to the delegate when the game request encounters an error. + @param gameRequestDialog The FBSDKGameRequestDialog that completed. + @param error The error. + */ +- (void)gameRequestDialog:(FBSDKGameRequestDialog *)gameRequestDialog didFailWithError:(NSError *)error; + +/*! + @abstract Sent to the delegate when the game request dialog is cancelled. + @param gameRequestDialog The FBSDKGameRequestDialog that completed. + */ +- (void)gameRequestDialogDidCancel:(FBSDKGameRequestDialog *)gameRequestDialog; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m new file mode 100644 index 0000000..11932ae --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m @@ -0,0 +1,265 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGameRequestDialog.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKGameRequestFrictionlessRecipientCache.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareError.h" +#import "FBSDKShareUtility.h" + +@interface FBSDKGameRequestDialog () +@end + +@implementation FBSDKGameRequestDialog +{ + BOOL _dialogIsFrictionless; + FBSDKWebDialog *_webDialog; +} + +#define FBSDK_APP_REQUEST_METHOD_NAME @"apprequests" + +#pragma mark - Class Methods + +static FBSDKGameRequestFrictionlessRecipientCache *_recipientCache = nil; + ++ (void)initialize +{ + if (self == [FBSDKGameRequestDialog class]) { + _recipientCache = [[FBSDKGameRequestFrictionlessRecipientCache alloc] init]; + } +} + ++ (instancetype)showWithContent:(FBSDKGameRequestContent *)content delegate:(id)delegate +{ + FBSDKGameRequestDialog *dialog = [[self alloc] init]; + dialog.content = content; + dialog.delegate = delegate; + [dialog show]; + return dialog; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + _webDialog = [[FBSDKWebDialog alloc] init]; + _webDialog.delegate = self; + _webDialog.name = FBSDK_APP_REQUEST_METHOD_NAME; + } + return self; +} + +- (void)dealloc +{ + _webDialog.delegate = nil; +} + +#pragma mark - Public Methods + +- (BOOL)canShow +{ + return YES; +} + +- (BOOL)show +{ + NSError *error; + if (![self canShow]) { + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"Game request dialog is not available."]; + [_delegate gameRequestDialog:self didFailWithError:error]; + return NO; + } + if (![self validateWithError:&error]) { + [_delegate gameRequestDialog:self didFailWithError:error]; + return NO; + } + + FBSDKGameRequestContent *content = self.content; + + if (error) { + return NO; + } + + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:parameters setObject:[content.recipients componentsJoinedByString:@","] forKey:@"to"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.message forKey:@"message"]; + [FBSDKInternalUtility dictionary:parameters setObject:[self _actionTypeNameForActionType:content.actionType] forKey:@"action_type"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.objectID forKey:@"object_id"]; + [FBSDKInternalUtility dictionary:parameters setObject:[self _filtersNameForFilters:content.filters] forKey:@"filters"]; + [FBSDKInternalUtility dictionary:parameters setObject:[content.recipientSuggestions componentsJoinedByString:@","] forKey:@"suggestions"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.data forKey:@"data"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.title forKey:@"title"]; + + // check if we are sending to a specific set of recipients. if we are and they are all frictionless recipients, we + // can perform this action without displaying the web dialog + _webDialog.deferVisibility = NO; + NSArray *recipients = content.recipients; + if (_frictionlessRequestsEnabled && recipients) { + // specify these parameters to get the frictionless recipients from the dialog when it is presented + parameters[@"frictionless"] = @YES; + parameters[@"get_frictionless_recipients"] = @YES; + + _dialogIsFrictionless = YES; + if ([_recipientCache recipientsAreFrictionless:recipients]) { + _webDialog.deferVisibility = YES; + } + } + + _webDialog.parameters = parameters; + [_webDialog show]; + [FBSDKInternalUtility registerTransientObject:self]; + return YES; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + return [FBSDKShareUtility validateGameRequestContent:self.content error:errorRef]; +} + +#pragma mark - FBSDKWebDialogDelegate + +- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results +{ + if (_webDialog != webDialog) { + return; + } + if (_dialogIsFrictionless && results) { + [_recipientCache updateWithResults:results]; + } + [self _cleanUp]; + + NSError *error = [FBSDKShareError errorWithCode:[FBSDKTypeUtility unsignedIntegerValue:results[@"error_code"]] + message:[FBSDKTypeUtility stringValue:results[@"error_message"]]]; + if (!error.code) { + // reformat "to[x]" keys into an array. + int counter = 0; + NSMutableArray *toArray = [NSMutableArray array]; + while (true) { + NSString *key = [NSString stringWithFormat:@"to[%d]", counter++]; + if (results[key]) { + [toArray addObject:results[key]]; + } else { + break; + } + } + if (toArray.count) { + NSMutableDictionary *mutableResults = [results mutableCopy]; + mutableResults[@"to"] = toArray; + results = mutableResults; + } + } + [self _handleCompletionWithDialogResults:results error:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error +{ + if (_webDialog != webDialog) { + return; + } + [self _cleanUp]; + [self _handleCompletionWithDialogResults:nil error:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog +{ + if (_webDialog != webDialog) { + return; + } + [self _cleanUp]; + [_delegate gameRequestDialogDidCancel:self]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +#pragma mark - Helper Methods + +- (void)_cleanUp +{ + _dialogIsFrictionless = NO; +} + +- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error +{ + if (!_delegate) { + return; + } + switch (error.code) { + case 0:{ + [_delegate gameRequestDialog:self didCompleteWithResults:results]; + break; + } + case 4201:{ + [_delegate gameRequestDialogDidCancel:self]; + break; + } + default:{ + [_delegate gameRequestDialog:self didFailWithError:error]; + break; + } + } + if (error) { + return; + } else { + } +} + +- (NSString *)_actionTypeNameForActionType:(FBSDKGameRequestActionType)actionType +{ + switch (actionType) { + case FBSDKGameRequestActionTypeNone:{ + return nil; + } + case FBSDKGameRequestActionTypeSend:{ + return @"send"; + } + case FBSDKGameRequestActionTypeAskFor:{ + return @"askfor"; + } + case FBSDKGameRequestActionTypeTurn:{ + return @"turn"; + } + default:{ + return nil; + } + } +} + +- (NSString *)_filtersNameForFilters:(FBSDKGameRequestFilter)filters +{ + switch (filters) { + case FBSDKGameRequestFilterNone:{ + return nil; + } + case FBSDKGameRequestFilterAppUsers:{ + return @"app_users"; + } + case FBSDKGameRequestFilterAppNonUsers:{ + return @"app_non_users"; + } + default:{ + return nil; + } + } +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h new file mode 100644 index 0000000..0b01c4e --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h @@ -0,0 +1,42 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import +#import + +/*! + @abstract A button to like an object. + @discussion Tapping the receiver will invoke an API call to the Facebook app through a fast-app-switch that allows + the object to be liked. Upon return to the calling app, the view will update with the new state. If the + currentAccessToken has "publish_actions" permission and the object is an Open Graph object, then the like can happen + seamlessly without the fast-app-switch. + */ +@interface FBSDKLikeButton : FBSDKButton + +/*! + @abstract If YES, a sound is played when the receiver is toggled. + + @default YES + */ +@property (nonatomic, assign, getter = isSoundEnabled) BOOL soundEnabled; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m new file mode 100644 index 0000000..150cece --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m @@ -0,0 +1,294 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeButton.h" +#import "FBSDKLikeButton+Internal.h" + +#import "FBSDKCheckmarkIcon.h" +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKLikeActionController.h" +#import "FBSDKLikeControl+Internal.h" + +#define FBSDK_LIKE_BUTTON_ANIMATION_DURATION 0.2 +#define FBSDK_LIKE_BUTTON_ANIMATION_SPRING_DAMPING 0.3 +#define FBSDK_LIKE_BUTTON_ANIMATION_SPRING_VELOCITY 0.2 + +@implementation FBSDKLikeButton +{ + BOOL _isExplicitlyDisabled; + FBSDKLikeActionController *_likeActionController; + NSString *_objectID; + FBSDKLikeObjectType _objectType; +} + +#pragma mark - Class Methods + ++ (void)initialize +{ + if ([FBSDKLikeButton class] == self) { + // ensure that we have updated the dialog configs if we haven't already + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; + } +} + +#pragma mark - Object Lifecycle + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [_likeActionController endContentAccess]; +} + +#pragma mark - Properties + +- (FBSDKLikeActionController *)likeActionController +{ + [self _ensureLikeActionController:NO]; + return _likeActionController; +} + +- (void)setLikeActionController:(FBSDKLikeActionController *)likeActionController +{ + [self _setLikeActionController:likeActionController]; +} + +- (NSString *)objectID +{ + return _objectID; +} + +- (void)setObjectID:(NSString *)objectID +{ + if (![_objectID isEqualToString:objectID]) { + _objectID = objectID; + [self checkImplicitlyDisabled]; + [self _resetLikeActionController]; + } +} + +- (FBSDKLikeObjectType)objectType +{ + return _objectType; +} + +- (void)setObjectType:(FBSDKLikeObjectType)objectType +{ + if (_objectType != objectType) { + _objectType = objectType; + [self _resetLikeActionController]; + } +} + +#pragma mark - Layout + +- (void)layoutSubviews +{ + [self _ensureLikeActionController:YES]; + [super layoutSubviews]; +} + +#pragma mark - FBSDKButtonImpressionTracking + +- (NSDictionary *)analyticsParameters +{ + UIView *superview = self.superview; + while (superview && ![superview isKindOfClass:[FBSDKLikeControl class]]) { + superview = superview.superview; + } + if ([superview isKindOfClass:[FBSDKLikeControl class]]) { + return ((FBSDKLikeControl *)superview).analyticsParameters; + } + return @{ + @"object_id": (self.objectID ?: [NSNull null]), + @"object_type": (NSStringFromFBSDKLikeObjectType(self.objectType) ?: [NSNull null]), + @"sound_enabled": @(self.soundEnabled), + }; +} + +- (NSString *)impressionTrackingEventName +{ + return FBSDKAppEventNameFBSDKLikeButtonImpression; +} + +- (NSString *)impressionTrackingIdentifier +{ + return self.objectID; +} + +#pragma mark - FBSDKButton + +- (void)configureButton +{ + self.soundEnabled = YES; + + NSString *title = + NSLocalizedStringWithDefaultValue(@"LikeButton.Like", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"Like", + @"The label for the FBSDKLikeButton when the object is not currently liked."); + NSString *selectedTitle = + NSLocalizedStringWithDefaultValue(@"LikeButton.Liked", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"Liked", + @"The label for the FBSDKLikeButton when the object is currently liked."); + + UIColor *backgroundColor = [self defaultBackgroundColor]; + UIColor *highlightedColor = [self defaultHighlightedColor]; + UIColor *selectedColor = [self defaultSelectedColor]; + UIColor *selectedHighlightedColor = [UIColor colorWithRed:99.0/255.0 green:119.0/255.0 blue:178.0/255.0 alpha:1.0]; + + [self configureWithIcon:nil + title:title + backgroundColor:backgroundColor + highlightedColor:highlightedColor + selectedTitle:selectedTitle + selectedIcon:[[FBSDKCheckmarkIcon alloc] init] + selectedColor:selectedColor + selectedHighlightedColor:selectedHighlightedColor]; + + [self addTarget:self action:@selector(_handleTap:) forControlEvents:UIControlEventTouchUpInside]; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(_likeActionControllerDidDisableNotification:) + name:FBSDKLikeActionControllerDidDisableNotification + object:nil]; + [nc addObserver:self + selector:@selector(_likeActionControllerDidResetNotification:) + name:FBSDKLikeActionControllerDidResetNotification + object:nil]; + [nc addObserver:self + selector:@selector(_likeActionControllerDidUpdateNotification:) + name:FBSDKLikeActionControllerDidUpdateNotification + object:nil]; +} + +- (BOOL)isImplicitlyDisabled +{ + return !self.objectID || [FBSDKLikeActionController isDisabled]; +} + +#pragma mark - Helper Methods + +- (void)_ensureLikeActionController:(BOOL)notifyKVO +{ + if (!_likeActionController) { + FBSDKLikeActionController *likeActionController = [FBSDKLikeActionController likeActionControllerForObjectID:_objectID + objectType:_objectType]; + if (notifyKVO) { + self.likeActionController = likeActionController; + } else { + [self _setLikeActionController:likeActionController]; + } + [likeActionController endContentAccess]; + self.selected = _likeActionController.objectIsLiked; + } +} + +- (void)_handleTap:(FBSDKLikeButton *)likeButton +{ + [self logTapEventWithEventName:FBSDKAppEventNameFBSDKLikeButtonDidTap parameters:[self analyticsParameters]]; + [self _ensureLikeActionController:YES]; + [_likeActionController toggleLikeWithSoundEnabled:self.soundEnabled + analyticsParameters:[self analyticsParameters] + fromViewController:[FBSDKInternalUtility viewControllerforView:self]]; +} + +- (void)_like:(id)sender +{ + [_likeActionController toggleLikeWithSoundEnabled:_soundEnabled + analyticsParameters:[self analyticsParameters] + fromViewController:[FBSDKInternalUtility viewControllerforView:self]]; +} + +- (void)_likeActionControllerDidDisableNotification:(NSNotification *)notification +{ + [self checkImplicitlyDisabled]; +} + +- (void)_likeActionControllerDidResetNotification:(NSNotification *)notification +{ + [self _resetLikeActionController]; + [self _ensureLikeActionController:YES]; +} + +- (void)_likeActionControllerDidUpdateNotification:(NSNotification *)notification +{ + [self _ensureLikeActionController:YES]; + FBSDKLikeActionController *likeActionController = (FBSDKLikeActionController *)notification.object; + NSString *objectID = likeActionController.objectID; + if ([self.objectID isEqualToString:objectID]) { + BOOL animated = [notification.userInfo[FBSDKLikeActionControllerAnimatedKey] boolValue]; + [self _setSelected:likeActionController.objectIsLiked animated:animated]; + } +} + +- (void)_resetLikeActionController +{ + self.likeActionController = nil; + [self setNeedsLayout]; +} + +- (void)_setLikeActionController:(FBSDKLikeActionController *)likeActionController +{ + if (_likeActionController != likeActionController) { + [_likeActionController endContentAccess]; + _likeActionController = likeActionController; + [_likeActionController beginContentAccess]; + } +} + +- (void)_setSelected:(BOOL)selected animated:(BOOL)animated +{ + if (self.selected != selected) { + if (animated) { + CFTimeInterval duration = FBSDK_LIKE_BUTTON_ANIMATION_DURATION; + UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; + UIImageView *imageView = self.imageView; + imageView.frame = [self imageRectForContentRect:UIEdgeInsetsInsetRect(self.bounds, self.contentEdgeInsets)]; + [UIView animateWithDuration:duration delay:0.0 options:options animations:^{ + CGPoint iconImageViewCenter = imageView.center; + imageView.frame = CGRectMake(iconImageViewCenter.x, iconImageViewCenter.y, 0.0, 0.0); + } completion:^(BOOL animateOutFinished) { + self.selected = selected; + CGPoint iconImageViewCenter = imageView.center; + imageView.frame = CGRectMake(iconImageViewCenter.x, iconImageViewCenter.y, 0.0, 0.0); + + void(^animations)(void) = ^{ + imageView.frame = [self imageRectForContentRect:UIEdgeInsetsInsetRect(self.bounds, self.contentEdgeInsets)]; + }; + if ([UIView respondsToSelector:@selector(animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)]) { + [UIView animateWithDuration:(duration * 2) + delay:0.0 + usingSpringWithDamping:FBSDK_LIKE_BUTTON_ANIMATION_SPRING_DAMPING + initialSpringVelocity:FBSDK_LIKE_BUTTON_ANIMATION_SPRING_VELOCITY + options:options + animations:animations + completion:NULL]; + } else { + [UIView animateWithDuration:(duration * 2) + delay:0.0 + options:options + animations:animations + completion:NULL]; + } + }]; + } else { + self.selected = selected; + } + } +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h new file mode 100644 index 0000000..bbc88f2 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h @@ -0,0 +1,139 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import +#import + +/*! + @typedef NS_ENUM (NSUInteger, FBSDKLikeControlAuxiliaryPosition) + + @abstract Specifies the position of the auxiliary view relative to the like button. + */ +typedef NS_ENUM(NSUInteger, FBSDKLikeControlAuxiliaryPosition) +{ + /*! The auxiliary view is inline with the like button. */ + FBSDKLikeControlAuxiliaryPositionInline, + /*! The auxiliary view is above the like button. */ + FBSDKLikeControlAuxiliaryPositionTop, + /*! The auxiliary view is below the like button. */ + FBSDKLikeControlAuxiliaryPositionBottom, +}; + +/*! + @abstract Converts an FBSDKLikeControlAuxiliaryPosition to an NSString. + */ +FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlAuxiliaryPosition(FBSDKLikeControlAuxiliaryPosition auxiliaryPosition); + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKLikeControlHorizontalAlignment) + + @abstract Specifies the horizontal alignment for FBSDKLikeControlStyleStandard with + FBSDKLikeControlAuxiliaryPositionTop or FBSDKLikeControlAuxiliaryPositionBottom. + */ +typedef NS_ENUM(NSUInteger, FBSDKLikeControlHorizontalAlignment) +{ + /*! The subviews are left aligned. */ + FBSDKLikeControlHorizontalAlignmentLeft, + /*! The subviews are center aligned. */ + FBSDKLikeControlHorizontalAlignmentCenter, + /*! The subviews are right aligned. */ + FBSDKLikeControlHorizontalAlignmentRight, +}; + +/*! + @abstract Converts an FBSDKLikeControlHorizontalAlignment to an NSString. + */ +FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlHorizontalAlignment(FBSDKLikeControlHorizontalAlignment horizontalAlignment); + +/*! + @typedef NS_ENUM (NSUInteger, FBSDKLikeControlStyle) + + @abstract Specifies the style of a like control. + */ +typedef NS_ENUM(NSUInteger, FBSDKLikeControlStyle) +{ + /*! Displays the button and the social sentence. */ + FBSDKLikeControlStyleStandard = 0, + /*! Displays the button and a box that contains the like count. */ + FBSDKLikeControlStyleBoxCount, +}; + +/*! + @abstract Converts an FBSDKLikeControlStyle to an NSString. + */ +FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlStyle(FBSDKLikeControlStyle style); + +/*! + @class FBSDKLikeControl + + @abstract UI control to like an object in the Facebook graph. + + @discussion Taps on the like button within this control will invoke an API call to the Facebook app through a + fast-app-switch that allows the user to like the object. Upon return to the calling app, the view will update + with the new state and send actions for the UIControlEventValueChanged event. + */ +@interface FBSDKLikeControl : UIControl + +/*! + @abstract The foreground color to use for the content of the receiver. + */ +@property (nonatomic, strong) UIColor *foregroundColor; + +/*! + @abstract The position for the auxiliary view for the receiver. + + @see FBSDKLikeControlAuxiliaryPosition + */ +@property (nonatomic, assign) FBSDKLikeControlAuxiliaryPosition likeControlAuxiliaryPosition; + +/*! + @abstract The text alignment of the social sentence. + + @discussion This value is only valid for FBSDKLikeControlStyleStandard with + FBSDKLikeControlAuxiliaryPositionTop|Bottom. + */ +@property (nonatomic, assign) FBSDKLikeControlHorizontalAlignment likeControlHorizontalAlignment; + +/*! + @abstract The style to use for the receiver. + + @see FBSDKLikeControlStyle + */ +@property (nonatomic, assign) FBSDKLikeControlStyle likeControlStyle; + +/*! + @abstract The preferred maximum width (in points) for autolayout. + + @discussion This property affects the size of the receiver when layout constraints are applied to it. During layout, + if the text extends beyond the width specified by this property, the additional text is flowed to one or more new + lines, thereby increasing the height of the receiver. + */ +@property (nonatomic, assign) CGFloat preferredMaxLayoutWidth; + +/*! + @abstract If YES, a sound is played when the receiver is toggled. + + @default YES + */ +@property (nonatomic, assign, getter = isSoundEnabled) BOOL soundEnabled; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m new file mode 100644 index 0000000..6a8167a --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m @@ -0,0 +1,664 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeControl.h" +#import "FBSDKLikeControl+Internal.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKLikeActionController.h" +#import "FBSDKLikeBoxView.h" +#import "FBSDKLikeButton+Internal.h" +#import "FBSDKLikeButton.h" + +#define kFBLikeControlAnimationDuration 0.2 +#define kFBLikeControlSocialSentenceAnimationOffset 10.0 + +static void *FBSDKLikeControlKVOLikeActionControllerContext = &FBSDKLikeControlKVOLikeActionControllerContext; + +NSString *NSStringFromFBSDKLikeControlAuxiliaryPosition(FBSDKLikeControlAuxiliaryPosition auxiliaryPosition) +{ + switch (auxiliaryPosition) { + case FBSDKLikeControlAuxiliaryPositionBottom: + return @"bottom"; + case FBSDKLikeControlAuxiliaryPositionInline: + return @"inline"; + case FBSDKLikeControlAuxiliaryPositionTop: + return @"top"; + } + return nil; +} + +NSString *NSStringFromFBSDKLikeControlHorizontalAlignment(FBSDKLikeControlHorizontalAlignment horizontalAlignment) +{ + switch (horizontalAlignment) { + case FBSDKLikeControlHorizontalAlignmentCenter: + return @"center"; + case FBSDKLikeControlHorizontalAlignmentLeft: + return @"left"; + case FBSDKLikeControlHorizontalAlignmentRight: + return @"right"; + } + return nil; +} + +NSString *NSStringFromFBSDKLikeControlStyle(FBSDKLikeControlStyle style) +{ + switch (style) { + case FBSDKLikeControlStyleBoxCount: + return @"box_count"; + case FBSDKLikeControlStyleStandard: + return @"standard"; + } + return nil; +} + +typedef struct FBSDKLikeControlLayout +{ + CGSize contentSize; + CGRect likeButtonFrame; + CGRect auxiliaryViewFrame; +} FBSDKLikeControlLayout; + +typedef CGSize (^fbsdk_like_control_sizing_block_t)(UIView *subview, CGSize constrainedSize); + +@implementation FBSDKLikeControl +{ + BOOL _isExplicitlyDisabled; + FBSDKLikeBoxView *_likeBoxView; + FBSDKLikeButton *_likeButton; + UIView *_likeButtonContainer; + UILabel *_socialSentenceLabel; +} + +#pragma mark - Class Methods + ++ (void)initialize +{ + if ([FBSDKLikeControl class] == self) { + // ensure that we have updated the dialog configs if we haven't already + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; + } +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + [self _initializeContent]; + if (CGRectEqualToRect(frame, CGRectZero)) { + [self sizeToFit]; + } + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [super initWithCoder:decoder])) { + [self _initializeContent]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [_likeButton removeObserver:self forKeyPath:@"likeActionController"]; +} + +#pragma mark - Properties + +- (void)setBackgroundColor:(UIColor *)backgroundColor +{ + [super setBackgroundColor:backgroundColor]; + _likeButtonContainer.backgroundColor = backgroundColor; +} + +- (void)setForegroundColor:(UIColor *)foregroundColor +{ + if (![_foregroundColor isEqual:foregroundColor]) { + _foregroundColor = foregroundColor; + [_likeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _socialSentenceLabel.textColor = foregroundColor; + } +} + +- (void)setEnabled:(BOOL)enabled +{ + _isExplicitlyDisabled = !enabled; + [self _updateEnabled]; +} + +- (void)setLikeControlAuxiliaryPosition:(FBSDKLikeControlAuxiliaryPosition)likeControlAuxiliaryPosition +{ + if (_likeControlAuxiliaryPosition != likeControlAuxiliaryPosition) { + _likeControlAuxiliaryPosition = likeControlAuxiliaryPosition; + [self _updateLikeBoxCaretPosition]; + [self setNeedsLayout]; + [self setNeedsUpdateConstraints]; + [self invalidateIntrinsicContentSize]; + } +} + +- (void)setLikeControlHorizontalAlignment:(FBSDKLikeControlHorizontalAlignment)likeControlHorizontalAlignment +{ + if (_likeControlHorizontalAlignment != likeControlHorizontalAlignment) { + _likeControlHorizontalAlignment = likeControlHorizontalAlignment; + [self _updateLikeBoxCaretPosition]; + [self setNeedsLayout]; + [self setNeedsUpdateConstraints]; + [self invalidateIntrinsicContentSize]; + } +} + +- (void)setLikeControlStyle:(FBSDKLikeControlStyle)likeControlStyle +{ + if (_likeControlStyle != likeControlStyle) { + _likeControlStyle = likeControlStyle; + [self _updateLikeBoxCaretPosition]; + [self setNeedsLayout]; + [self setNeedsUpdateConstraints]; + [self invalidateIntrinsicContentSize]; + } +} + +- (NSString *)objectID +{ + return _likeButton.objectID; +} + +- (void)setObjectID:(NSString *)objectID +{ + if (![_likeButton.objectID isEqualToString:objectID]) { + _likeButton.objectID = objectID; + [self _updateEnabled]; + [self setNeedsLayout]; + } +} + +- (FBSDKLikeObjectType)objectType +{ + return _likeButton.objectType; +} + +- (void)setObjectType:(FBSDKLikeObjectType)objectType +{ + if (_likeButton.objectType != objectType) { + _likeButton.objectType = objectType; + [self setNeedsLayout]; + } +} + +- (void)setOpaque:(BOOL)opaque +{ + [super setOpaque:opaque]; + _likeButtonContainer.opaque = opaque; +} + +- (BOOL)isSoundEnabled +{ + return _likeButton.soundEnabled; +} + +- (void)setSoundEnabled:(BOOL)soundEnabled +{ + _likeButton.soundEnabled = soundEnabled; +} + +#pragma mark - Layout + +- (CGSize)intrinsicContentSize +{ + CGFloat width = self.preferredMaxLayoutWidth; + if (width == 0) { + width = CGFLOAT_MAX; + } + CGRect bounds = CGRectMake(0.0, 0.0, width, CGFLOAT_MAX); + return [self _layoutWithBounds:bounds subviewSizingBlock:^CGSize(UIView *subview, CGSize constrainedSize) { + if ([subview respondsToSelector:@selector(setPreferredMaxLayoutWidth:)]) { + [(id)subview setPreferredMaxLayoutWidth:constrainedSize.width]; + } + return subview.intrinsicContentSize; + }].contentSize; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + NSString *objectID = self.objectID; + if (objectID) { + FBSDKViewImpressionTracker *impressionTracker = + [FBSDKViewImpressionTracker impressionTrackerWithEventName:FBSDKAppEventNameFBSDKLikeControlImpression]; + [impressionTracker logImpressionWithIdentifier:objectID parameters:[self analyticsParameters]]; + } + + [self _ensureLikeActionController]; + + CGRect bounds = self.bounds; + CGSize(^sizingBlock)(UIView *, CGSize) = ^CGSize(UIView *subview, CGSize constrainedSize) { + return [subview sizeThatFits:constrainedSize]; + }; + FBSDKLikeControlLayout layout = [self _layoutWithBounds:bounds subviewSizingBlock:sizingBlock]; + + UIView *auxiliaryView = [self _auxiliaryView]; + _likeBoxView.hidden = (_likeBoxView != auxiliaryView); + _socialSentenceLabel.hidden = (_socialSentenceLabel != auxiliaryView); + + _likeButtonContainer.frame = layout.likeButtonFrame; + _likeButton.frame = _likeButtonContainer.bounds; + auxiliaryView.frame = layout.auxiliaryViewFrame; +} + +- (CGSize)sizeThatFits:(CGSize)size +{ + switch (self.likeControlAuxiliaryPosition) { + case FBSDKLikeControlAuxiliaryPositionInline:{ + size.height = MAX(size.height, CGRectGetHeight(self.bounds)); + break; + } + case FBSDKLikeControlAuxiliaryPositionTop: + case FBSDKLikeControlAuxiliaryPositionBottom:{ + size.width = MAX(size.width, CGRectGetWidth(self.bounds)); + break; + } + } + + CGRect bounds = CGRectMake(0.0, 0.0, size.width, size.height); + return [self _layoutWithBounds:bounds subviewSizingBlock:^CGSize(UIView *subview, CGSize constrainedSize) { + return [subview sizeThatFits:constrainedSize]; + }].contentSize; +} + +#pragma mark - Internal Methods + +- (NSDictionary *)analyticsParameters +{ + return @{ + @"auxiliary_position": NSStringFromFBSDKLikeControlAuxiliaryPosition(self.likeControlAuxiliaryPosition), + @"horizontal_alignment": NSStringFromFBSDKLikeControlHorizontalAlignment(self.likeControlHorizontalAlignment), + @"object_id": (self.objectID ?: [NSNull null]), + @"object_type": (NSStringFromFBSDKLikeObjectType(self.objectType) ?: [NSNull null]), + @"sound_enabled": @(self.soundEnabled), + @"style": NSStringFromFBSDKLikeControlStyle(self.likeControlStyle), + }; +} + +#pragma mark - Helper Methods + +- (UIView *)_auxiliaryView +{ + [self _ensureLikeActionController]; + switch (_likeControlStyle) { + case FBSDKLikeControlStyleStandard:{ + return (_socialSentenceLabel.text.length == 0 ? nil : _socialSentenceLabel); + } + case FBSDKLikeControlStyleBoxCount:{ + return (_likeButton.likeActionController.likeCountString == nil ? nil : _likeBoxView); + } + } + return nil; +} + +- (CGFloat)_auxiliaryViewPadding +{ + switch (_likeControlStyle) { + case FBSDKLikeControlStyleStandard:{ + return 8.0; + } + case FBSDKLikeControlStyleBoxCount:{ + return 0.0; + } + } + return 0.0; +} + +- (void)_ensureLikeActionController +{ + FBSDKLikeActionController *likeActionController = _likeButton.likeActionController; + if (likeActionController) { + _socialSentenceLabel.text = likeActionController.socialSentence; + _likeBoxView.text = likeActionController.likeCountString; + } +} + +- (void)_handleLikeButtonTap:(FBSDKLikeButton *)likeButton +{ + [self _ensureLikeActionController]; + [self sendActionsForControlEvents:UIControlEventTouchUpInside]; +} + +- (void)_initializeContent +{ + self.backgroundColor = [UIColor clearColor]; + _foregroundColor = [UIColor blackColor]; + + _likeButtonContainer = [[UIView alloc] initWithFrame:CGRectZero]; + _likeButtonContainer.backgroundColor = self.backgroundColor; + _likeButtonContainer.opaque = self.opaque; + [self addSubview:_likeButtonContainer]; + + _likeButton = [[FBSDKLikeButton alloc] initWithFrame:CGRectZero]; + [_likeButton addTarget:self action:@selector(_handleLikeButtonTap:) forControlEvents:UIControlEventTouchUpInside]; + [_likeButtonContainer addSubview:_likeButton]; + + _socialSentenceLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + _socialSentenceLabel.font = [UIFont systemFontOfSize:11.0]; + _socialSentenceLabel.numberOfLines = 2; + [self addSubview:_socialSentenceLabel]; + + _likeBoxView = [[FBSDKLikeBoxView alloc] initWithFrame:CGRectZero]; + [self addSubview:_likeBoxView]; + + // use KVO to monitor changes to the likeActionController instance on FBSDKButton in order to avoid race conditions + // between notification observers + [_likeButton addObserver:self + forKeyPath:@"likeActionController" + options:NSKeyValueObservingOptionInitial + context:FBSDKLikeControlKVOLikeActionControllerContext]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(_likeActionControllerDidDisableNotification:) + name:FBSDKLikeActionControllerDidDisableNotification + object:nil]; + [nc addObserver:self + selector:@selector(_likeActionControllerDidUpdateNotification:) + name:FBSDKLikeActionControllerDidUpdateNotification + object:nil]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context +{ + if (context == FBSDKLikeControlKVOLikeActionControllerContext) { + [self _likeActionControllerDidUpdateWithAnimated:NO]; + } else { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + +static void FBSDKLikeControlApplyHorizontalAlignment(CGRect *frameRef, + CGRect bounds, + FBSDKLikeControlHorizontalAlignment alignment) +{ + if (frameRef == NULL) { + return; + } + + CGRect frame = *frameRef; + switch (alignment) { + case FBSDKLikeControlHorizontalAlignmentLeft:{ + frame.origin.x = CGRectGetMinX(bounds); + break; + } + case FBSDKLikeControlHorizontalAlignmentCenter:{ + frame.origin.x = CGRectGetMinX(bounds) + floorf((CGRectGetWidth(bounds) - CGRectGetWidth(frame)) / 2); + break; + } + case FBSDKLikeControlHorizontalAlignmentRight:{ + frame.origin.x = CGRectGetMinX(bounds) + CGRectGetWidth(bounds) - CGRectGetWidth(frame); + break; + } + } + *frameRef = frame; +} + +static CGFloat FBSDKLikeControlPaddedDistance(CGFloat distance, CGFloat padding, BOOL includeDistance) +{ + return (distance == 0.0 ? 0.0 : (includeDistance ? distance : 0.0) + padding); +} + +static CGSize FBSDKLikeControlCalculateContentSize(FBSDKLikeControlLayout layout) +{ + return CGSizeMake(MAX(CGRectGetMaxX(layout.likeButtonFrame), CGRectGetMaxX(layout.auxiliaryViewFrame)), + MAX(CGRectGetMaxY(layout.likeButtonFrame), CGRectGetMaxY(layout.auxiliaryViewFrame))); + +} + +- (FBSDKLikeControlLayout)_layoutWithBounds:(CGRect)bounds + subviewSizingBlock:(fbsdk_like_control_sizing_block_t)subviewSizingBlock +{ + FBSDKLikeControlLayout layout; + + CGSize likeButtonSize = subviewSizingBlock(_likeButton, bounds.size); + layout.likeButtonFrame = CGRectMake(CGRectGetMinX(bounds), + CGRectGetMinY(bounds), + likeButtonSize.width, + likeButtonSize.height); + layout.auxiliaryViewFrame = CGRectZero; + + UIView *auxiliaryView = [self _auxiliaryView]; + CGFloat auxiliaryViewPadding = [self _auxiliaryViewPadding]; + CGSize auxiliaryViewSize = CGSizeZero; + switch (self.likeControlAuxiliaryPosition) { + case FBSDKLikeControlAuxiliaryPositionInline:{ + if (auxiliaryView) { + auxiliaryViewSize = CGSizeMake((CGRectGetWidth(bounds) - + auxiliaryViewPadding - + CGRectGetWidth(layout.likeButtonFrame)), + CGRectGetHeight(bounds)); + auxiliaryViewSize = subviewSizingBlock(auxiliaryView, auxiliaryViewSize); + + layout.auxiliaryViewFrame = CGRectMake(CGRectGetMinX(bounds), + CGRectGetMinY(bounds), + auxiliaryViewSize.width, + MAX(auxiliaryViewSize.height, + CGRectGetHeight(layout.likeButtonFrame))); + } + + // align the views next to each other for sizing + FBSDKLikeControlApplyHorizontalAlignment(&layout.likeButtonFrame, + bounds, + FBSDKLikeControlHorizontalAlignmentLeft); + if (auxiliaryView) { + layout.auxiliaryViewFrame.origin.x = CGRectGetMaxX(layout.likeButtonFrame) + auxiliaryViewPadding; + } + + // calculate the size before offsetting the horizontal alignment, using the total calculated width + layout.contentSize = FBSDKLikeControlCalculateContentSize(layout); + + // layout the subviews next to each other + switch (self.likeControlHorizontalAlignment) { + case FBSDKLikeControlHorizontalAlignmentLeft:{ + // already done + break; + } + case FBSDKLikeControlHorizontalAlignmentCenter:{ + layout.likeButtonFrame.origin.x = floorf((CGRectGetWidth(bounds) - layout.contentSize.width) / 2); + if (auxiliaryView) { + layout.auxiliaryViewFrame.origin.x = (CGRectGetMaxX(layout.likeButtonFrame) + + auxiliaryViewPadding); + } + break; + } + case FBSDKLikeControlHorizontalAlignmentRight:{ + layout.likeButtonFrame.origin.x = CGRectGetMaxX(bounds) - CGRectGetWidth(layout.likeButtonFrame); + if (auxiliaryView) { + layout.auxiliaryViewFrame.origin.x = (CGRectGetMinX(layout.likeButtonFrame) - + auxiliaryViewPadding - + CGRectGetWidth(layout.auxiliaryViewFrame)); + } + break; + } + } + + break; + } + case FBSDKLikeControlAuxiliaryPositionTop:{ + if (auxiliaryView) { + auxiliaryViewSize = CGSizeMake(CGRectGetWidth(bounds), + (CGRectGetHeight(bounds) - + auxiliaryViewPadding - + CGRectGetHeight(layout.likeButtonFrame))); + auxiliaryViewSize = subviewSizingBlock(auxiliaryView, auxiliaryViewSize); + + layout.auxiliaryViewFrame = CGRectMake(CGRectGetMinX(bounds), + CGRectGetMinY(bounds), + MAX(auxiliaryViewSize.width, + CGRectGetWidth(layout.likeButtonFrame)), + auxiliaryViewSize.height); + } + layout.likeButtonFrame.origin.y = FBSDKLikeControlPaddedDistance(CGRectGetMaxY(layout.auxiliaryViewFrame), + auxiliaryViewPadding, + YES); + + // calculate the size before offsetting the horizontal alignment, using the total calculated width + layout.contentSize = FBSDKLikeControlCalculateContentSize(layout); + + FBSDKLikeControlApplyHorizontalAlignment(&layout.likeButtonFrame, bounds, self.likeControlHorizontalAlignment); + FBSDKLikeControlApplyHorizontalAlignment(&layout.auxiliaryViewFrame, + bounds, + self.likeControlHorizontalAlignment); + break; + } + case FBSDKLikeControlAuxiliaryPositionBottom:{ + if (auxiliaryView) { + auxiliaryViewSize = CGSizeMake(CGRectGetWidth(bounds), + (CGRectGetHeight(bounds) - + auxiliaryViewPadding - + CGRectGetHeight(layout.likeButtonFrame))); + auxiliaryViewSize = subviewSizingBlock(auxiliaryView, auxiliaryViewSize); + + layout.auxiliaryViewFrame = CGRectMake(CGRectGetMinX(bounds), + CGRectGetMaxY(layout.likeButtonFrame) + auxiliaryViewPadding, + MAX(auxiliaryViewSize.width, + CGRectGetWidth(layout.likeButtonFrame)), + auxiliaryViewSize.height); + } + + // calculate the size before offsetting the horizontal alignment, using the total calculated width + layout.contentSize = FBSDKLikeControlCalculateContentSize(layout); + + FBSDKLikeControlApplyHorizontalAlignment(&layout.likeButtonFrame, bounds, self.likeControlHorizontalAlignment); + FBSDKLikeControlApplyHorizontalAlignment(&layout.auxiliaryViewFrame, + bounds, + self.likeControlHorizontalAlignment); + break; + } + } + + return layout; +} + +- (void)_likeActionControllerDidDisableNotification:(NSNotification *)notification +{ + [self _updateEnabled]; +} + +- (void)_likeActionControllerDidUpdateNotification:(NSNotification *)notification +{ + [self _ensureLikeActionController]; + FBSDKLikeActionController *likeActionController = (FBSDKLikeActionController *)notification.object; + NSString *objectID = likeActionController.objectID; + if ([self.objectID isEqualToString:objectID]) { + BOOL animated = [notification.userInfo[FBSDKLikeActionControllerAnimatedKey] boolValue]; + [self _likeActionControllerDidUpdateWithAnimated:animated]; + } +} + +- (void)_likeActionControllerDidUpdateWithAnimated:(BOOL)animated +{ + FBSDKLikeActionController *likeActionController = _likeButton.likeActionController; + NSString *objectID = likeActionController.objectID; + if ([self.objectID isEqualToString:objectID]) { + _likeBoxView.text = _likeButton.likeActionController.likeCountString; + + if (animated) { + void(^hideView)(UIView *) = ^(UIView *view){ + view.alpha = 0.0; + CGRect frame = view.frame; + frame.origin.y += kFBLikeControlSocialSentenceAnimationOffset; + view.frame = frame; + }; + [UIView animateWithDuration:kFBLikeControlAnimationDuration animations:^{ + hideView(_socialSentenceLabel); + } completion:^(BOOL finished) { + _socialSentenceLabel.text = likeActionController.socialSentence; + [self setNeedsLayout]; + [self setNeedsUpdateConstraints]; + [self invalidateIntrinsicContentSize]; + [self layoutIfNeeded]; + hideView(_socialSentenceLabel); + + [UIView animateWithDuration:kFBLikeControlAnimationDuration animations:^{ + _socialSentenceLabel.alpha = 1.0; + [self setNeedsLayout]; + [self layoutIfNeeded]; + }]; + }]; + } else { + _socialSentenceLabel.text = likeActionController.socialSentence; + [self setNeedsLayout]; + [self setNeedsUpdateConstraints]; + [self invalidateIntrinsicContentSize]; + } + + [self sendActionsForControlEvents:UIControlEventValueChanged]; + } +} + +- (void)_updateEnabled +{ + BOOL enabled = (!_isExplicitlyDisabled && + self.objectID && + ![FBSDKLikeActionController isDisabled]); + BOOL currentEnabled = [self isEnabled]; + [super setEnabled:enabled]; + if (currentEnabled != enabled) { + [self invalidateIntrinsicContentSize]; + [self setNeedsLayout]; + } +} + +- (void)_updateLikeBoxCaretPosition +{ + if (self.likeControlStyle != FBSDKLikeControlStyleBoxCount) { + return; + } + + switch (self.likeControlAuxiliaryPosition) { + case FBSDKLikeControlAuxiliaryPositionInline:{ + switch (self.likeControlHorizontalAlignment) { + case FBSDKLikeControlHorizontalAlignmentLeft: + case FBSDKLikeControlHorizontalAlignmentCenter:{ + _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionLeft; + break; + } + case FBSDKLikeControlHorizontalAlignmentRight:{ + _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionRight; + break; + } + } + break; + } + case FBSDKLikeControlAuxiliaryPositionTop:{ + _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionBottom; + break; + } + case FBSDKLikeControlAuxiliaryPositionBottom:{ + _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionTop; + break; + } + } +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h new file mode 100644 index 0000000..dadff43 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h @@ -0,0 +1,40 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @typedef NS_ENUM (NSUInteger, FBSDKLikeObjectType) + @abstract Specifies the type of object referenced by the objectID for likes. + */ +typedef NS_ENUM(NSUInteger, FBSDKLikeObjectType) +{ + /*! The objectID refers to an unknown object type. */ + FBSDKLikeObjectTypeUnknown = 0, + /*! The objectID refers to an Open Graph object. */ + FBSDKLikeObjectTypeOpenGraph, + /*! The objectID refers to an Page object. */ + FBSDKLikeObjectTypePage, +}; + +/*! + @abstract Converts an FBLikeControlObjectType to an NSString. + */ +FBSDK_EXTERN NSString *NSStringFromFBSDKLikeObjectType(FBSDKLikeObjectType objectType); diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m new file mode 100644 index 0000000..273fab1 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m @@ -0,0 +1,32 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeObjectType.h" + +NSString *NSStringFromFBSDKLikeObjectType(FBSDKLikeObjectType objectType) +{ + switch (objectType) { + case FBSDKLikeObjectTypeUnknown: + return @"unknown"; + case FBSDKLikeObjectTypeOpenGraph: + return @"open_graph"; + case FBSDKLikeObjectTypePage: + return @"page"; + } + return nil; +} diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h new file mode 100644 index 0000000..e2d4a4a --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h @@ -0,0 +1,45 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @abstract The common interface for components that initiate liking. + @see FBSDKLikeButton + @see FBSDKLikeControl + */ +@protocol FBSDKLiking + +/*! + @abstract The objectID for the object to like. + + @discussion This value may be an Open Graph object ID or a string representation of an URL that describes an + Open Graph object. The objects may be public objects, like pages, or objects that are defined by your application. + */ +@property (nonatomic, copy) NSString *objectID; + +/*! + @abstract The type of object referenced by the objectID. + + @discussion If the objectType is unknown, the control will determine the objectType by querying the server with the + objectID. Specifying a value for the objectType is an optimization that should be used if the type is known by the + consumer. Consider setting the objectType if it is known when setting the objectID. + */ +@property (nonatomic, assign) FBSDKLikeObjectType objectType; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h new file mode 100644 index 0000000..2819eb7 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A dialog for sharing content through Messenger. + */ +@interface FBSDKMessageDialog : NSObject + +/*! + @abstract Convenience method to show a Message Share Dialog with content and a delegate. + @param content The content to be shared. + @param delegate The receiver's delegate. + */ ++ (instancetype)showWithContent:(id)content delegate:(id)delegate; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m new file mode 100644 index 0000000..070fd99 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m @@ -0,0 +1,221 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKMessageDialog.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareDefines.h" +#import "FBSDKShareError.h" +#import "FBSDKShareOpenGraphContent.h" +#import "FBSDKShareUtility.h" +#import "FBSDKShareVideoContent.h" + +#define FBSDK_MESSAGE_DIALOG_APP_SCHEME @"fb-messenger-api" +#define FBSDK_MESSAGE_METHOD_MIN_VERSION @"20140430" + +@implementation FBSDKMessageDialog + +#pragma mark - Class Methods + ++ (void)initialize +{ + if ([FBSDKMessageDialog class] == self) { + [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_MESSENGER]; + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; + } +} + ++ (instancetype)showWithContent:(id)content delegate:(id)delegate +{ + FBSDKMessageDialog *dialog = [[self alloc] init]; + dialog.shareContent = content; + dialog.delegate = delegate; + [dialog show]; + return dialog; +} + +#pragma mark - Properties + +@synthesize delegate = _delegate; +@synthesize shareContent = _shareContent; +@synthesize shouldFailOnDataError = _shouldFailOnDataError; + +#pragma mark - Public Methods + +- (BOOL)canShow +{ + return [self _canShowNative]; +} + +- (BOOL)show +{ + NSError *error; + if (![self canShow]) { + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"Message dialog is not available."]; + [self _invokeDelegateDidFailWithError:error]; + return NO; + } + if (![self validateWithError:&error]) { + [self _invokeDelegateDidFailWithError:error]; + return NO; + } + + id shareContent = self.shareContent; + NSDictionary *parameters = [FBSDKShareUtility parametersForShareContent:shareContent + shouldFailOnDataError:self.shouldFailOnDataError]; + NSString *methodName = ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]] ? + FBSDK_SHARE_OPEN_GRAPH_METHOD_NAME : + FBSDK_SHARE_METHOD_NAME); + FBSDKBridgeAPIRequest *request; + request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative + scheme:FBSDK_MESSAGE_DIALOG_APP_SCHEME + methodName:methodName + methodVersion:FBSDK_MESSAGE_METHOD_MIN_VERSION + parameters:parameters + userInfo:nil]; + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + BOOL useSafariViewController = [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameMessage]; + FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { + [self _handleCompletionWithDialogResults:response.responseParameters response:response]; + [FBSDKInternalUtility unregisterTransientObject:self]; + }; + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request + useSafariViewController:useSafariViewController + fromViewController:nil + completionBlock:completionBlock]; + + [self _logDialogShow]; + [FBSDKInternalUtility registerTransientObject:self]; + return YES; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + id shareContent = self.shareContent; + if (!shareContent) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" message:nil]; + } + return NO; + } + return [FBSDKShareUtility validateShareContent:self.shareContent error:errorRef]; +} + +#pragma mark - Helper Methods + +- (BOOL)_canShowNative +{ + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + BOOL useNativeDialog = [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameMessage]; + return (useNativeDialog && [FBSDKInternalUtility isMessengerAppInstalled]); +} + +- (void)_handleCompletionWithDialogResults:(NSDictionary *)results response:(FBSDKBridgeAPIResponse *)response +{ + NSString *completionGesture = results[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + if ([completionGesture isEqualToString:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL] || + response.isCancelled) { + [self _invokeDelegateDidCancel]; + } else if (response.error) { + [self _invokeDelegateDidFailWithError:response.error]; + } else { + [self _invokeDelegateDidCompleteWithResults:results]; + } +} + +- (void)_invokeDelegateDidCancel +{ + NSDictionary * parameters =@{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Cancelled, + }; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + if (!_delegate) { + return; + } + + [_delegate sharerDidCancel:self]; +} + +- (void)_invokeDelegateDidCompleteWithResults:(NSDictionary *)results +{ + NSDictionary * parameters =@{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Completed, + }; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + if (!_delegate) { + return; + } + + [_delegate sharer:self didCompleteWithResults:[results copy]]; +} + +- (void)_invokeDelegateDidFailWithError:(NSError *)error +{ + NSMutableDictionary * parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:FBSDKAppEventsDialogOutcomeValue_Failed, FBSDKAppEventParameterDialogOutcome, nil]; + if (error) { + parameters[FBSDKAppEventParameterDialogErrorMessage] = [NSString stringWithFormat:@"%@", error]; + } + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + if (!_delegate) { + return; + } + + [_delegate sharer:self didFailWithError:error]; +} + +- (void)_logDialogShow +{ + NSString *contentType; + if([self.shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypeOpenGraph; + } else if ([self.shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypeStatus; + } else if ([self.shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypePhoto; + } else if ([self.shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypeVideo; + } else { + contentType = FBSDKAppEventsDialogShareContentTypeUnknown; + } + + NSDictionary *parameters = @{FBSDKAppEventParameterDialogShareContentType : contentType}; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogShow + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h new file mode 100644 index 0000000..347f0e4 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h @@ -0,0 +1,32 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import + +/*! + @abstract A button to send content through Messenger. + @discussion Tapping the receiver will invoke the FBSDKShareDialog with the attached shareContent. If the dialog cannot + be shown, the button will be disable. + */ +@interface FBSDKSendButton : FBSDKButton + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m new file mode 100644 index 0000000..cc0ee18 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m @@ -0,0 +1,97 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKSendButton.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKMessageDialog.h" +#import "FBSDKMessengerIcon.h" + +@interface FBSDKSendButton () +@end + +@implementation FBSDKSendButton +{ + FBSDKMessageDialog *_dialog; +} + +#pragma mark - Properties + +- (id)shareContent +{ + return _dialog.shareContent; +} + +- (void)setShareContent:(id)shareContent +{ + _dialog.shareContent = shareContent; + [self checkImplicitlyDisabled]; +} + +#pragma mark - FBSDKButtonImpressionTracking + +- (NSDictionary *)analyticsParameters +{ + return nil; +} + +- (NSString *)impressionTrackingEventName +{ + return FBSDKAppEventNameFBSDKSendButtonImpression; +} + +- (NSString *)impressionTrackingIdentifier +{ + return @"send"; +} + +#pragma mark - FBSDKButton + +- (void)configureButton +{ + NSString *title = + NSLocalizedStringWithDefaultValue(@"SendButton.Send", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"Send", + @"The label for FBSDKSendButton"); + + UIColor *backgroundColor = [UIColor colorWithRed:0.0 green:132.0/255.0 blue:1.0 alpha:1.0]; + UIColor *highlightedColor = [UIColor colorWithRed:0.0 green:111.0/255.0 blue:1.0 alpha:1.0]; + + [self configureWithIcon:[[FBSDKMessengerIcon alloc] init] + title:title + backgroundColor:backgroundColor + highlightedColor:highlightedColor]; + + [self addTarget:self action:@selector(_share:) forControlEvents:UIControlEventTouchUpInside]; + _dialog = [[FBSDKMessageDialog alloc] init]; +} + +- (BOOL)isImplicitlyDisabled +{ + return ![_dialog canShow] || ![_dialog validateWithError:NULL]; +} + +#pragma mark - Helper Methods + +- (void)_share:(id)sender +{ + [self logTapEventWithEventName:FBSDKAppEventNameFBSDKSendButtonDidTap parameters:[self analyticsParameters]]; + [_dialog show]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h new file mode 100644 index 0000000..ddbeafe --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h @@ -0,0 +1,79 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import + +/*! + @abstract A utility class for sharing through the graph API. Using this class requires an access token in + [FBSDKAccessToken currentAccessToken] that has been granted the "publish_actions" permission. + @discussion FBSDKShareAPI network requests are scheduled on the current run loop in the default run loop mode + (like NSURLConnection). If you want to use FBSDKShareAPI in a background thread, you must manage the run loop + yourself. + */ +@interface FBSDKShareAPI : NSObject + +/*! + @abstract Convenience method to build up a share API with content and a delegate. + @param content The content to be shared. + @param delegate The receiver's delegate. + */ ++ (instancetype)shareWithContent:(id)content delegate:(id)delegate; + +/*! + @abstract The message the person has provided through the custom dialog that will accompany the share content. + */ +@property (nonatomic, copy) NSString *message; + +/*! + @abstract The graph node to which content should be shared. + */ +@property (nonatomic, copy) NSString *graphNode; + +/*! + @abstract A Boolean value that indicates whether the receiver can send the share. + @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is + required but not available. This method does not validate the content on the receiver, so this can be checked before + building up the content. + @see [FBSDKSharing validateWithError:] + @result YES if the receiver can send, otherwise NO. + */ +- (BOOL)canShare; + +/*! + @abstract Creates an User Owned Open Graph object without an action. + @param openGraphObject The open graph object to create. + @discussion Use this method to create an object alone, when an action is not going to be posted with the object. If + the object will be used within an action, just put the object in the action and share that as the shareContent and the + object will be created in the process. The delegate will be messaged with the results. + + Also see https://developers.facebook.com/docs/sharing/opengraph/object-api#objectapi-creatinguser + + @result YES if the receiver was able to send the request to create the object, otherwise NO. + */ +- (BOOL)createOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject; + +/*! + @abstract Begins the send from the receiver. + @result YES if the receiver was able to send the share, otherwise NO. + */ +- (BOOL)share; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m new file mode 100644 index 0000000..69f124f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m @@ -0,0 +1,701 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareAPI.h" + +#import + +#import +#import +#import + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareDefines.h" +#import "FBSDKShareError.h" +#import "FBSDKShareLinkContent.h" +#import "FBSDKShareOpenGraphAction.h" +#import "FBSDKShareOpenGraphContent.h" +#import "FBSDKShareOpenGraphObject.h" +#import "FBSDKSharePhoto.h" +#import "FBSDKSharePhotoContent.h" +#import "FBSDKShareUtility.h" +#import "FBSDKShareVideo.h" +#import "FBSDKShareVideoContent.h" + +static NSString *const FBSDKShareAPIDefaultGraphNode = @"me"; +static NSString *const FBSDKShareAPIPhotosEdge = @"photos"; +static NSString *const FBSDKShareAPIVideosEdge = @"videos"; + +@implementation FBSDKShareAPI + +#pragma mark - Class Methods + ++ (instancetype)shareWithContent:(id)content delegate:(id)delegate +{ + FBSDKShareAPI *API = [[self alloc] init]; + API.shareContent = content; + API.delegate = delegate; + [API share]; + return API; +} + +#pragma mark - Properties + +@synthesize delegate = _delegate; +@synthesize shareContent = _shareContent; +@synthesize shouldFailOnDataError = _shouldFailOnDataError; + +#pragma mark - Object Lifecycle +- (instancetype)init +{ + if ((self = [super init])) { + _graphNode = FBSDKShareAPIDefaultGraphNode; + } + return self; +} + +#pragma mark - Public Methods + +- (BOOL)canShare +{ + return YES; +} + +- (BOOL)createOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject +{ + NSError *error; + if (![self canShare]) { + NSString *message = @"Share API is not available; verify 'canShare' returns YES"; + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode message:message]; + [_delegate sharer:self didFailWithError:error]; + return NO; + } + if (![self _hasPublishActions]) { + NSString *message = @"Warning: [FBSDKAccessToken currentAccessToken] is missing publish_actions permissions"; + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:message]; + } + if (!openGraphObject) { + error = [FBSDKShareError requiredArgumentErrorWithName:@"openGraphObject" message:nil]; + [_delegate sharer:self didFailWithError:error]; + return NO; + } + + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + void(^completionHandler)(id) = ^(NSDictionary *result) { + [_delegate sharer:self didCompleteWithResults:result]; + }; + if (![self _stageOpenGraphObject:openGraphObject + connection:connection + stagingHandler:NULL + completionHandler:completionHandler]) { + return NO; + } + [connection start]; + return YES; +} + +- (BOOL)share +{ + NSError *error; + if (![self canShare]) { + NSString *message = @"Share API is not available; verify 'canShare' returns YES"; + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode message:message]; + [_delegate sharer:self didFailWithError:error]; + return NO; + } + if (![self _hasPublishActions]) { + NSString *message = @"Warning: [FBSDKAccessToken currentAccessToken] is missing publish_actions permissions"; + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:message]; + } + if (![self validateWithError:&error]) { + [_delegate sharer:self didFailWithError:error]; + return NO; + } + id shareContent = self.shareContent; + + if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + return [self _shareLinkContent:(FBSDKShareLinkContent *)shareContent]; + } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + return [self _sharePhotoContent:(FBSDKSharePhotoContent *)shareContent]; + } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + return [self _shareVideoContent:(FBSDKShareVideoContent *)shareContent]; + } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + return [self _shareOpenGraphContent:(FBSDKShareOpenGraphContent *)shareContent]; + } else { + return NO; + } +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + id shareContent = self.shareContent; + if (!shareContent) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" message:nil]; + } + return NO; + } + return [FBSDKShareUtility validateShareContent:shareContent error:errorRef]; +} + +#pragma mark - Helper Methods + +- (NSString *)_graphPathWithSuffix:(NSString *)suffix, ... NS_REQUIRES_NIL_TERMINATION +{ + NSMutableString *graphPath = [[NSMutableString alloc] initWithString:self.graphNode]; + va_list args; + va_start(args, suffix); + for (NSString *arg = suffix; arg != nil; arg = va_arg(args, NSString *)) { + [graphPath appendFormat:@"/%@", arg]; + } + va_end(args); + return graphPath; +} + +- (void)_addCommonParameters:(NSMutableDictionary *)parameters content:(id)content +{ + NSString *tags = [content.peopleIDs componentsJoinedByString:@","]; + [FBSDKInternalUtility dictionary:parameters setObject:tags forKey:@"tags"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.placeID forKey:@"place"]; + [FBSDKInternalUtility dictionary:parameters setObject:content.ref forKey:@"ref"]; +} + +- (BOOL)_hasPublishActions +{ + FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; + return [accessToken.permissions containsObject:@"publish_actions"]; +} + +- (BOOL)_shareLinkContent:(FBSDKShareLinkContent *)linkContent +{ + FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (!_delegate) { + return; + } + if (error) { + [_delegate sharer:self didFailWithError:error]; + } else { + result = [FBSDKTypeUtility dictionaryValue:result]; + NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST + forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:result[@"id"]] + forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; + [_delegate sharer:self didCompleteWithResults:shareResults]; + } + }; + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [self _addCommonParameters:parameters content:linkContent]; + [FBSDKInternalUtility dictionary:parameters setObject:self.message forKey:@"message"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"link"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.imageURL forKey:@"picture"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentTitle forKey:@"name"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentDescription forKey:@"description"]; + + [[[FBSDKGraphRequest alloc] initWithGraphPath:[self _graphPathWithSuffix:@"feed", nil] + parameters:parameters + HTTPMethod:@"POST"] startWithCompletionHandler:completionHandler]; + return YES; +} + +- (BOOL)_shareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent +{ + // In order to create a new Open Graph action using a custom object that does not already exist (objectID or URL), you + // must first send a request to post the object and then another to post the action. If a local image is supplied + // with the object or action, that must be staged first and then referenced by the staging URL that is returned by + // that request. + FBSDKShareOpenGraphAction *action = openGraphContent.action; + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + void(^stagingHandler)(NSDictionary *) = ^(NSDictionary *stagedContainer) { + NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:stagedContainer]; + [self _addCommonParameters:parameters content:openGraphContent]; + [FBSDKInternalUtility dictionary:parameters setObject:self.message forKey:@"message"]; + + FBSDKGraphRequestHandler requestHandler = ^(FBSDKGraphRequestConnection *requestConnection, + id result, + NSError *requestError) { + if (!_delegate) { + return; + } + if (requestError) { + NSError *error = [FBSDKShareError errorWithCode:FBSDKShareOpenGraphErrorCode + message:@"Error sharing Open Graph content" + underlyingError:requestError]; + [_delegate sharer:self didFailWithError:error]; + } else if (result) { + NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST + forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:result[@"id"]] + forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; + [_delegate sharer:self didCompleteWithResults:shareResults]; + } + }; + NSString *graphPath = [self _graphPathWithSuffix:[FBSDKUtility URLEncode:action.actionType], nil]; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:parameters + HTTPMethod:@"POST"]; + [self _connection:connection addRequest:request completionHandler:requestHandler]; + [connection start]; + }; + if (![self _stageOpenGraphValueContainer:action connection:connection stagingHandler:stagingHandler]) { + return NO; + } + return YES; +} + +- (BOOL)_sharePhotoContent:(FBSDKSharePhotoContent *)photoContent +{ + NSArray *photos = photoContent.photos; + NSMutableArray *requests = [[NSMutableArray alloc] init]; + for (FBSDKSharePhoto *photo in photos) { + UIImage *image = photo.image; + if (!image && [photo.imageURL isFileURL]) { + image = [UIImage imageWithContentsOfFile:[photo.imageURL path]]; + } + if (image) { + NSString *graphPath = [self _graphPathWithSuffix:FBSDKShareAPIPhotosEdge, nil]; + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [self _addCommonParameters:parameters content:photoContent]; + NSString *caption = photo.caption ?: self.message; + [FBSDKInternalUtility dictionary:parameters setObject:caption forKey:@"caption"]; + parameters[@"picture"] = image; + [requests addObject:[[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:parameters + HTTPMethod:@"POST"]]; + } + } + NSUInteger requestCount = [requests count]; + NSMutableArray *results = [[NSMutableArray alloc] init]; + NSMutableArray *errors = [[NSMutableArray alloc] init]; + __block NSUInteger completedCount = 0; + FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + result = [FBSDKTypeUtility dictionaryValue:result]; + [FBSDKInternalUtility array:results addObject:result]; + [FBSDKInternalUtility array:errors addObject:error]; + if (++completedCount != requestCount) { + return; + } + if (!_delegate) { + return; + } + if ([errors count]) { + [_delegate sharer:self didFailWithError:errors[0]]; + } else if ([results count]) { + // each photo upload will be merged into the same post, so grab the post_id from the first and use that + NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST + forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + NSDictionary *firstResult = [FBSDKTypeUtility dictionaryValue:results[0]]; + [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:firstResult[@"post_id"]] + forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; + [_delegate sharer:self didCompleteWithResults:shareResults]; + } + }; + for (FBSDKGraphRequest *request in requests) { + [request startWithCompletionHandler:completionHandler]; + } + return YES; +} + +- (BOOL)_shareVideoContent:(FBSDKShareVideoContent *)videoContent +{ + FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (!_delegate) { + return; + } + if (error) { + [_delegate sharer:self didFailWithError:error]; + } else { + result = [FBSDKTypeUtility dictionaryValue:result]; + NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST + forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:result[@"id"]] + forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; + [_delegate sharer:self didCompleteWithResults:shareResults]; + } + }; + NSString *graphPath = [self _graphPathWithSuffix:FBSDKShareAPIVideosEdge, nil]; + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [self _addCommonParameters:parameters content:videoContent]; + [FBSDKInternalUtility dictionary:parameters setObject:self.message forKey:@"description"]; + if ([[FBSDKAccessToken currentAccessToken].permissions containsObject:@"ads_management"]) { + FBSDKSharePhoto *photo = videoContent.previewPhoto; + UIImage *image = photo.image; + if (!image && [photo.imageURL isFileURL]) { + image = [UIImage imageWithContentsOfFile:[photo.imageURL path]]; + } + [FBSDKInternalUtility dictionary:parameters setObject:image forKey:@"thumb"]; + } + FBSDKShareVideo *video = videoContent.video; + NSURL *videoURL = video.videoURL; + void(^postVideoBlock)(NSData *,NSString *) = ^(NSData *videoData, NSString *filename){ + FBSDKGraphRequestDataAttachment *dataAttachment = [[FBSDKGraphRequestDataAttachment alloc] initWithData:videoData + filename:filename + contentType:nil]; + [FBSDKInternalUtility dictionary:parameters setObject:dataAttachment forKey:filename]; + [[[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:parameters + HTTPMethod:@"POST"] startWithCompletionHandler:completionHandler]; + }; + if ([videoURL isFileURL]) { + NSError *fileError; + NSData *videoData = [NSData dataWithContentsOfURL:video.videoURL + options:NSDataReadingMapped + error:&fileError]; + if (!videoData) { + [_delegate sharer:self didFailWithError:fileError]; + return NO; + } + NSString *filename = [[NSString alloc] initWithFormat:@"video.%@", video.videoURL.pathExtension]; + postVideoBlock(videoData, filename); + return YES; + } else if (videoURL) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[[fbsdkdfl_ALAssetsLibraryClass() alloc] init] assetForURL:video.videoURL resultBlock:^(ALAsset *asset) { + ALAssetRepresentation *defaultRepresentation = [asset defaultRepresentation]; + NSUInteger size = (NSUInteger)defaultRepresentation.size; + Byte *buffer = (Byte *)malloc(size); + NSError *error; + NSUInteger bufferedLength = [defaultRepresentation getBytes:buffer fromOffset:0.0 length:size error:&error]; + if (bufferedLength == 0) { + free(buffer); + [_delegate sharer:self didFailWithError:error]; + return; + } + NSData *videoData = [NSData dataWithBytesNoCopy:buffer length:bufferedLength freeWhenDone:YES]; + NSString *filename = [[NSString alloc] initWithFormat:@"video.%@", defaultRepresentation.filename.pathExtension]; +#pragma clang diagnostic pop + postVideoBlock(videoData, filename); + } failureBlock:^(NSError *error) { + [_delegate sharer:self didFailWithError:error]; + }]; + return YES; + } else { + return NO; + } +} + +- (BOOL)_addEncodedParametersToDictionary:(NSMutableDictionary *)parameters + key:(NSString *)key + value:(id)value + error:(NSError **)errorRef +{ + if ([value isKindOfClass:[NSString class]] || + [value isKindOfClass:[NSNumber class]] || + [value isKindOfClass:[NSNull class]]) { + parameters[key] = value; + } else if ([value isKindOfClass:[NSArray class]]) { + __block BOOL didEncode = YES; + [(NSArray *)value enumerateObjectsUsingBlock:^(id subvalue, NSUInteger idx, BOOL *stop) { + NSString *subkey = [[NSString alloc] initWithFormat:@"%@[%lu]", key, (unsigned long)idx]; + if (![self _addEncodedParametersToDictionary:parameters key:subkey value:subvalue error:errorRef]) { + *stop = YES; + didEncode = NO; + } + }]; + if (!didEncode) { + return NO; + } + } else if ([value isKindOfClass:[NSDictionary class]]) { + __block BOOL didEncode = YES; + [(NSDictionary *)value enumerateKeysAndObjectsUsingBlock:^(id subkey, id subvalue, BOOL *stop) { + subkey = [[NSString alloc] initWithFormat:@"%@[%@]", key, subkey]; + if (![self _addEncodedParametersToDictionary:parameters key:subkey value:subvalue error:errorRef]) { + *stop = YES; + didEncode = NO; + } + }]; + if (!didEncode) { + return NO; + } + } else { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:key value:value message:nil]; + } + return NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + +- (BOOL)_stageArray:(NSArray *)array + connection:(FBSDKGraphRequestConnection *)connection + stagingHandler:(void(^)(NSArray *stagedArray))stagingHandler +{ + __block BOOL result = YES; + __block NSUInteger pendingCount = 1; + NSMutableArray *stagedArray = [[NSMutableArray alloc] initWithArray:array]; + void(^itemDidFail)(void) = ^{ + if (!result) { + return; + } + result = NO; + }; + void(^itemDidSucceed)(void) = ^{ + if (!result) { + return; + } + if ((--pendingCount == 0) && (stagingHandler != NULL)) { + stagingHandler(stagedArray); + } + }; + [array enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) { + pendingCount++; + void(^itemHandler)(id) = ^(id stagedValue) { + if (stagedValue) { + stagedArray[idx] = stagedValue; + itemDidSucceed(); + } else { + NSError *error = [FBSDKShareError invalidArgumentErrorWithName:@"value" + value:item + message:@"Error staging object."]; + [_delegate sharer:self didFailWithError:error]; + itemDidFail(); + *stop = YES; + result = NO; + } + }; + if (![self _stageValue:item connection:connection stagingHandler:itemHandler]) { + itemDidFail(); + *stop = YES; + result = NO; + } + }]; + if (result) { + itemDidSucceed(); + } + return result; +} + +- (BOOL)_stageOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject + connection:(FBSDKGraphRequestConnection *)connection + stagingHandler:(void(^)(id stagedObject))stagingHandler + completionHandler:(void(^)(NSDictionary *result))completionHandler +{ + NSString *type = [FBSDKTypeUtility stringValue:openGraphObject[@"og:type"]]; + if (!type) { + NSString *message = @"Open Graph objects must contain a og:type value."; + NSError *error = [FBSDKShareError requiredArgumentErrorWithName:@"og:type" message:message]; + [_delegate sharer:self didFailWithError:error]; + return NO; + } + void(^containerHandler)(NSDictionary *) = ^(NSDictionary *stagedContainer) { + NSError *JSONError; + NSString *objectString = [FBSDKInternalUtility JSONStringForObject:stagedContainer + error:&JSONError + invalidObjectHandler:NULL]; + if (!objectString) { + [_delegate sharer:self didFailWithError:JSONError]; + return; + } + NSString *tokenString = [FBSDKAccessToken currentAccessToken].tokenString; + NSString *graphPath = [self _graphPathWithSuffix:@"objects", type, nil]; + NSDictionary *parameters = @{ @"object": objectString }; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:parameters + tokenString:tokenString + version:nil + HTTPMethod:@"POST"]; + FBSDKGraphRequestHandler requestCompletionHandler = ^(FBSDKGraphRequestConnection *requestConnection, + id result, + NSError *requestError) { + if (!_delegate) { + return; + } + if (requestError) { + NSString *message = [[NSString alloc] initWithFormat:@"Error creating Open Graph object: %@", + requestError.description]; + NSError *error = [FBSDKShareError errorWithCode:FBSDKShareOpenGraphErrorCode + message:message + underlyingError:requestError]; + [_delegate sharer:self didFailWithError:error]; + } else if (completionHandler != NULL) { + completionHandler([FBSDKTypeUtility dictionaryValue:result]); + } + }; + NSString *batchEntryName = [self _connection:connection + addRequest:request + completionHandler:requestCompletionHandler]; + if (stagingHandler != NULL) { + stagingHandler([[NSString alloc] initWithFormat:@"{result=%@:$.id}", batchEntryName]); + } + }; + return [self _stageOpenGraphValueContainer:openGraphObject connection:connection stagingHandler:containerHandler]; + return YES; +} + +- (BOOL)_stageOpenGraphValueContainer:(id)container + connection:(FBSDKGraphRequestConnection *)connection + stagingHandler:(void(^)(NSDictionary *stagedContainer))stagingHandler +{ + __block BOOL result = YES; + __block NSUInteger pendingCount = 1; + NSMutableDictionary *stagedContainer = [[NSMutableDictionary alloc] init]; + void(^itemDidFail)(void) = ^{ + if (!result) { + return; + } + result = NO; + }; + void(^itemDidSucceed)(void) = ^{ + if (!result) { + return; + } + if ((--pendingCount == 0) && (stagingHandler != NULL)) { + stagingHandler(stagedContainer); + } + }; + BOOL isAction = [container isKindOfClass:[FBSDKShareOpenGraphAction class]]; + [container enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { + pendingCount++; + + // The server does not understand custom namespaces remove them until the server is fixed + NSString *namespace; + key = [FBSDKShareUtility getOpenGraphNameAndNamespaceFromFullName:key namespace:&namespace]; + if (namespace && !isAction) { + if (!stagedContainer[namespace]) { + stagedContainer[namespace] = [[NSMutableDictionary alloc] init]; + } + } + + void(^itemHandler)(id) = ^(id stagedValue) { + if (stagedValue) { + if (isAction) { + NSError *error; + if (![self _addEncodedParametersToDictionary:stagedContainer key:key value:stagedValue error:&error]) { + [_delegate sharer:self didFailWithError:error]; + itemDidFail(); + return; + } + } else { + NSMutableDictionary *valueContainer = (namespace ? stagedContainer[namespace] : stagedContainer); + valueContainer[key] = stagedValue; + } + } + itemDidSucceed(); + }; + if (![self _stageValue:object connection:connection stagingHandler:itemHandler]) { + *stop = YES; + result = NO; + } + }]; + if (result) { + itemDidSucceed(); + } + return result; +} + +- (BOOL)_stagePhoto:(FBSDKSharePhoto *)photo + connection:(FBSDKGraphRequestConnection *)connection + stagingHandler:(void(^)(id stagedPhoto))stagingHandler +{ + if (photo.imageURL) { + NSMutableDictionary *stagedPhoto = [[NSMutableDictionary alloc]initWithDictionary: @{ + @"url": photo.imageURL.absoluteString, + @"user_generated": @(photo.userGenerated), + }]; + [FBSDKInternalUtility dictionary:stagedPhoto setObject:photo.caption forKey:@"caption"]; + if (stagingHandler) { + stagingHandler(stagedPhoto); + } + return YES; + } else if (photo.image) { + NSString *graphPath = @"/me/staging_resources"; + NSDictionary *parameters = @{ @"file": photo.image }; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath + parameters:parameters + HTTPMethod:@"POST"]; + FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *requestConnection, + id result, + NSError *requestError) { + NSString *stagedPhotoURLString = [FBSDKTypeUtility stringValue:result[@"uri"]]; + if (requestError || !stagedPhotoURLString) { + NSError *error = [FBSDKShareError errorWithCode:FBSDKShareOpenGraphErrorCode + message:@"Error staging photo" + underlyingError:requestError]; + [_delegate sharer:self didFailWithError:error]; + } else if (stagingHandler) { + NSMutableDictionary *stagedPhoto = [[NSMutableDictionary alloc] initWithDictionary: @{ + @"url": stagedPhotoURLString, + @"user_generated": @(photo.userGenerated), + }]; + [FBSDKInternalUtility dictionary:stagedPhoto setObject:photo.caption forKey:@"caption"]; + stagingHandler(stagedPhoto); + } + }; + [request startWithCompletionHandler:completionHandler]; + return YES; + } else { + NSError *error = [FBSDKShareError invalidArgumentErrorWithName:@"photo" + value:photo + message:@"Photos must have an imageURL or image."]; + [_delegate sharer:self didFailWithError:error]; + return NO; + } +} + +- (BOOL)_stageValue:(id)value + connection:(FBSDKGraphRequestConnection *)connection + stagingHandler:(void(^)(id stagedValue))stagingHandler +{ + if ([value isKindOfClass:[NSString class]] || + [value isKindOfClass:[NSNumber class]]) { + if (stagingHandler != NULL) { + stagingHandler(value); + } + return YES; + } else if ([value isKindOfClass:[NSURL class]]) { + if (stagingHandler != NULL) { + stagingHandler([(NSURL *)value absoluteString]); + } + return YES; + } else if ([value isKindOfClass:[FBSDKSharePhoto class]]) { + return [self _stagePhoto:(FBSDKSharePhoto *)value connection:connection stagingHandler:stagingHandler]; + } else if ([value isKindOfClass:[FBSDKShareOpenGraphObject class]]) { + return [self _stageOpenGraphObject:(FBSDKShareOpenGraphObject *)value + connection:connection + stagingHandler:stagingHandler + completionHandler:NULL]; + } else if ([value isKindOfClass:[NSArray class]]) { + return [self _stageArray:(NSArray *)value connection:connection stagingHandler:stagingHandler]; + } else { + NSError *error = [FBSDKShareError invalidArgumentErrorWithName:@"value" + value:value + message:@"Invalid value type found in Open Graph object."]; + [_delegate sharer:self didFailWithError:error]; + return NO; + } +} + +- (NSString *)_connection:(FBSDKGraphRequestConnection *)connection + addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)completionHandler +{ + NSUInteger requestCount = [connection.requests count]; + NSString *batchEntryName = [[NSString alloc] initWithFormat:@"request_%lu", (unsigned long)requestCount]; + [connection addRequest:request completionHandler:completionHandler batchEntryName:batchEntryName]; + return batchEntryName; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h new file mode 100644 index 0000000..d6b46fd --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h @@ -0,0 +1,32 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import + +/*! + @abstract A button to share content. + @discussion Tapping the receiver will invoke the FBSDKShareDialog with the attached shareContent. If the dialog cannot + be shown, the button will be disabled. + */ +@interface FBSDKShareButton : FBSDKButton + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m new file mode 100644 index 0000000..17ecf71 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m @@ -0,0 +1,90 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareButton.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareDialog.h" + +@implementation FBSDKShareButton +{ + FBSDKShareDialog *_dialog; +} + +#pragma mark - Properties + +- (id)shareContent +{ + return _dialog.shareContent; +} + +- (void)setShareContent:(id)shareContent +{ + _dialog.shareContent = shareContent; + [self checkImplicitlyDisabled]; +} + +#pragma mark - FBSDKButtonImpressionTracking + +- (NSDictionary *)analyticsParameters +{ + return nil; +} + +- (NSString *)impressionTrackingEventName +{ + return FBSDKAppEventNameFBSDKShareButtonImpression; +} + +- (NSString *)impressionTrackingIdentifier +{ + return @"share"; +} + +#pragma mark - FBSDKButton + +- (void)configureButton +{ + NSString *title = + NSLocalizedStringWithDefaultValue(@"ShareButton.Share", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], + @"Share", + @"The label for FBSDKShareButton"); + + [self configureWithIcon:nil + title:title + backgroundColor:nil + highlightedColor:nil]; + + [self addTarget:self action:@selector(_share:) forControlEvents:UIControlEventTouchUpInside]; + _dialog = [[FBSDKShareDialog alloc] init]; +} + +- (BOOL)isImplicitlyDisabled +{ + return ![_dialog canShow] || ![_dialog validateWithError:NULL]; +} + +#pragma mark - Helper Methods + +- (void)_share:(id)sender +{ + [self logTapEventWithEventName:FBSDKAppEventNameFBSDKShareButtonDidTap parameters:[self analyticsParameters]]; + [_dialog show]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h new file mode 100644 index 0000000..4f2af4f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h @@ -0,0 +1,50 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract The error domain for all errors from FBSDKShareKit. + @discussion Error codes from the SDK in the range 200-299 are reserved for this domain. + */ +FBSDK_EXTERN NSString *const FBSDKShareErrorDomain; + +/*! + @typedef NS_ENUM(NSInteger, FBSDKShareErrorCode) + @abstract Error codes for FBSDKShareErrorDomain. + */ +typedef NS_ENUM(NSInteger, FBSDKShareErrorCode) +{ + /*! + @abstract Reserved. + */ + FBSDKShareReservedErrorCode = 200, + + /*! + @abstract The error code for errors from uploading open graph objects. + */ + FBSDKShareOpenGraphErrorCode, + + /*! + @abstract The error code for when a sharing dialog is not available. + @discussion Use the canShare methods to check for this case before calling show. + */ + FBSDKShareDialogNotAvailableErrorCode, +}; diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m new file mode 100644 index 0000000..8de78c7 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m @@ -0,0 +1,24 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareConstants.h" + +NSString *const FBSDKShareErrorDomain = @"com.facebook.sdk.share"; + +NSString *const FBSDKShareOpenGraphKeyErrorKey = @"key"; +NSString *const FBSDKShareOpenGraphValueErrorKey = @"value"; diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h new file mode 100644 index 0000000..29489a6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h @@ -0,0 +1,52 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import + +/*! + @abstract A dialog for sharing content on Facebook. + */ +@interface FBSDKShareDialog : NSObject + +/*! + @abstract Convenience method to show an FBSDKShareDialog with a fromViewController, content and a delegate. + @param viewController A UIViewController to present the dialog from, if appropriate. + @param content The content to be shared. + @param delegate The receiver's delegate. + */ ++ (instancetype)showFromViewController:(UIViewController *)viewController + withContent:(id)content + delegate:(id)delegate; + +/*! + @abstract A UIViewController to present the dialog from. + @discussion If not specified, the top most view controller will be automatically determined as best as possible. + */ +@property (nonatomic, weak) UIViewController *fromViewController; + +/*! + @abstract The mode with which to display the dialog. + @discussion Defaults to FBSDKShareDialogModeAutomatic, which will automatically choose the best available mode. + */ +@property (nonatomic, assign) FBSDKShareDialogMode mode; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m new file mode 100644 index 0000000..dca5b20 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m @@ -0,0 +1,781 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareDialog.h" + +#import + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareDefines.h" +#import "FBSDKShareError.h" +#import "FBSDKShareLinkContent.h" +#import "FBSDKShareOpenGraphAction.h" +#import "FBSDKShareOpenGraphContent.h" +#import "FBSDKShareOpenGraphObject.h" +#import "FBSDKSharePhoto.h" +#import "FBSDKSharePhotoContent.h" +#import "FBSDKShareUtility.h" +#import "FBSDKShareVideo.h" +#import "FBSDKShareVideoContent.h" + +#define FBSDK_SHARE_DIALOG_APP_SCHEME @"fbapi" +#define FBSDK_SHARE_EXTENSION_APP_SCHEME @"fbshareextension" +#define FBSDK_SHARE_FEED_METHOD_NAME @"feed" +#define FBSDK_SHARE_METHOD_MIN_VERSION @"20130410" +#define FBSDK_SHARE_METHOD_OG_MIN_VERSION @"20130214" +#define FBSDK_SHARE_METHOD_OG_IMAGE_MIN_VERSION @"20130410" +#define FBSDK_SHARE_METHOD_PHOTOS_MIN_VERSION @"20140116" +#define FBSDK_SHARE_METHOD_VIDEO_MIN_VERSION @"20150313" +#define FBSDK_SHARE_METHOD_ATTRIBUTED_SHARE_SHEET_MIN_VERSION @"20150629" + +@interface FBSDKShareDialog () +@end + +@implementation FBSDKShareDialog +{ + FBSDKWebDialog *_webDialog; +} + +#pragma mark - Class Methods + ++ (void)initialize +{ + if ([FBSDKShareDialog class] == self) { + [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; + } +} + ++ (instancetype)showFromViewController:(UIViewController *)viewController + withContent:(id)content + delegate:(id)delegate +{ + FBSDKShareDialog *dialog = [[self alloc] init]; + dialog.fromViewController = viewController; + dialog.shareContent = content; + dialog.delegate = delegate; + [dialog show]; + return dialog; +} + +#pragma mark - Object Lifecycle + +- (void)dealloc +{ + _webDialog.delegate = nil; +} + +#pragma mark - Properties + +@synthesize delegate = _delegate; +@synthesize shareContent = _shareContent; +@synthesize shouldFailOnDataError = _shouldFailOnDataError; + +#pragma mark - Public Methods + +- (BOOL)canShow +{ + switch (self.mode) { + case FBSDKShareDialogModeAutomatic: + case FBSDKShareDialogModeBrowser: + case FBSDKShareDialogModeFeedBrowser: + case FBSDKShareDialogModeFeedWeb: + case FBSDKShareDialogModeWeb:{ + return YES; + } + case FBSDKShareDialogModeNative:{ + return [self _canShowNative]; + } + case FBSDKShareDialogModeShareSheet:{ + return [self _canShowShareSheet]; + } + } +} + +- (BOOL)show +{ + BOOL didShow = NO; + NSError *error = nil; + + if ([self validateWithError:&error]) { + switch (self.mode) { + case FBSDKShareDialogModeAutomatic:{ + didShow = [self _showAutomatic:&error]; + break; + } + case FBSDKShareDialogModeBrowser:{ + didShow = [self _showBrowser:&error]; + break; + } + case FBSDKShareDialogModeFeedBrowser:{ + didShow = [self _showFeedBrowser:&error]; + break; + } + case FBSDKShareDialogModeFeedWeb:{ + didShow = [self _showFeedWeb:&error]; + break; + } + case FBSDKShareDialogModeNative:{ + didShow = [self _showNativeWithCanShowError:&error validationError:&error]; + break; + } + case FBSDKShareDialogModeShareSheet:{ + didShow = [self _showShareSheetWithCanShowError:&error validationError:&error]; + break; + } + case FBSDKShareDialogModeWeb:{ + didShow = [self _showWeb:&error]; + break; + } + } + } + if (!didShow) { + [self _invokeDelegateDidFailWithError:error]; + } else { + [self _logDialogShow]; + [FBSDKInternalUtility registerTransientObject:self]; + } + return didShow; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + if (errorRef != NULL) { + *errorRef = nil; + } + id shareContent = self.shareContent; + if (!shareContent) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" message:nil]; + } + return NO; + } + if (![FBSDKShareUtility validateShareContent:shareContent error:errorRef]) { + return NO; + } + switch (self.mode) { + case FBSDKShareDialogModeAutomatic:{ + return ( + ([self _canShowNative] && [self _validateShareContentForNative:errorRef]) || + ([self _canShowShareSheet] && [self _validateShareContentForShareSheet:errorRef]) || + [self _validateShareContentForFeed:errorRef] || + [self _validateShareContentForBrowser:errorRef]); + } + case FBSDKShareDialogModeNative:{ + return [self _validateShareContentForNative:errorRef]; + } + case FBSDKShareDialogModeShareSheet:{ + return [self _validateShareContentForShareSheet:errorRef]; + } + case FBSDKShareDialogModeBrowser: + case FBSDKShareDialogModeWeb:{ + return [self _validateShareContentForBrowser:errorRef]; + } + case FBSDKShareDialogModeFeedBrowser: + case FBSDKShareDialogModeFeedWeb:{ + return [self _validateShareContentForFeed:errorRef]; + } + } +} + +#pragma mark - FBSDKWebDialogDelegate + +- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results +{ + if (_webDialog != webDialog) { + return; + } + [self _cleanUpWebDialog]; + NSInteger errorCode = [results[@"error_code"] integerValue]; + if (errorCode == 4201) { + [self _invokeDelegateDidCancel]; + } else { + // not all web dialogs report cancellation, so assume that the share has completed with no additional information + [self _handleWebResponseParameters:results error:nil]; + } + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error +{ + if (_webDialog != webDialog) { + return; + } + [self _cleanUpWebDialog]; + [self _invokeDelegateDidFailWithError:error]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog +{ + if (_webDialog != webDialog) { + return; + } + [self _cleanUpWebDialog]; + [self _invokeDelegateDidCancel]; + [FBSDKInternalUtility unregisterTransientObject:self]; +} + +#pragma mark - Helper Methods + +-(BOOL)_isDefaultToShareSheet +{ + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + return [configuration.defaultShareMode isEqualToString:@"share_sheet"]; +} + +-(BOOL)_showAutomatic:(NSError *__autoreleasing *)errorRef +{ + BOOL isDefaultToShareSheet = [self _isDefaultToShareSheet]; + BOOL useNativeDialog = [self _useNativeDialog]; + return ((isDefaultToShareSheet && [self _showShareSheetWithCanShowError:NULL validationError:errorRef]) || + (useNativeDialog && [self _showNativeWithCanShowError:NULL validationError:errorRef]) || + (!isDefaultToShareSheet && [self _showShareSheetWithCanShowError:NULL validationError:errorRef]) || + [self _showFeedBrowser:errorRef] || + [self _showFeedWeb:errorRef] || + [self _showBrowser:errorRef] || + [self _showWeb:errorRef] || + (!useNativeDialog && [self _showNativeWithCanShowError:NULL validationError:errorRef])); +} + +- (void)_loadNativeMethodName:(NSString **)methodNameRef methodVersion:(NSString **)methodVersionRef +{ + if (methodNameRef != NULL) { + *methodNameRef = nil; + } + if (methodVersionRef != NULL) { + *methodVersionRef = nil; + } + + id shareContent = self.shareContent; + if (!shareContent) { + return; + } + + // if there is shareContent on the receiver already, we can check the minimum app version, otherwise we can only check + // for an app that can handle the native share dialog + NSString *methodName = nil; + NSString *methodVersion = nil; + if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + methodName = FBSDK_SHARE_OPEN_GRAPH_METHOD_NAME; + BOOL containsMedia = NO; + [FBSDKShareUtility testShareContent:shareContent containsMedia:&containsMedia containsPhotos:NULL]; + if (containsMedia) { + methodVersion = FBSDK_SHARE_METHOD_OG_IMAGE_MIN_VERSION; + } else { + methodVersion = FBSDK_SHARE_METHOD_OG_MIN_VERSION; + } + } else { + methodName = FBSDK_SHARE_METHOD_NAME; + if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + methodVersion = FBSDK_SHARE_METHOD_PHOTOS_MIN_VERSION; + } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + methodVersion = FBSDK_SHARE_METHOD_VIDEO_MIN_VERSION; + } else { + methodVersion = FBSDK_SHARE_METHOD_MIN_VERSION; + } + } + if (methodNameRef != NULL) { + *methodNameRef = methodName; + } + if (methodVersionRef != NULL) { + *methodVersionRef = methodVersion; + } +} + +- (BOOL)_canShowNative +{ + return [FBSDKInternalUtility isFacebookAppInstalled]; +} + +- (BOOL)_canShowShareSheet +{ + Class composeViewControllerClass = [fbsdkdfl_SLComposeViewControllerClass() class]; + if (!composeViewControllerClass) { + return NO; + } + NSString *facebookServiceType = fbsdkdfl_SLServiceTypeFacebook(); + if (![composeViewControllerClass isAvailableForServiceType:facebookServiceType]) { + return NO; + } + return YES; +} + +- (BOOL)_canAttributeThroughShareSheet +{ + NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; + if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { + return NO; + } + NSString *scheme = FBSDK_SHARE_DIALOG_APP_SCHEME; + NSString *minimumVersion = FBSDK_SHARE_METHOD_ATTRIBUTED_SHARE_SHEET_MIN_VERSION; + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = [scheme stringByAppendingString:minimumVersion]; + components.path = @"/"; + return ([[UIApplication sharedApplication] canOpenURL:components.URL] || + [self _canUseFBShareSheet]); +} + +- (BOOL)_canUseFBShareSheet +{ + NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; + if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { + return NO; + } + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = FBSDK_SHARE_EXTENSION_APP_SCHEME; + components.path = @"/"; + return [[UIApplication sharedApplication] canOpenURL:components.URL]; +} + +- (void)_cleanUpWebDialog +{ + _webDialog.delegate = nil; + _webDialog = nil; +} + +- (NSArray *)_contentImages +{ + id shareContent = self.shareContent; + return ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]] ? + [((FBSDKSharePhotoContent *)shareContent).photos valueForKeyPath:@"@distinctUnionOfObjects.image"] : + nil); +} + +- (NSArray *)_contentURLs +{ + NSArray *URLs = nil; + id shareContent = self.shareContent; + if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + FBSDKShareLinkContent *linkContent = (FBSDKShareLinkContent *)shareContent; + URLs = (linkContent.contentURL ? @[linkContent.contentURL] : nil); + } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + FBSDKSharePhotoContent *photoContent = (FBSDKSharePhotoContent *)shareContent; + URLs = (photoContent.contentURL ? @[photoContent.contentURL] : nil); + } + return URLs; +} + +- (void)_handleWebResponseParameters:(NSDictionary *)webResponseParameters error:(NSError *)error +{ + if (error) { + [self _invokeDelegateDidFailWithError:error]; + return; + } else { + NSString *completionGesture = webResponseParameters[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + if ([completionGesture isEqualToString:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL]) { + [self _invokeDelegateDidCancel]; + } else { + // not all web dialogs report cancellation, so assume that the share has completed with no additional information + NSMutableDictionary *results = [[NSMutableDictionary alloc] init]; + // the web response comes back with a different payload, so we need to translate it + [FBSDKInternalUtility dictionary:results + setObject:webResponseParameters[FBSDK_SHARE_WEB_PARAM_POST_ID_KEY] + forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; + [self _invokeDelegateDidCompleteWithResults:results]; + } + } +} + +- (BOOL)_showBrowser:(NSError **)errorRef +{ + if (![self _validateShareContentForBrowser:errorRef]) { + return NO; + } + id shareContent = self.shareContent; + NSString *methodName; + NSDictionary *parameters; + if (![FBSDKShareUtility buildWebShareContent:shareContent + methodName:&methodName + parameters:¶meters + error:errorRef]) { + return NO; + } + FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { + [self _handleWebResponseParameters:response.responseParameters error:response.error]; + [FBSDKInternalUtility unregisterTransientObject:self]; + }; + FBSDKBridgeAPIRequest *request; + request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb + scheme:FBSDK_SHARE_WEB_SCHEME + methodName:methodName + methodVersion:nil + parameters:parameters + userInfo:nil]; + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request + useSafariViewController:[self _useSafariViewController] + fromViewController:self.fromViewController + completionBlock:completionBlock]; + return YES; +} + +- (BOOL)_showFeedBrowser:(NSError **)errorRef +{ + if (![self _validateShareContentForFeed:errorRef]) { + return NO; + } + id shareContent = self.shareContent; + NSDictionary *parameters = [FBSDKShareUtility feedShareDictionaryForContent:shareContent]; + FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { + [self _handleWebResponseParameters:response.responseParameters error:response.error]; + [FBSDKInternalUtility unregisterTransientObject:self]; + }; + FBSDKBridgeAPIRequest *request; + request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb + scheme:FBSDK_SHARE_WEB_SCHEME + methodName:FBSDK_SHARE_FEED_METHOD_NAME + methodVersion:nil + parameters:parameters + userInfo:nil]; + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request + useSafariViewController:[self _useSafariViewController] + fromViewController:self.fromViewController + completionBlock:completionBlock]; + return YES; +} + +- (BOOL)_showFeedWeb:(NSError **)errorRef +{ + if (![self _validateShareContentForFeed:errorRef]) { + return NO; + } + id shareContent = self.shareContent; + NSDictionary *parameters = [FBSDKShareUtility feedShareDictionaryForContent:shareContent]; + _webDialog = [FBSDKWebDialog showWithName:FBSDK_SHARE_FEED_METHOD_NAME + parameters:parameters + delegate:self]; + return YES; +} + +- (BOOL)_showNativeWithCanShowError:(NSError **)canShowErrorRef validationError:(NSError **)validationErrorRef +{ + if (![self _canShowNative]) { + if (canShowErrorRef != NULL) { + *canShowErrorRef = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"Native share dialog is not available."]; + } + return NO; + } + if (![self _validateShareContentForNative:validationErrorRef]) { + return NO; + } + + NSString *methodName; + NSString *methodVersion; + [self _loadNativeMethodName:&methodName methodVersion:&methodVersion]; + NSDictionary *parameters = [FBSDKShareUtility parametersForShareContent:self.shareContent + shouldFailOnDataError:self.shouldFailOnDataError]; + FBSDKBridgeAPIRequest *request; + request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative + scheme:FBSDK_CANOPENURL_FACEBOOK + methodName:methodName + methodVersion:methodVersion + parameters:parameters + userInfo:nil]; + FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { + if (response.error.code == FBSDKAppVersionUnsupportedErrorCode) { + NSError *fallbackError; + if ([self _showShareSheetWithCanShowError:NULL validationError:&fallbackError] || + [self _showFeedBrowser:&fallbackError]) { + return; + } + } + NSDictionary *responseParameters = response.responseParameters; + NSString *completionGesture = responseParameters[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + if ([completionGesture isEqualToString:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL] || + response.isCancelled) { + [self _invokeDelegateDidCancel]; + } else if (response.error) { + [self _invokeDelegateDidFailWithError:response.error]; + } else { + NSMutableDictionary *results = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:results + setObject:responseParameters[FBSDK_SHARE_RESULT_POST_ID_KEY] + forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; + [self _invokeDelegateDidCompleteWithResults:results]; + } + [FBSDKInternalUtility unregisterTransientObject:self]; + }; + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request + useSafariViewController:[self _useSafariViewController] + fromViewController:self.fromViewController + completionBlock:completionBlock]; + return YES; +} + +- (BOOL)_showShareSheetWithCanShowError:(NSError **)canShowErrorRef validationError:(NSError **)validationErrorRef +{ + if (![self _canShowShareSheet]) { + if (canShowErrorRef != NULL) { + *canShowErrorRef = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"Share sheet is not available."]; + } + return NO; + } + if (![self _validateShareContentForShareSheet:validationErrorRef]) { + return NO; + } + UIViewController *fromViewController = self.fromViewController; + if (!fromViewController) { + if (validationErrorRef != NULL) { + *validationErrorRef = [FBSDKShareError requiredArgumentErrorWithName:@"fromViewController" message:nil]; + } + return NO; + } + NSArray *images = [self _contentImages]; + NSArray *URLs = [self _contentURLs]; + NSURL *videoURL = ([self.shareContent isKindOfClass:[FBSDKShareVideoContent class]] ? + ((FBSDKShareVideoContent *)self.shareContent).video.videoURL : + nil); + + Class composeViewControllerClass = [fbsdkdfl_SLComposeViewControllerClass() class]; + NSString *facebookServiceType = fbsdkdfl_SLServiceTypeFacebook(); + SLComposeViewController *composeViewController; + composeViewController = [composeViewControllerClass composeViewControllerForServiceType:facebookServiceType]; + + if (!composeViewController) { + if (canShowErrorRef != NULL) { + *canShowErrorRef = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"Error creating SLComposeViewController."]; + } + return NO; + } + if ([self _canAttributeThroughShareSheet]) { + NSString *attributionToken = [NSString stringWithFormat:@"fb-app-id:%@", [FBSDKSettings appID]]; + [composeViewController setInitialText:attributionToken]; + } + for (UIImage *image in images) { + [composeViewController addImage:image]; + } + for (NSURL *URL in URLs) { + [composeViewController addURL:URL]; + } + if (videoURL) { + [composeViewController addURL:videoURL]; + } + composeViewController.completionHandler = ^(SLComposeViewControllerResult result) { + switch (result) { + case SLComposeViewControllerResultCancelled:{ + [self _invokeDelegateDidCancel]; + break; + } + case SLComposeViewControllerResultDone:{ + [self _invokeDelegateDidCompleteWithResults:@{}]; + break; + } + } + [FBSDKInternalUtility unregisterTransientObject:self]; + }; + [fromViewController presentViewController:composeViewController animated:YES completion:nil]; + return YES; +} + +- (BOOL)_showWeb:(NSError **)errorRef +{ + if (![self _validateShareContentForBrowser:errorRef]) { + return NO; + } + id shareContent = self.shareContent; + NSString *methodName; + NSDictionary *parameters; + if (![FBSDKShareUtility buildWebShareContent:shareContent + methodName:&methodName + parameters:¶meters + error:errorRef]) { + return NO; + } + _webDialog = [FBSDKWebDialog showWithName:methodName + parameters:parameters + delegate:self]; + return YES; +} + +- (BOOL)_useNativeDialog +{ + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + return [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameShare]; +} + +- (BOOL)_useSafariViewController +{ + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + return [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameShare]; +} + +- (BOOL)_validateShareContentForBrowser:(NSError **)errorRef +{ + id shareContent = self.shareContent; + BOOL containsMedia; + BOOL containsPhotos; + [FBSDKShareUtility testShareContent:shareContent containsMedia:&containsMedia containsPhotos:&containsPhotos]; + if (containsPhotos) { + if ((errorRef != NULL) && !*errorRef) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" + value:shareContent + message:@"Web share dialogs cannot include photos."]; + } + return NO; + } + if (containsMedia) { + if ((errorRef != NULL) && !*errorRef) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" + value:shareContent + message:@"Web share dialogs cannot include local media."]; + } + return NO; + } + return YES; +} + +- (BOOL)_validateShareContentForFeed:(NSError **)errorRef +{ + id shareContent = self.shareContent; + if (![shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + if ((errorRef != NULL) && !*errorRef) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" + value:shareContent + message:@"Feed share dialogs support FBSDKShareLinkContent."]; + } + return NO; + } + return YES; +} + +- (BOOL)_validateShareContentForNative:(NSError **)errorRef +{ + id shareContent = self.shareContent; + if (![shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + return YES; + } + return [self _validateVideoURL:((FBSDKShareVideoContent *)shareContent).video.videoURL error:errorRef]; +} + +- (BOOL)_validateShareContentForShareSheet:(NSError **)errorRef +{ + id shareContent = self.shareContent; + if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + if ([self _contentImages] != 0) { + return YES; + } else { + if ((errorRef != NULL) && !*errorRef) { + NSString *message = @"Share photo content must have UIImage photos in order to share with the share sheet"; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:message]; + } + return NO; + } + } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + return ([self _canUseFBShareSheet] && + [self _validateVideoURL:((FBSDKShareVideoContent *)shareContent).video.videoURL error:errorRef]); + } else if (![shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + if ((errorRef != NULL) && !*errorRef) { + NSString *message = @"Share content must be FBSDKShareLinkContent or FBSDKSharePhotoContent in order to share " + @"with the share sheet."; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:message]; + } + return NO; + } + return YES; +} + +- (BOOL)_validateVideoURL:(NSURL *)videoURL error:(NSError **)errorRef +{ + if (videoURL.isFileURL) { + if ((errorRef != NULL) && !*errorRef) { + NSString *message = @"Only asset file URLs are allowed for videos."; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"videoURL" value:videoURL message:message]; + } + return NO; + } + return YES; +} + +- (void)_invokeDelegateDidCancel +{ + NSDictionary * parameters = @{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Cancelled, + }; + + [FBSDKAppEvents logImplicitEvent:FBSDLAppEventNameFBSDKEventShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + [_delegate sharerDidCancel:self]; +} + +- (void)_invokeDelegateDidCompleteWithResults:(NSDictionary *)results +{ + NSDictionary * parameters = @{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Completed + }; + + [FBSDKAppEvents logImplicitEvent:FBSDLAppEventNameFBSDKEventShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + [_delegate sharer:self didCompleteWithResults:[results copy]]; +} + +- (void)_invokeDelegateDidFailWithError:(NSError *)error +{ + NSDictionary * parameters = @{ + FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Failed, + FBSDKAppEventParameterDialogErrorMessage : [NSString stringWithFormat:@"%@", error] + }; + + [FBSDKAppEvents logImplicitEvent:FBSDLAppEventNameFBSDKEventShareDialogResult + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; + + [_delegate sharer:self didFailWithError:error]; +} + +- (void)_logDialogShow +{ + NSString *shareMode = NSStringFromFBSDKShareDialogMode(self.mode); + + NSString *contentType; + if([self.shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypeOpenGraph; + } else if ([self.shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypeStatus; + } else if ([self.shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypePhoto; + } else if ([self.shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + contentType = FBSDKAppEventsDialogShareContentTypeVideo; + } else { + contentType = FBSDKAppEventsDialogShareContentTypeUnknown; + } + + + NSDictionary *parameters = @{ + FBSDKAppEventParameterDialogMode : shareMode, + FBSDKAppEventParameterDialogShareContentType : contentType, + + }; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventShareDialogShow + valueToSum:nil + parameters:parameters + accessToken:[FBSDKAccessToken currentAccessToken]]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h new file mode 100644 index 0000000..bdea19e --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h @@ -0,0 +1,64 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKShareDialogMode) + @abstract Modes for the FBSDKShareDialog. + @discussion The automatic mode will progressively check the availability of different modes and open the most + appropriate mode for the dialog that is available. + */ +typedef NS_ENUM(NSUInteger, FBSDKShareDialogMode) +{ + /*! + @abstract Acts with the most appropriate mode that is available. + */ + FBSDKShareDialogModeAutomatic = 0, + /*! + @Displays the dialog in the main native Facebook app. + */ + FBSDKShareDialogModeNative, + /*! + @Displays the dialog in the iOS integrated share sheet. + */ + FBSDKShareDialogModeShareSheet, + /*! + @Displays the dialog in Safari. + */ + FBSDKShareDialogModeBrowser, + /*! + @Displays the dialog in a UIWebView within the app. + */ + FBSDKShareDialogModeWeb, + /*! + @Displays the feed dialog in Safari. + */ + FBSDKShareDialogModeFeedBrowser, + /*! + @Displays the feed dialog in a UIWebView within the app. + */ + FBSDKShareDialogModeFeedWeb, +}; + +/*! + @abstract Converts an FBLikeControlObjectType to an NSString. + */ +FBSDK_EXTERN NSString *NSStringFromFBSDKShareDialogMode(FBSDKShareDialogMode dialogMode); diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m new file mode 100644 index 0000000..7791adb --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m @@ -0,0 +1,51 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareDialogMode.h" + +#import "FBSDKCoreKit+Internal.h" + +NSString *NSStringFromFBSDKShareDialogMode(FBSDKShareDialogMode dialogMode) +{ + switch (dialogMode) { + case FBSDKShareDialogModeAutomatic:{ + return FBSDKAppEventsDialogShareModeAutomatic; + } + case FBSDKShareDialogModeBrowser:{ + return FBSDKAppEventsDialogShareModeBrowser; + } + case FBSDKShareDialogModeNative:{ + return FBSDKAppEventsDialogShareModeNative; + } + case FBSDKShareDialogModeShareSheet:{ + return FBSDKAppEventsDialogShareModeShareSheet; + } + case FBSDKShareDialogModeWeb:{ + return FBSDKAppEventsDialogShareModeWeb; + } + case FBSDKShareDialogModeFeedBrowser: { + return FBSDKAppEventsDialogShareModeFeedBrowser; + } + case FBSDKShareDialogModeFeedWeb:{ + return FBSDKAppEventsDialogShareModeFeedWeb; + } + default:{ + return FBSDKAppEventsDialogShareModeUnknown; + } + } +} diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h new file mode 100644 index 0000000..c2406c8 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h @@ -0,0 +1,47 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h new file mode 100644 index 0000000..9995df6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h @@ -0,0 +1,56 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A model for status and link content to be shared. + */ +@interface FBSDKShareLinkContent : NSObject + +/*! + @abstract The description of the link. + @discussion If not specified, this field is automatically populated by information scraped from the contentURL, + typically the title of the page. This value may be discarded for specially handled links (ex: iTunes URLs). + @return The description of the link + */ +@property (nonatomic, copy) NSString *contentDescription; + +/*! + @abstract The title to display for this link. + @discussion This value may be discarded for specially handled links (ex: iTunes URLs). + @return The link title + */ +@property (nonatomic, copy) NSString *contentTitle; + +/*! + @abstract The URL of a picture to attach to this content. + @return The network URL of an image + */ +@property (nonatomic, copy) NSURL *imageURL; + +/*! + @abstract Compares the receiver to another link content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToShareLinkContent:(FBSDKShareLinkContent *)content; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m new file mode 100644 index 0000000..cc49ed6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m @@ -0,0 +1,150 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareLinkContent+Internal.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_SHARE_STATUS_CONTENT_CONTENT_DESCRIPTION_KEY @"contentDescription" +#define FBSDK_SHARE_STATUS_CONTENT_CONTENT_TITLE_KEY @"contentTitle" +#define FBSDK_SHARE_STATUS_CONTENT_CONTENT_URL_KEY @"contentURL" +#define FBSDK_SHARE_STATUS_CONTENT_IMAGE_URL_KEY @"imageURL" +#define FBSDK_SHARE_STATUS_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" +#define FBSDK_SHARE_STATUS_CONTENT_PLACE_ID_KEY @"placeID" +#define FBSDK_SHARE_STATUS_CONTENT_REF_KEY @"ref" +#define FBSDK_SHARE_STATUS_CONTENT_FEED_PARAMETERS_KEY @"feedParameters" + +@implementation FBSDKShareLinkContent + +#pragma mark - Properties + +@synthesize contentURL = _contentURL; +@synthesize peopleIDs = _peopleIDs; +@synthesize placeID = _placeID; +@synthesize ref = _ref; +@synthesize feedParameters = _feedParameters; + +- (void)setPeopleIDs:(NSArray *)peopleIDs +{ + [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; + if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { + _peopleIDs = [peopleIDs copy]; + } +} + +- (void)setFeedParameters:(NSDictionary *)feedParameters +{ + if (![_feedParameters isEqualToDictionary:feedParameters]) { + _feedParameters = [feedParameters copy]; + } +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_contentDescription hash], + [_contentURL hash], + [_imageURL hash], + [_peopleIDs hash], + [_placeID hash], + [_ref hash], + [_contentTitle hash], + [_feedParameters hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareLinkContent class]]) { + return NO; + } + return [self isEqualToShareLinkContent:(FBSDKShareLinkContent *)object]; +} + +- (BOOL)isEqualToShareLinkContent:(FBSDKShareLinkContent *)content +{ + return (content && + [FBSDKInternalUtility object:_contentDescription isEqualToObject:content.contentDescription] && + [FBSDKInternalUtility object:_contentTitle isEqualToObject:content.contentTitle] && + [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && + [FBSDKInternalUtility object:_feedParameters isEqualToObject:content.feedParameters] && + [FBSDKInternalUtility object:_imageURL isEqualToObject:content.imageURL] && + [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && + [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && + [FBSDKInternalUtility object:_ref isEqualToObject:content.ref]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _contentDescription = [decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_DESCRIPTION_KEY]; + _contentTitle = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_TITLE_KEY]; + _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_URL_KEY]; + _feedParameters = [decoder decodeObjectOfClass:[NSDictionary class] forKey:FBSDK_SHARE_STATUS_CONTENT_FEED_PARAMETERS_KEY]; + _imageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_STATUS_CONTENT_IMAGE_URL_KEY]; + _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_STATUS_CONTENT_PEOPLE_IDS_KEY]; + _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_PLACE_ID_KEY]; + _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_REF_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_contentDescription forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_DESCRIPTION_KEY]; + [encoder encodeObject:_contentTitle forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_TITLE_KEY]; + [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_URL_KEY]; + [encoder encodeObject:_feedParameters forKey:FBSDK_SHARE_STATUS_CONTENT_FEED_PARAMETERS_KEY]; + [encoder encodeObject:_imageURL forKey:FBSDK_SHARE_STATUS_CONTENT_IMAGE_URL_KEY]; + [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_STATUS_CONTENT_PEOPLE_IDS_KEY]; + [encoder encodeObject:_placeID forKey:FBSDK_SHARE_STATUS_CONTENT_PLACE_ID_KEY]; + [encoder encodeObject:_ref forKey:FBSDK_SHARE_STATUS_CONTENT_REF_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKShareLinkContent *copy = [[FBSDKShareLinkContent alloc] init]; + copy->_contentDescription = [_contentDescription copy]; + copy->_contentTitle = [_contentTitle copy]; + copy->_contentURL = [_contentURL copy]; + copy->_feedParameters = [_feedParameters copy]; + copy->_imageURL = [_imageURL copy]; + copy->_peopleIDs = [_peopleIDs copy]; + copy->_placeID = [_placeID copy]; + copy->_ref = [_ref copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h new file mode 100644 index 0000000..5f6db0a --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h @@ -0,0 +1,69 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import +#import + +/*! + @abstract An Open Graph Action for sharing. + @discussion The property keys MUST have namespaces specified on them, such as `og:image`. + */ +@interface FBSDKShareOpenGraphAction : FBSDKShareOpenGraphValueContainer + +/*! + @abstract Convenience method to build a new action and set the object for the specified key. + @param actionType The action type of the receiver + @param object The Open Graph object represented by this action + @param key The key for the object + */ ++ (instancetype)actionWithType:(NSString *)actionType object:(FBSDKShareOpenGraphObject *)object key:(NSString *)key; + +/*! + @abstract Convenience method to build a new action and set the object for the specified key. + @param actionType The action type of the receiver + @param objectID The ID of an existing Open Graph object + @param key The key for the object + */ ++ (instancetype)actionWithType:(NSString *)actionType objectID:(NSString *)objectID key:(NSString *)key; + +/*! + @abstract Convenience method to build a new action and set the object for the specified key. + @param actionType The action type of the receiver + @param objectURL The URL to a page that defines the Open Graph object with meta tags + @param key The key for the object + */ ++ (instancetype)actionWithType:(NSString *)actionType objectURL:(NSURL *)objectURL key:(NSString *)key; + +/*! + @abstract Gets the action type. + @return The action type + */ +@property (nonatomic, copy) NSString *actionType; + +/*! + @abstract Compares the receiver to another Open Graph Action. + @param action The other action + @return YES if the receiver's values are equal to the other action's values; otherwise NO + */ +- (BOOL)isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)action; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m new file mode 100644 index 0000000..8211b59 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m @@ -0,0 +1,117 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareOpenGraphAction.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareOpenGraphValueContainer+Internal.h" + +#define FBSDK_SHARE_OPEN_GRAPH_ACTION_TYPE_KEY @"type" + +@implementation FBSDKShareOpenGraphAction + +#pragma mark - Class Methods + ++ (instancetype)actionWithType:(NSString *)actionType object:(FBSDKShareOpenGraphObject *)object key:(NSString *)key +{ + FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init]; + action.actionType = actionType; + [action setObject:object forKey:key]; + return action; +} + ++ (instancetype)actionWithType:(NSString *)actionType objectID:(NSString *)objectID key:(NSString *)key +{ + FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init]; + action.actionType = actionType; + [action setString:objectID forKey:key]; + return action; +} + ++ (instancetype)actionWithType:(NSString *)actionType objectURL:(NSURL *)objectURL key:(NSString *)key +{ + FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init]; + action.actionType = actionType; + [action setURL:objectURL forKey:key]; + return action; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + return [FBSDKMath hashWithInteger:[super hash] andInteger:[_actionType hash]]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareOpenGraphAction class]]) { + return NO; + } + return [self isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)object]; +} + +- (BOOL)isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)action +{ + return (action && + [FBSDKInternalUtility object:_actionType isEqualToObject:action.actionType] && + [self isEqualToShareOpenGraphValueContainer:action]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [super initWithCoder:decoder])) { + _actionType = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_ACTION_TYPE_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [super encodeWithCoder:encoder]; + [encoder encodeObject:_actionType forKey:FBSDK_SHARE_OPEN_GRAPH_ACTION_TYPE_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKShareOpenGraphAction *copy = [[FBSDKShareOpenGraphAction alloc] init]; + copy->_actionType = [_actionType copy]; + [copy parseProperties:[self allProperties]]; + return copy; +} + +#pragma mark - Internal Methods + +- (BOOL)requireKeyNamespace +{ + return NO; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h new file mode 100644 index 0000000..4393b0c --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h @@ -0,0 +1,49 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import + +/*! + @abstract A model for Open Graph content to be shared. + */ +@interface FBSDKShareOpenGraphContent : NSObject + +/*! + @abstract Open Graph Action to be shared. + @return The action + */ +@property (nonatomic, copy) FBSDKShareOpenGraphAction *action; + +/*! + @abstract Property name that points to the primary Open Graph Object in the action. + @discussion The value that this action points to will be use for rendering the preview for the share. + @return The property name for the Open Graph Object in the action + */ +@property (nonatomic, copy) NSString *previewPropertyName; + +/*! + @abstract Compares the receiver to another Open Graph content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)content; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m new file mode 100644 index 0000000..8f3de20 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m @@ -0,0 +1,132 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareOpenGraphContent.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKSharePhoto.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_ACTION_KEY @"action" +#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_CONTENT_URL_KEY @"contentURL" +#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" +#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PLACE_ID_KEY @"placeID" +#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PREVIEW_PROPERTY_NAME_KEY @"previewPropertyName" +#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_REF_KEY @"ref" + +@implementation FBSDKShareOpenGraphContent + +#pragma mark - Properties + +@synthesize contentURL = _contentURL; +@synthesize peopleIDs = _peopleIDs; +@synthesize placeID = _placeID; +@synthesize ref = _ref; + +- (void)setPeopleIDs:(NSArray *)peopleIDs +{ + [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; + if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { + _peopleIDs = [peopleIDs copy]; + } +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_action hash], + [_contentURL hash], + [_peopleIDs hash], + [_placeID hash], + [_previewPropertyName hash], + [_ref hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + return NO; + } + return [self isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)object]; +} + +- (BOOL)isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)content +{ + return (content && + [FBSDKInternalUtility object:_action isEqualToObject:content.action] && + [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && + [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && + [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && + [FBSDKInternalUtility object:_previewPropertyName isEqualToObject:content.previewPropertyName] && + [FBSDKInternalUtility object:_ref isEqualToObject:content.ref]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [super init])) { + _action = [decoder decodeObjectOfClass:[FBSDKShareOpenGraphAction class] + forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_ACTION_KEY]; + _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_CONTENT_URL_KEY]; + _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PEOPLE_IDS_KEY]; + _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PLACE_ID_KEY]; + _previewPropertyName = [decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PREVIEW_PROPERTY_NAME_KEY]; + _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_REF_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_action forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_ACTION_KEY]; + [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_CONTENT_URL_KEY]; + [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PEOPLE_IDS_KEY]; + [encoder encodeObject:_placeID forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PLACE_ID_KEY]; + [encoder encodeObject:_previewPropertyName forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PREVIEW_PROPERTY_NAME_KEY]; + [encoder encodeObject:_ref forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_REF_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKShareOpenGraphContent *copy = [[FBSDKShareOpenGraphContent alloc] init]; + copy->_action = [_action copy]; + copy->_contentURL = [_contentURL copy]; + copy->_peopleIDs = [_peopleIDs copy]; + copy->_placeID = [_placeID copy]; + copy->_previewPropertyName = [_previewPropertyName copy]; + copy->_ref = [_ref copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h new file mode 100644 index 0000000..3a1e1a5 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h @@ -0,0 +1,58 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import + +/*! + @abstract An Open Graph Object for sharing. + @discussion The property keys MUST have namespaces specified on them, such as `og:image`, + and `og:type` is required. + + See https://developers.facebook.com/docs/sharing/opengraph/object-properties for other properties. + + You can specify nested namespaces inline to define complex properties. For example, the following + code will generate a fitness.course object with a location: + + FBSDKShareOpenGraphObject *course = [FBSDKShareOpenGraphObject objectWithProperties: + @{ + @"og:type": @"fitness.course", + @"og:title": @"Sample course", + @"fitness:metrics:location:latitude": @"41.40338", + @"fitness:metrics:location:longitude": @"2.17403", + }]; + */ +@interface FBSDKShareOpenGraphObject : FBSDKShareOpenGraphValueContainer + +/*! + @abstract Convenience method to build a new action and set the object for the specified key. + @param properties Properties for the Open Graph object, which will be parsed into the proper models + */ ++ (instancetype)objectWithProperties:(NSDictionary *)properties; + +/*! + @abstract Compares the receiver to another Open Graph Object. + @param object The other object + @return YES if the receiver's values are equal to the other object's values; otherwise NO + */ +- (BOOL)isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m new file mode 100644 index 0000000..eb6a1c5 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m @@ -0,0 +1,63 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareOpenGraphObject.h" + +#import "FBSDKShareOpenGraphValueContainer+Internal.h" + +#define FBSDK_SHARE_OPEN_GRAPH_OBJECT_DATA_KEY @"data" + +@implementation FBSDKShareOpenGraphObject + +#pragma mark - Class Methods + ++ (instancetype)objectWithProperties:(NSDictionary *)properties +{ + FBSDKShareOpenGraphObject *object = [[FBSDKShareOpenGraphObject alloc] init]; + [object parseProperties:properties]; + return object; +} + +#pragma mark - Equality + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareOpenGraphObject class]]) { + return NO; + } + return [self isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object]; +} + +- (BOOL)isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object +{ + return [self isEqualToShareOpenGraphValueContainer:object]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKShareOpenGraphObject *copy = [[FBSDKShareOpenGraphObject alloc] init]; + [copy parseProperties:[self allProperties]]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h new file mode 100644 index 0000000..4687828 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h @@ -0,0 +1,160 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@class FBSDKShareOpenGraphObject; +@class FBSDKSharePhoto; + +/*! + @abstract Protocol defining operations on open graph actions and objects. + @discussion The property keys MUST have namespaces specified on them, such as `og:image`. + */ +@protocol FBSDKShareOpenGraphValueContaining + +/*! + @abstract Gets an NSArray out of the receiver. + @param key The key for the value + @return The NSArray value or nil + */ +- (NSArray *)arrayForKey:(NSString *)key; + +/*! + @abstract Applies a given block object to the entries of the receiver. + @param block A block object to operate on entries in the receiver + */ +- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(NSString *key, id object, BOOL *stop))block; + +/*! + @abstract Returns an enumerator object that lets you access each key in the receiver. + @return An enumerator object that lets you access each key in the receiver + */ +- (NSEnumerator *)keyEnumerator; + +/*! + @abstract Gets an NSNumber out of the receiver. + @param key The key for the value + @return The NSNumber value or nil + */ +- (NSNumber *)numberForKey:(NSString *)key; + +/*! + @abstract Returns an enumerator object that lets you access each value in the receiver. + @return An enumerator object that lets you access each value in the receiver + */ +- (NSEnumerator *)objectEnumerator; + +/*! + @abstract Gets an FBSDKShareOpenGraphObject out of the receiver. + @param key The key for the value + @return The FBSDKShareOpenGraphObject value or nil + */ +- (FBSDKShareOpenGraphObject *)objectForKey:(NSString *)key; + +/*! + @abstract Enables subscript access to the values in the receiver. + @param key The key for the value + @return The value + */ +- (id)objectForKeyedSubscript:(NSString *)key; + +/*! + @abstract Parses properties out of a dictionary into the receiver. + @param properties The properties to parse. + */ +- (void)parseProperties:(NSDictionary *)properties; + +/*! + @abstract Gets an FBSDKSharePhoto out of the receiver. + @param key The key for the value + @return The FBSDKSharePhoto value or nil + */ +- (FBSDKSharePhoto *)photoForKey:(NSString *)key; + +/*! + @abstract Removes a value from the receiver for the specified key. + @param key The key for the value + */ +- (void)removeObjectForKey:(NSString *)key; + +/*! + @abstract Sets an NSArray on the receiver. + @discussion This method will throw if the array contains any values that is not an NSNumber, NSString, NSURL, + FBSDKSharePhoto or FBSDKShareOpenGraphObject. + @param array The NSArray value + @param key The key for the value + */ +- (void)setArray:(NSArray *)array forKey:(NSString *)key; + +/*! + @abstract Sets an NSNumber on the receiver. + @param number The NSNumber value + @param key The key for the value + */ +- (void)setNumber:(NSNumber *)number forKey:(NSString *)key; + +/*! + @abstract Sets an FBSDKShareOpenGraphObject on the receiver. + @param object The FBSDKShareOpenGraphObject value + @param key The key for the value + */ +- (void)setObject:(FBSDKShareOpenGraphObject *)object forKey:(NSString *)key; + +/*! + @abstract Sets an FBSDKSharePhoto on the receiver. + @param photo The FBSDKSharePhoto value + @param key The key for the value + */ +- (void)setPhoto:(FBSDKSharePhoto *)photo forKey:(NSString *)key; + +/*! + @abstract Sets an NSString on the receiver. + @param string The NSString value + @param key The key for the value + */ +- (void)setString:(NSString *)string forKey:(NSString *)key; + +/*! + @abstract Sets an NSURL on the receiver. + @param URL The NSURL value + @param key The key for the value + */ +- (void)setURL:(NSURL *)URL forKey:(NSString *)key; + +/*! + @abstract Gets an NSString out of the receiver. + @param key The key for the value + @return The NSString value or nil + */ +- (NSString *)stringForKey:(NSString *)key; + +/*! + @abstract Gets an NSURL out of the receiver. + @param key The key for the value + @return The NSURL value or nil + */ +- (NSURL *)URLForKey:(NSString *)key; + +@end + +/*! + @abstract A base class to container Open Graph values. + */ +@interface FBSDKShareOpenGraphValueContainer : NSObject + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m new file mode 100644 index 0000000..d19ce08 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m @@ -0,0 +1,238 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareOpenGraphValueContainer.h" +#import "FBSDKShareOpenGraphValueContainer+Internal.h" + +#import + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareOpenGraphObject.h" +#import "FBSDKSharePhoto.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_SHARE_OPEN_GRAPH_VALUE_CONTAINER_PROPERTIES_KEY @"properties" + +@implementation FBSDKShareOpenGraphValueContainer +{ + NSMutableDictionary *_properties; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + _properties = [[NSMutableDictionary alloc] init]; + } + return self; +} + +#pragma mark - Public Methods + +- (NSDictionary *)allData +{ + return [_properties copy]; +} + +- (NSArray *)arrayForKey:(NSString *)key +{ + return [self _valueOfClass:[NSArray class] forKey:key]; +} + +- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(NSString *key, id object, BOOL *stop))block +{ + [_properties enumerateKeysAndObjectsUsingBlock:block]; +} + +- (NSEnumerator *)keyEnumerator +{ + return [_properties keyEnumerator]; +} + +- (NSNumber *)numberForKey:(NSString *)key +{ + return [self _valueOfClass:[NSNumber class] forKey:key]; +} + +- (NSEnumerator *)objectEnumerator +{ + return [_properties objectEnumerator]; +} + +- (FBSDKShareOpenGraphObject *)objectForKey:(NSString *)key +{ + return [self _valueOfClass:[FBSDKShareOpenGraphObject class] forKey:key]; +} + +- (id)objectForKeyedSubscript:(id)key +{ + return [self _valueForKey:key]; +} + +- (void)parseProperties:(NSDictionary *)properties +{ + [FBSDKShareUtility assertOpenGraphValues:properties requireKeyNamespace:[self requireKeyNamespace]]; + [_properties addEntriesFromDictionary:[FBSDKShareUtility convertOpenGraphValues:properties]]; +} + +- (FBSDKSharePhoto *)photoForKey:(NSString *)key +{ + return [self _valueOfClass:[FBSDKSharePhoto class] forKey:key]; +} + +- (void)removeObjectForKey:(NSString *)key +{ + [_properties removeObjectForKey:key]; +} + +- (void)setArray:(NSArray *)array forKey:(NSString *)key +{ + [self _setValue:array forKey:key]; +} + +- (void)setNumber:(NSNumber *)number forKey:(NSString *)key +{ + [self _setValue:number forKey:key]; +} + +- (void)setObject:(FBSDKShareOpenGraphObject *)object forKey:(NSString *)key +{ + [self _setValue:object forKey:key]; +} + +- (void)setPhoto:(FBSDKSharePhoto *)photo forKey:(NSString *)key +{ + [self _setValue:photo forKey:key]; +} + +- (void)setString:(NSString *)string forKey:(NSString *)key +{ + [self _setValue:string forKey:key]; +} + +- (void)setURL:(NSURL *)URL forKey:(NSString *)key +{ + [self _setValue:URL forKey:key]; +} +- (NSString *)stringForKey:(NSString *)key +{ + return [self _valueOfClass:[NSString class] forKey:key]; +} + +- (NSURL *)URLForKey:(NSString *)key +{ + return [self _valueOfClass:[NSURL class] forKey:key]; +} + +- (id)valueForKey:(NSString *)key +{ + return [self _valueForKey:key] ?: [super valueForKey:key]; +} + +#pragma mark - Internal Methods + +- (NSDictionary *)allProperties +{ + return _properties; +} + +- (BOOL)requireKeyNamespace +{ + return YES; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + return [_properties hash]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareOpenGraphValueContainer class]]) { + return NO; + } + return [self isEqualToShareOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object]; +} + +- (BOOL)isEqualToShareOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object +{ + return [FBSDKInternalUtility object:_properties isEqualToObject:[object allProperties]]; +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + NSSet *classes = [NSSet setWithObjects: + [NSArray class], + [NSDictionary class], + [FBSDKShareOpenGraphObject class], + [FBSDKSharePhoto class], + nil]; + NSDictionary *properties = [decoder decodeObjectOfClasses:classes + forKey:FBSDK_SHARE_OPEN_GRAPH_VALUE_CONTAINER_PROPERTIES_KEY]; + if ([properties count]) { + [self parseProperties:properties]; + } + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_properties forKey:FBSDK_SHARE_OPEN_GRAPH_VALUE_CONTAINER_PROPERTIES_KEY]; +} + +#pragma mark - Helper Methods + +- (void)_setValue:(id)value forKey:(NSString *)key +{ + [FBSDKShareUtility assertOpenGraphKey:key requireNamespace:[self requireKeyNamespace]]; + [FBSDKShareUtility assertOpenGraphValue:value]; + if (value) { + _properties[key] = value; + } else { + [self removeObjectForKey:key]; + } +} + +- (id)_valueForKey:(id)key +{ + key = [FBSDKTypeUtility stringValue:key]; + return (key ? [FBSDKTypeUtility objectValue:_properties[key]] : nil); +} + +- (id)_valueOfClass:(__unsafe_unretained Class)cls forKey:(NSString *)key +{ + id value = [self _valueForKey:key]; + return ([value isKindOfClass:cls] ? value : nil); +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h new file mode 100644 index 0000000..c3b91a6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h @@ -0,0 +1,80 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A photo for sharing. + */ +@interface FBSDKSharePhoto : NSObject + +/*! + @abstract Convenience method to build a new photo object with an image. + @param image If the photo is resident in memory, this method supplies the data + @param userGenerated Specifies whether the photo represented by the receiver was generated by the user or by the + application + */ ++ (instancetype)photoWithImage:(UIImage *)image userGenerated:(BOOL)userGenerated; + +/*! + @abstract Convenience method to build a new photo object with an imageURL. + @param imageURL The URL to the photo + @param userGenerated Specifies whether the photo represented by the receiver was generated by the user or by the + application + @discussion This method should only be used when adding photo content to open graph stories. + For example, if you're trying to share a photo from the web by itself, download the image and use + `photoWithImage:userGenerated:` instead. + */ ++ (instancetype)photoWithImageURL:(NSURL *)imageURL userGenerated:(BOOL)userGenerated; + +/*! + @abstract If the photo is resident in memory, this method supplies the data. + @return UIImage representation of the photo + */ +@property (nonatomic, strong) UIImage *image; + +/*! + @abstract The URL to the photo. + @return URL that points to a network location or the location of the photo on disk + */ +@property (nonatomic, copy) NSURL *imageURL; + +/*! + @abstract Specifies whether the photo represented by the receiver was generated by the user or by the application. + @return YES if the photo is user-generated, otherwise NO + */ +@property (nonatomic, assign, getter=isUserGenerated) BOOL userGenerated; + +/*! + @abstract Compares the receiver to another photo. + @param photo The other photo + @return YES if the receiver's values are equal to the other photo's values; otherwise NO + */ +- (BOOL)isEqualToSharePhoto:(FBSDKSharePhoto *)photo; + +/*! + @abstract The user generated caption for the photo. Note that the 'caption' must come from + * the user, as pre-filled content is forbidden by the Platform Policies (2.3). + @return the Photo's caption if exists else returns null. + */ +@property (nonatomic, copy) NSString *caption; + + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m new file mode 100644 index 0000000..27c67b5 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m @@ -0,0 +1,119 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKSharePhoto.h" + +#import "FBSDKCoreKit+Internal.h" + +#define FBSDK_SHARE_PHOTO_IMAGE_KEY @"image" +#define FBSDK_SHARE_PHOTO_IMAGE_URL_KEY @"imageURL" +#define FBSDK_SHARE_PHOTO_USER_GENERATED_KEY @"userGenerated" +#define FBSDK_SHARE_PHOTO_CAPTION_KEY @"caption" + +@implementation FBSDKSharePhoto + +#pragma mark - Class Methods + ++ (instancetype)photoWithImage:(UIImage *)image userGenerated:(BOOL)userGenerated +{ + FBSDKSharePhoto *photo = [[self alloc] init]; + photo.image = image; + photo.userGenerated = userGenerated; + return photo; +} + ++ (instancetype)photoWithImageURL:(NSURL *)imageURL userGenerated:(BOOL)userGenerated +{ + FBSDKSharePhoto *photo = [[self alloc] init]; + photo.imageURL = imageURL; + photo.userGenerated = userGenerated; + return photo; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_image hash], + [_imageURL hash], + [_caption hash], + (_userGenerated ? 1u : 0u) + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKSharePhoto class]]) { + return NO; + } + return [self isEqualToSharePhoto:(FBSDKSharePhoto *)object]; +} + +- (BOOL)isEqualToSharePhoto:(FBSDKSharePhoto *)photo +{ + return (photo && + (_userGenerated == photo.userGenerated) && + [FBSDKInternalUtility object:_image isEqualToObject:photo.image] && + [FBSDKInternalUtility object:_imageURL isEqualToObject:photo.imageURL] && + [FBSDKInternalUtility object:_caption isEqualToObject:photo.caption]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _image = [decoder decodeObjectOfClass:[UIImage class] forKey:FBSDK_SHARE_PHOTO_IMAGE_KEY]; + _imageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_PHOTO_IMAGE_URL_KEY]; + _userGenerated = [decoder decodeBoolForKey:FBSDK_SHARE_PHOTO_USER_GENERATED_KEY]; + _caption = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CAPTION_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_image forKey:FBSDK_SHARE_PHOTO_IMAGE_KEY]; + [encoder encodeObject:_imageURL forKey:FBSDK_SHARE_PHOTO_IMAGE_URL_KEY]; + [encoder encodeBool:_userGenerated forKey:FBSDK_SHARE_PHOTO_USER_GENERATED_KEY]; + [encoder encodeObject:_caption forKey:FBSDK_SHARE_PHOTO_CAPTION_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKSharePhoto *copy = [[FBSDKSharePhoto alloc] init]; + copy->_image = [_image copy]; + copy->_imageURL = [_imageURL copy]; + copy->_userGenerated = _userGenerated; + copy->_caption = [_caption copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h new file mode 100644 index 0000000..1fd0782 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h @@ -0,0 +1,41 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A model for photo content to be shared. + */ +@interface FBSDKSharePhotoContent : NSObject + +/*! + @abstract Photos to be shared. + @return Array of the photos (FBSDKSharePhoto) + */ +@property (nonatomic, copy) NSArray *photos; + +/*! + @abstract Compares the receiver to another photo content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)content; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m new file mode 100644 index 0000000..b26b468 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m @@ -0,0 +1,133 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKSharePhotoContent.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKSharePhoto.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_SHARE_PHOTO_CONTENT_CONTENT_URL_KEY @"contentURL" +#define FBSDK_SHARE_PHOTO_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" +#define FBSDK_SHARE_PHOTO_CONTENT_PHOTOS_KEY @"photos" +#define FBSDK_SHARE_PHOTO_CONTENT_PLACE_ID_KEY @"placeID" +#define FBSDK_SHARE_PHOTO_CONTENT_REF_KEY @"ref" + +@implementation FBSDKSharePhotoContent + +#pragma mark - Properties + +@synthesize contentURL = _contentURL; +@synthesize peopleIDs = _peopleIDs; +@synthesize placeID = _placeID; +@synthesize ref = _ref; + +- (void)setPeopleIDs:(NSArray *)peopleIDs +{ + [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; + if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { + _peopleIDs = [peopleIDs copy]; + } +} + +- (void)setPhotos:(NSArray *)photos +{ + [FBSDKShareUtility assertCollection:photos ofClass:[FBSDKSharePhoto class] name:@"photos"]; + if (![FBSDKInternalUtility object:_photos isEqualToObject:photos]) { + _photos = [photos copy]; + } +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_contentURL hash], + [_peopleIDs hash], + [_photos hash], + [_placeID hash], + [_ref hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKSharePhotoContent class]]) { + return NO; + } + return [self isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)object]; +} + +- (BOOL)isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)content +{ + return (content && + [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && + [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && + [FBSDKInternalUtility object:_photos isEqualToObject:content.photos] && + [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && + [FBSDKInternalUtility object:_ref isEqualToObject:content.ref]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_PHOTO_CONTENT_CONTENT_URL_KEY]; + _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_PHOTO_CONTENT_PEOPLE_IDS_KEY]; + NSSet *classes = [NSSet setWithObjects:[NSArray class], [FBSDKSharePhoto class], nil]; + _photos = [decoder decodeObjectOfClasses:classes forKey:FBSDK_SHARE_PHOTO_CONTENT_PHOTOS_KEY]; + _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CONTENT_PLACE_ID_KEY]; + _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CONTENT_REF_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_PHOTO_CONTENT_CONTENT_URL_KEY]; + [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_PHOTO_CONTENT_PEOPLE_IDS_KEY]; + [encoder encodeObject:_photos forKey:FBSDK_SHARE_PHOTO_CONTENT_PHOTOS_KEY]; + [encoder encodeObject:_placeID forKey:FBSDK_SHARE_PHOTO_CONTENT_PLACE_ID_KEY]; + [encoder encodeObject:_ref forKey:FBSDK_SHARE_PHOTO_CONTENT_REF_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKSharePhotoContent *copy = [[FBSDKSharePhotoContent alloc] init]; + copy->_contentURL = [_contentURL copy]; + copy->_peopleIDs = [_peopleIDs copy]; + copy->_photos = [_photos copy]; + copy->_placeID = [_placeID copy]; + copy->_ref = [_ref copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h new file mode 100644 index 0000000..2b6ae0c --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h @@ -0,0 +1,48 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A video for sharing. + */ +@interface FBSDKShareVideo : NSObject + +/*! + @abstract Convenience method to build a new video object with a videoURL. + @param videoURL The URL to the video + application + */ ++ (instancetype)videoWithVideoURL:(NSURL *)videoURL; + +/*! + @abstract The file URL to the video. + @return URL that points to the location of the video on disk + */ +@property (nonatomic, copy) NSURL *videoURL; + +/*! + @abstract Compares the receiver to another video. + @param video The other video + @return YES if the receiver's values are equal to the other video's values; otherwise NO + */ +- (BOOL)isEqualToShareVideo:(FBSDKShareVideo *)video; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m new file mode 100644 index 0000000..ad8e10f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m @@ -0,0 +1,89 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareVideo.h" + +#import "FBSDKCoreKit+Internal.h" + +#define FBSDK_SHARE_VIDEO_URL_KEY @"videoURL" + +@implementation FBSDKShareVideo + +#pragma mark - Class Methods + ++ (instancetype)videoWithVideoURL:(NSURL *)videoURL +{ + FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init]; + video.videoURL = videoURL; + return video; +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + return [_videoURL hash]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareVideo class]]) { + return NO; + } + return [self isEqualToShareVideo:(FBSDKShareVideo *)object]; +} + +- (BOOL)isEqualToShareVideo:(FBSDKShareVideo *)video +{ + return (video && + [FBSDKInternalUtility object:_videoURL isEqualToObject:video.videoURL]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _videoURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_VIDEO_URL_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_videoURL forKey:FBSDK_SHARE_VIDEO_URL_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKShareVideo *copy = [[FBSDKShareVideo alloc] init]; + copy->_videoURL = [_videoURL copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h new file mode 100644 index 0000000..bead676 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h @@ -0,0 +1,49 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import + +/*! + @abstract A model for video content to be shared. + */ +@interface FBSDKShareVideoContent : NSObject + +/*! + @abstract The photo that represents the video. + @return The photo + */ +@property (nonatomic, copy) FBSDKSharePhoto *previewPhoto; + +/*! + @abstract The video to be shared. + @return The video + */ +@property (nonatomic, copy) FBSDKShareVideo *video; + +/*! + @abstract Compares the receiver to another video content. + @param content The other content + @return YES if the receiver's values are equal to the other content's values; otherwise NO + */ +- (BOOL)isEqualToShareVideoContent:(FBSDKShareVideoContent *)content; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m new file mode 100644 index 0000000..90b3938 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m @@ -0,0 +1,130 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareVideoContent.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareUtility.h" + +#define FBSDK_SHARE_VIDEO_CONTENT_CONTENT_URL_KEY @"contentURL" +#define FBSDK_SHARE_VIDEO_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" +#define FBSDK_SHARE_VIDEO_CONTENT_PLACE_ID_KEY @"placeID" +#define FBSDK_SHARE_VIDEO_CONTENT_PREVIEW_PHOTO_KEY @"previewPhoto" +#define FBSDK_SHARE_VIDEO_CONTENT_REF_KEY @"ref" +#define FBSDK_SHARE_VIDEO_CONTENT_VIDEO_KEY @"video" + +@implementation FBSDKShareVideoContent + +#pragma mark - Properties + +@synthesize contentURL = _contentURL; +@synthesize peopleIDs = _peopleIDs; +@synthesize placeID = _placeID; +@synthesize ref = _ref; + +- (void)setPeopleIDs:(NSArray *)peopleIDs +{ + [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; + if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { + _peopleIDs = [peopleIDs copy]; + } +} + +#pragma mark - Equality + +- (NSUInteger)hash +{ + NSUInteger subhashes[] = { + [_contentURL hash], + [_peopleIDs hash], + [_placeID hash], + [_previewPhoto hash], + [_ref hash], + [_video hash], + }; + return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if (![object isKindOfClass:[FBSDKShareVideoContent class]]) { + return NO; + } + return [self isEqualToShareVideoContent:(FBSDKShareVideoContent *)object]; +} + +- (BOOL)isEqualToShareVideoContent:(FBSDKShareVideoContent *)content +{ + return (content && + [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && + [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && + [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && + [FBSDKInternalUtility object:_previewPhoto isEqualToObject:content.previewPhoto] && + [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && + [FBSDKInternalUtility object:_video isEqualToObject:content.video]); +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [self init])) { + _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_VIDEO_CONTENT_CONTENT_URL_KEY]; + _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_VIDEO_CONTENT_PEOPLE_IDS_KEY]; + _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_VIDEO_CONTENT_PLACE_ID_KEY]; + _previewPhoto = [decoder decodeObjectOfClass:[FBSDKSharePhoto class] + forKey:FBSDK_SHARE_VIDEO_CONTENT_PREVIEW_PHOTO_KEY]; + _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_VIDEO_CONTENT_REF_KEY]; + _video = [decoder decodeObjectOfClass:[FBSDKShareVideo class] forKey:FBSDK_SHARE_VIDEO_CONTENT_VIDEO_KEY]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_VIDEO_CONTENT_CONTENT_URL_KEY]; + [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_VIDEO_CONTENT_PEOPLE_IDS_KEY]; + [encoder encodeObject:_placeID forKey:FBSDK_SHARE_VIDEO_CONTENT_PLACE_ID_KEY]; + [encoder encodeObject:_previewPhoto forKey:FBSDK_SHARE_VIDEO_CONTENT_PREVIEW_PHOTO_KEY]; + [encoder encodeObject:_ref forKey:FBSDK_SHARE_VIDEO_CONTENT_REF_KEY]; + [encoder encodeObject:_video forKey:FBSDK_SHARE_VIDEO_CONTENT_VIDEO_KEY]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + FBSDKShareVideoContent *copy = [[FBSDKShareVideoContent alloc] init]; + copy->_contentURL = [_contentURL copy]; + copy->_peopleIDs = [_peopleIDs copy]; + copy->_placeID = [_placeID copy]; + copy->_previewPhoto = [_previewPhoto copy]; + copy->_ref = [_ref copy]; + copy->_video = [_video copy]; + return copy; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h new file mode 100644 index 0000000..d6d373e --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h @@ -0,0 +1,110 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@protocol FBSDKSharingDelegate; + +/*! + @abstract The common interface for components that initiate sharing. + @see FBSDKShareDialog + @see FBSDKMessageDialog + @see FBSDKShareAPI + */ +@protocol FBSDKSharing + +/*! + @abstract The receiver's delegate or nil if it doesn't have a delegate. + */ +@property (nonatomic, weak) id delegate; + +/*! + @abstract The content to be shared. + */ +@property (nonatomic, copy) id shareContent; + +/*! + @abstract A Boolean value that indicates whether the receiver should fail if it finds an error with the share content. + @discussion If NO, the sharer will still be displayed without the data that was mis-configured. For example, an + invalid placeID specified on the shareContent would produce a data error. + */ +@property (nonatomic, assign) BOOL shouldFailOnDataError; + +/*! + @abstract Validates the content on the receiver. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @return YES if the content is valid, otherwise NO. + */ +- (BOOL)validateWithError:(NSError **)errorRef; + +@end + +/*! + @abstract The common interface for dialogs that initiate sharing. + */ +@protocol FBSDKSharingDialog + +/*! + @abstract A Boolean value that indicates whether the receiver can initiate a share. + @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is + required but not available. This method does not validate the content on the receiver, so this can be checked before + building up the content. + @see [FBSDKSharing validateWithError:] + @result YES if the receiver can share, otherwise NO. + */ +- (BOOL)canShow; + +/*! + @abstract Shows the dialog. + @result YES if the receiver was able to begin sharing, otherwise NO. + */ +- (BOOL)show; + +@end + +/*! + @abstract A delegate for FBSDKSharing. + @discussion The delegate is notified with the results of the sharer as long as the application has permissions to + receive the information. For example, if the person is not signed into the containing app, the sharer may not be able + to distinguish between completion of a share and cancellation. + */ +@protocol FBSDKSharingDelegate + +/*! + @abstract Sent to the delegate when the share completes without error or cancellation. + @param sharer The FBSDKSharing that completed. + @param results The results from the sharer. This may be nil or empty. + */ +- (void)sharer:(id)sharer didCompleteWithResults:(NSDictionary *)results; + +/*! + @abstract Sent to the delegate when the sharer encounters an error. + @param sharer The FBSDKSharing that completed. + @param error The error. + */ +- (void)sharer:(id)sharer didFailWithError:(NSError *)error; + +/*! + @abstract Sent to the delegate when the sharer is cancelled. + @param sharer The FBSDKSharing that completed. + */ +- (void)sharerDidCancel:(id)sharer; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h new file mode 100644 index 0000000..a3af423 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract The common interface for sharing buttons. + @see FBSDKSendButton + @see FBSDKShareButton + */ +@protocol FBSDKSharingButton + +/*! + @abstract The content to be shared. + */ +@property (nonatomic, copy) id shareContent; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h new file mode 100644 index 0000000..5f70083 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h @@ -0,0 +1,56 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +/*! + @abstract A base interface for content to be shared. + */ +@protocol FBSDKSharingContent + +/*! + @abstract URL for the content being shared. + @discussion This URL will be checked for all link meta tags for linking in platform specific ways. See documentation + for App Links (https://developers.facebook.com/docs/applinks/) + @return URL representation of the content link + */ +@property (nonatomic, copy) NSURL *contentURL; + +/*! + @abstract List of IDs for taggable people to tag with this content. + @description See documentation for Taggable Friends + (https://developers.facebook.com/docs/graph-api/reference/user/taggable_friends) + @return Array of IDs for people to tag (NSString) + */ +@property (nonatomic, copy) NSArray *peopleIDs; + +/*! + @abstract The ID for a place to tag with this content. + @return The ID for the place to tag + */ +@property (nonatomic, copy) NSString *placeID; + +/*! + @abstract A value to be added to the referrer URL when a person follows a link from this shared content on feed. + @return The ref for the content. + */ +@property (nonatomic, copy) NSString *ref; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h new file mode 100644 index 0000000..06fde34 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKCoreKit+Internal.h" + +@interface FBSDKCheckmarkIcon : FBSDKIcon + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m new file mode 100644 index 0000000..7f4da89 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m @@ -0,0 +1,43 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKCheckmarkIcon.h" + +@implementation FBSDKCheckmarkIcon + +- (CGPathRef)pathWithSize:(CGSize)size +{ + CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 100.0, size.height / 100.0); + CGAffineTransform *transform = &transformValue; + CGMutablePathRef path = CGPathCreateMutable(); + CGPathMoveToPoint(path, transform, 0.0, 50.0); + const CGPoint points[] = { + CGPointMake(12.0, 38.0), + CGPointMake(37.0, 63.0), + CGPointMake(87.0, 13.0), + CGPointMake(99.0, 25.0), + CGPointMake(37.0, 87.0), + CGPointMake(0.0, 48.0), + }; + CGPathAddLines(path, transform, points, sizeof(points) / sizeof(points[0])); + CGPathRef result = CGPathCreateCopy(path); + CGPathRelease(path); + return CFAutorelease(result); +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h new file mode 100644 index 0000000..ad0a20e --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKGameRequestFrictionlessRecipientCache : NSObject + +- (BOOL)recipientsAreFrictionless:(id)recipients; +- (void)updateWithResults:(NSDictionary *)results; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m new file mode 100644 index 0000000..b1551d5 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m @@ -0,0 +1,100 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKGameRequestFrictionlessRecipientCache.h" + +#import + +#import "FBSDKCoreKit+Internal.h" + +@implementation FBSDKGameRequestFrictionlessRecipientCache +{ + NSSet *_recipientIDs; +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + if ((self = [super init])) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(_accessTokenDidChangeNotification:) + name:FBSDKAccessTokenDidChangeNotification + object:nil]; + [self _updateCache]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Public API + +- (BOOL)recipientsAreFrictionless:(id)recipients +{ + if (!recipients) { + return NO; + } + NSArray *recipientIDArray = [FBSDKTypeUtility arrayValue:recipients]; + if (!recipientIDArray && [recipients isKindOfClass:[NSString class]]) { + recipientIDArray = [recipients componentsSeparatedByString:@","]; + } + NSSet *recipientIDs = [[NSSet alloc] initWithArray:recipientIDArray]; + return [recipientIDs isSubsetOfSet:_recipientIDs]; +} + +- (void)updateWithResults:(NSDictionary *)results +{ + if ([FBSDKTypeUtility boolValue:results[@"updated_frictionless"]]) { + [self _updateCache]; + } +} + +#pragma mark - Helper Methods + +- (void)_accessTokenDidChangeNotification:(NSNotification *)notification +{ + if (![notification.userInfo[FBSDKAccessTokenDidChangeUserID] boolValue]) { + return; + } + _recipientIDs = nil; + [self _updateCache]; +} + +- (void)_updateCache +{ + if (![FBSDKAccessToken currentAccessToken]) { + _recipientIDs = nil; + } + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/apprequestformerrecipients" + parameters:@{@"fields":@""} + flags:(FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | + FBSDKGraphRequestFlagDisableErrorRecovery)]; + [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { + if (!error) { + NSArray *items = [FBSDKTypeUtility arrayValue:result[@"data"]]; + NSArray *recipientIDs = [items valueForKey:@"recipient_id"]; + _recipientIDs = [[NSSet alloc] initWithArray:recipientIDs]; + } + }]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h new file mode 100644 index 0000000..234c8d6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h @@ -0,0 +1,48 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +#import + +#import + +FBSDK_EXTERN NSString *const FBSDKLikeActionControllerDidDisableNotification; +FBSDK_EXTERN NSString *const FBSDKLikeActionControllerDidResetNotification; +FBSDK_EXTERN NSString *const FBSDKLikeActionControllerDidUpdateNotification; +FBSDK_EXTERN NSString *const FBSDKLikeActionControllerAnimatedKey; + +@interface FBSDKLikeActionController : NSObject + ++ (BOOL)isDisabled; + +// this method will call beginContentAccess before returning the instance ++ (instancetype)likeActionControllerForObjectID:(NSString *)objectID objectType:(FBSDKLikeObjectType)objectType; + +@property (nonatomic, copy, readonly) NSDate *lastUpdateTime; +@property (nonatomic, copy, readonly) NSString *likeCountString; +@property (nonatomic, copy, readonly) NSString *objectID; +@property (nonatomic, assign, readonly) FBSDKLikeObjectType objectType; +@property (nonatomic, assign, readonly) BOOL objectIsLiked; +@property (nonatomic, copy, readonly) NSString *socialSentence; + +- (void)refresh; +- (void)toggleLikeWithSoundEnabled:(BOOL)soundEnabled analyticsParameters:(NSDictionary *)analyticsParameters fromViewController:(UIViewController *)fromViewController; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m new file mode 100644 index 0000000..e57d9d0 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m @@ -0,0 +1,1062 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeActionController.h" + +#import + +#import + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKLikeActionControllerCache.h" +#import "FBSDKLikeButtonPopWAV.h" +#import "FBSDKLikeDialog.h" + +NSString *const FBSDKLikeActionControllerDidDisableNotification = @"FBSDKLikeActionControllerDidDisableNotification"; +NSString *const FBSDKLikeActionControllerDidResetNotification = @"FBSDKLikeActionControllerDidResetNotification"; +NSString *const FBSDKLikeActionControllerDidUpdateNotification = @"FBSDKLikeActionControllerDidUpdateNotification"; +NSString *const FBSDKLikeActionControllerAnimatedKey = @"animated"; + +#define FBSDK_LIKE_ACTION_CONTROLLER_ANIMATION_DELAY 0.5 +#define FBSDK_LIKE_ACTION_CONTROLLER_SOUND_DELAY 0.15 +#define FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION @"v2.1" + +#define FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY @"like" +#define FBSDK_LIKE_ACTION_CONTROLLER_REFRESH_PROPERTY_KEY @"refresh" + +#define FBSDK_LIKE_ACTION_CONTROLLER_LAST_UPDATE_TIME_KEY @"lastUpdateTime" +#define FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITH_LIKE_KEY @"likeCountStringWithLike" +#define FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITHOUT_LIKE_KEY @"likeCountStringWithoutLike" +#define FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_ID_KEY @"objectID" +#define FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_IS_LIKED_KEY @"objectIsLiked" +#define FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_TYPE_KEY @"objectType" +#define FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITH_LIKE_KEY @"socialSentenceWithLike" +#define FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITHOUT_LIKE_KEY @"socialSentenceWithoutLike" +#define FBSDK_LIKE_ACTION_CONTROLLER_UNLIKE_TOKEN_KEY @"unlikeToken" +#define FBSDK_LIKE_ACTION_CONTROLLER_VERSION_KEY @"version" + +#define FBSDK_LIKE_ACTION_CONTROLLER_VERSION 4 + +typedef NS_ENUM(NSUInteger, FBSDKLikeActionControllerRefreshMode) +{ + FBSDKLikeActionControllerRefreshModeInitial, + FBSDKLikeActionControllerRefreshModeForce, +}; + +typedef NS_ENUM(NSUInteger, FBSDKLikeActionControllerRefreshState) +{ + FBSDKLikeActionControllerRefreshStateNone, + FBSDKLikeActionControllerRefreshStateActive, + FBSDKLikeActionControllerRefreshStateComplete, +}; + +typedef void(^fbsdk_like_action_block)(FBSDKTriStateBOOL objectIsLiked, + NSString *likeCountStringWithLike, + NSString *likeCountStringWithoutLike, + NSString *socialSentenceWithLike, + NSString *socialSentenceWithoutLike, + NSString *unlikeToken, + BOOL likeStateChanged, + BOOL animated); + +typedef void(^fbsdk_like_action_controller_ensure_verified_object_id_completion_block)(NSString *verifiedObjectID); + +@interface FBSDKLikeActionController () +@end + +@implementation FBSDKLikeActionController +{ + FBSDKAccessToken *_accessToken; + NSUInteger _contentAccessCount; + BOOL _contentDiscarded; + NSMapTable *_dialogToAnalyticsParametersMap; + NSMapTable *_dialogToUpdateBlockMap; + NSString *_likeCountStringWithLike; + NSString *_likeCountStringWithoutLike; + BOOL _objectIsLikedIsPending; + BOOL _objectIsLikedOnServer; + BOOL _objectIsPage; + FBSDKLikeActionControllerRefreshState _refreshState; + NSString *_socialSentenceWithLike; + NSString *_socialSentenceWithoutLike; + NSString *_unlikeToken; + NSString *_verifiedObjectID; +} + +#pragma mark - Class Methods + +static BOOL _fbsdkLikeActionControllerDisabled = NO; + ++ (BOOL)isDisabled +{ + return _fbsdkLikeActionControllerDisabled; +} + +static FBSDKLikeActionControllerCache *_cache = nil; + ++ (void)initialize +{ + if (self == [FBSDKLikeActionController class]) { + NSString *accessTokenString = [FBSDKAccessToken currentAccessToken].tokenString; + if (accessTokenString) { + NSURL *fileURL = [self _cacheFileURL]; + NSData *data = [[NSData alloc] initWithContentsOfURL:fileURL]; + if (data) { + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; + unarchiver.requiresSecureCoding = YES; + @try { + _cache = [unarchiver decodeObjectOfClass:[FBSDKLikeActionControllerCache class] + forKey:NSKeyedArchiveRootObjectKey]; + } + @catch (NSException *ex) { + // ignore decoding exceptions from previous versions of the archive, etc + } + if (![_cache.accessTokenString isEqualToString:accessTokenString]) { + _cache = nil; + } + } + } + if (!_cache) { + _cache = [[FBSDKLikeActionControllerCache alloc] initWithAccessTokenString:accessTokenString]; + } + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(_accessTokenDidChangeNotification:) + name:FBSDKAccessTokenDidChangeNotification + object:nil]; + [nc addObserver:self + selector:@selector(_applicationWillResignActiveNotification:) + name:UIApplicationWillResignActiveNotification + object:nil]; + } +} + ++ (void)_accessTokenDidChangeNotification:(NSNotification *)notification +{ + NSString *accessTokenString = [FBSDKAccessToken currentAccessToken].tokenString; + if ([accessTokenString isEqualToString:_cache.accessTokenString]) { + return; + } + [_cache resetForAccessTokenString:accessTokenString]; + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKLikeActionControllerDidResetNotification object:nil]; +} + ++ (void)_applicationWillResignActiveNotification:(NSNotification *)notification +{ + NSURL *fileURL = [self _cacheFileURL]; + if (!fileURL) { + return; + } + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_cache]; + if (data) { + [data writeToURL:fileURL atomically:YES]; + } else { + [[[NSFileManager alloc] init] removeItemAtURL:fileURL error:NULL]; + } +} + ++ (NSURL *)_cacheFileURL +{ + NSURL *directoryURL = [[[NSFileManager alloc] init] URLForDirectory:NSLibraryDirectory + inDomain:NSUserDomainMask + appropriateForURL:nil + create:YES + error:NULL]; + return [directoryURL URLByAppendingPathComponent:@"com-facebook-sdk-like-data"]; +} + + ++ (instancetype)likeActionControllerForObjectID:(NSString *)objectID objectType:(FBSDKLikeObjectType)objectType +{ + if (!objectID) { + return nil; + } + @synchronized(self) { + FBSDKLikeActionController *controller = _cache[objectID]; + FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; + if (controller) { + [controller beginContentAccess]; + } else { + controller = [[self alloc] initWithObjectID:objectID objectType:objectType accessToken:accessToken]; + _cache[objectID] = controller; + } + [controller _refreshWithMode:FBSDKLikeActionControllerRefreshModeInitial]; + return controller; + } +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithObjectID:(NSString *)objectID + objectType:(FBSDKLikeObjectType)objectType + accessToken:(FBSDKAccessToken *)accessToken +{ + if ((self = [super init])) { + _objectID = [objectID copy]; + _objectType = objectType; + _accessToken = [accessToken copy]; + + [self _configure]; + } + return self; +} + +- (instancetype)init +{ + return [self initWithObjectID:nil objectType:FBSDKLikeObjectTypeUnknown accessToken:nil]; +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)decoder +{ + if ([decoder decodeIntegerForKey:FBSDK_LIKE_ACTION_CONTROLLER_VERSION_KEY] != FBSDK_LIKE_ACTION_CONTROLLER_VERSION) { + return nil; + } + + NSString *objectID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_ID_KEY]; + if (!objectID) { + return nil; + } + + if ((self = [super init])) { + _objectID = [objectID copy]; + _accessToken = [FBSDKAccessToken currentAccessToken]; + + _lastUpdateTime = [[decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_LIKE_ACTION_CONTROLLER_LAST_UPDATE_TIME_KEY] copy]; + _likeCountStringWithLike = [[decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITH_LIKE_KEY] copy]; + _likeCountStringWithoutLike = [[decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITHOUT_LIKE_KEY] copy]; + _objectIsLiked = [decoder decodeBoolForKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_IS_LIKED_KEY]; + _objectType = [decoder decodeIntegerForKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_TYPE_KEY]; + _socialSentenceWithLike = [[decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITH_LIKE_KEY] copy]; + _socialSentenceWithoutLike = [[decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITHOUT_LIKE_KEY] copy]; + _unlikeToken = [[decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_LIKE_ACTION_CONTROLLER_UNLIKE_TOKEN_KEY] copy]; + + [self _configure]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + [coder encodeObject:_lastUpdateTime forKey:FBSDK_LIKE_ACTION_CONTROLLER_LAST_UPDATE_TIME_KEY]; + [coder encodeObject:_likeCountStringWithLike forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITH_LIKE_KEY]; + [coder encodeObject:_likeCountStringWithoutLike + forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITHOUT_LIKE_KEY]; + [coder encodeObject:_objectID forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_ID_KEY]; + [coder encodeBool:_objectIsLiked forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_IS_LIKED_KEY]; + [coder encodeInteger:_objectType forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_TYPE_KEY]; + [coder encodeObject:_socialSentenceWithLike forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITH_LIKE_KEY]; + [coder encodeObject:_socialSentenceWithoutLike forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITHOUT_LIKE_KEY]; + [coder encodeObject:_unlikeToken forKey:FBSDK_LIKE_ACTION_CONTROLLER_UNLIKE_TOKEN_KEY]; + [coder encodeInteger:FBSDK_LIKE_ACTION_CONTROLLER_VERSION forKey:FBSDK_LIKE_ACTION_CONTROLLER_VERSION_KEY]; +} + +#pragma mark - Properties + +- (NSString *)likeCountString +{ + return (_objectIsLiked ? _likeCountStringWithLike : _likeCountStringWithoutLike); +} + +- (NSString *)socialSentence +{ + return (_objectIsLiked ? _socialSentenceWithLike : _socialSentenceWithoutLike); +} + +#pragma mark - Public API + +- (void)refresh +{ + [self _refreshWithMode:FBSDKLikeActionControllerRefreshModeForce]; +} + +- (void)toggleLikeWithSoundEnabled:(BOOL)soundEnabled analyticsParameters:(NSDictionary *)analyticsParameters fromViewController:(UIViewController *)fromViewController +{ + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidTap + valueToSum:nil + parameters:analyticsParameters + accessToken:_accessToken]; + + [self _setExecuting:YES forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; + + BOOL useOGLike = [self _useOGLike]; + BOOL deferred = !useOGLike; + + fbsdk_like_action_block updateBlock = ^(FBSDKTriStateBOOL objectIsLiked, + NSString *likeCountStringWithLike, + NSString *likeCountStringWithoutLike, + NSString *socialSentenceWithLike, + NSString *socialSentenceWithoutLike, + NSString *unlikeToken, + BOOL likeStateChanged, + BOOL animated){ + [self _updateWithObjectIsLiked:objectIsLiked + likeCountStringWithLike:likeCountStringWithLike + likeCountStringWithoutLike:likeCountStringWithoutLike + socialSentenceWithLike:socialSentenceWithLike + socialSentenceWithoutLike:socialSentenceWithoutLike + unlikeToken:unlikeToken + soundEnabled:soundEnabled && likeStateChanged + animated:animated && likeStateChanged + deferred:deferred]; + }; + + BOOL objectIsLiked = !_objectIsLiked; + + // optimistically update if using og.like (FAS will defer the update) + if (useOGLike) { + updateBlock(FBSDKTriStateBOOLFromBOOL(objectIsLiked), + _likeCountStringWithLike, + _likeCountStringWithoutLike, + _socialSentenceWithLike, + _socialSentenceWithoutLike, + _unlikeToken, + YES, + YES); + if (_objectIsLikedIsPending) { + return; + } + } + + if (objectIsLiked) { + if (useOGLike) { + [self _publishLikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } else { + [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } + } else { + if (useOGLike && _unlikeToken) { + [self _publishUnlikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } else { + [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } + } +} + +#pragma mark - NSDiscardableContent + +- (BOOL)beginContentAccess +{ + _contentDiscarded = NO; + _contentAccessCount++; + return YES; +} + +- (void)endContentAccess +{ + _contentAccessCount--; +} + +- (void)discardContentIfPossible +{ + if (_contentAccessCount == 0) { + _contentDiscarded = YES; + } +} + +- (BOOL)isContentDiscarded +{ + return _contentDiscarded; +} + +#pragma mark - FBSDKLikeDialogDelegate + +- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didCompleteWithResults:(NSDictionary *)results +{ + FBSDKTriStateBOOL objectIsLiked = FBSDKTriStateBOOLFromNSNumber(results[@"object_is_liked"]); + NSString *likeCountString = [FBSDKTypeUtility stringValue:results[@"like_count_string"]]; + NSString *socialSentence = [FBSDKTypeUtility stringValue:results[@"social_sentence"]]; + NSString *unlikeToken = [FBSDKTypeUtility stringValue:results[@"unlike_token"]]; + BOOL likeStateChanged = ![[FBSDKTypeUtility stringValue:results[@"completionGesture"]] isEqualToString:@"cancel"]; + + fbsdk_like_action_block updateBlock = [_dialogToUpdateBlockMap objectForKey:likeDialog]; + if (updateBlock != NULL) { + // we do not need to specify values for with/without like, since we will fast-app-switch to change + // the value + updateBlock(objectIsLiked, + likeCountString, + likeCountString, + socialSentence, + socialSentence, + unlikeToken, + likeStateChanged, + YES); + } + [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; +} + +- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didFailWithError:(NSError *)error +{ + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors + formatString:@"Like dialog error for %@(%@): %@", _objectID, NSStringFromFBSDKLikeObjectType(_objectType), error]; + + if ([error.userInfo[@"error_reason"] isEqualToString:@"dialog_disabled"]) { + _fbsdkLikeActionControllerDisabled = YES; + + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidDisable + valueToSum:nil + parameters:[_dialogToAnalyticsParametersMap objectForKey:likeDialog] + accessToken:_accessToken]; + + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKLikeActionControllerDidDisableNotification + object:self + userInfo:nil]; + } else { + FBSDKLikeActionControllerLogError(@"present_dialog", _objectID, _objectType, _accessToken, error); + } + [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; +} + +#pragma mark - Helper Methods + +- (void)_configure +{ + NSPointerFunctionsOptions keyOptions = (NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality); + NSPointerFunctionsOptions valueOptions = (NSPointerFunctionsStrongMemory | + NSPointerFunctionsObjectPersonality | + NSPointerFunctionsCopyIn); + _dialogToAnalyticsParametersMap = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0]; + _dialogToUpdateBlockMap = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0]; + + _contentAccessCount = 1; +} + +static void FBSDKLikeActionControllerLogError(NSString *currentAction, + NSString *objectID, + FBSDKLikeObjectType objectType, + FBSDKAccessToken *accessToken, + NSError *error) +{ + NSDictionary *parameters = @{ + @"object_id": objectID, + @"object_type": NSStringFromFBSDKLikeObjectType(objectType), + @"current_action": currentAction, + @"error": [error description] ?: @"", + }; + NSString *eventName = ([FBSDKError errorIsNetworkError:error] ? + FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable : + FBSDKAppEventNameFBSDKLikeControlError); + [FBSDKAppEvents logImplicitEvent:eventName + valueToSum:nil + parameters:parameters + accessToken:accessToken]; +} + +typedef void(^fbsdk_like_action_controller_get_engagement_completion_block)(BOOL success, + NSString *likeCountStringWithLike, + NSString *likeCountStringWithoutLike, + NSString *socialSentenceWithLike, + NSString *socialSentenceWithoutLike); +static void FBSDKLikeActionControllerAddGetEngagementRequest(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *objectID, + FBSDKLikeObjectType objectType, + fbsdk_like_action_controller_get_engagement_completion_block completionHandler) +{ + if (completionHandler == NULL) { + return; + } + NSString *fields = @"engagement.fields(count_string_with_like,count_string_without_like,social_sentence_with_like," + @"social_sentence_without_like)"; + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:objectID + parameters:@{ @"fields": fields } + tokenString:accessToken.tokenString + HTTPMethod:@"GET" + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + BOOL success = NO; + NSString *likeCountStringWithLike = nil; + NSString *likeCountStringWithoutLike = nil; + NSString *socialSentenceWithLike = nil; + NSString *socialSentenceWithoutLike = nil; + if (error) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors + formatString:@"Error fetching engagement for %@ (%@): %@", + objectID, + NSStringFromFBSDKLikeObjectType(objectType), + error]; + FBSDKLikeActionControllerLogError(@"get_engagement", objectID, objectType, accessToken, error); + } else { + success = YES; + result = [FBSDKTypeUtility dictionaryValue:result]; + likeCountStringWithLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.count_string_with_like"]]; + likeCountStringWithoutLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.count_string_without_like"]]; + socialSentenceWithLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.social_sentence_with_like"]]; + socialSentenceWithoutLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.social_sentence_without_like"]]; + } + completionHandler(success, + likeCountStringWithLike, + likeCountStringWithoutLike, + socialSentenceWithLike, + socialSentenceWithoutLike); + }]; +} + +typedef void(^fbsdk_like_action_controller_get_object_id_completion_block)(BOOL success, + NSString *verifiedObjectID, + BOOL objectIsPage); +static void FBSDKLikeActionControllerAddGetObjectIDRequest(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *objectID, + fbsdk_like_action_controller_get_object_id_completion_block completionHandler) +{ + if (completionHandler == NULL) { + return; + } + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"" + parameters:@{ + @"fields": @"id", + @"id": objectID, + @"metadata": @"1", + @"type": @"og", + } + tokenString:accessToken.tokenString + HTTPMethod:@"GET" + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + + [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + result = [FBSDKTypeUtility dictionaryValue:result]; + NSString *verifiedObjectID = [FBSDKTypeUtility stringValue:result[@"id"]]; + BOOL objectIsPage = [FBSDKTypeUtility boolValue:[result valueForKeyPath:@"metadata.type"]]; + completionHandler(verifiedObjectID != nil, verifiedObjectID, objectIsPage); + }]; +} + +static void FBSDKLikeActionControllerAddGetObjectIDWithObjectURLRequest(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *objectID, + fbsdk_like_action_controller_get_object_id_completion_block completionHandler) +{ + if (completionHandler == NULL) { + return; + } + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"" + parameters:@{ + @"fields": @"og_object.fields(id)", + @"id": objectID, + } + tokenString:accessToken.tokenString + HTTPMethod:@"GET" + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + result = [FBSDKTypeUtility dictionaryValue:result]; + NSString *verifiedObjectID = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"og_object.id"]]; + completionHandler(verifiedObjectID != nil, verifiedObjectID, NO); + }]; +} + +typedef void(^fbsdk_like_action_controller_get_og_object_like_completion_block)(BOOL success, + FBSDKTriStateBOOL objectIsLiked, + NSString *unlikeToken); +static void FBSDKLikeActionControllerAddGetOGObjectLikeRequest(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *objectID, + FBSDKLikeObjectType objectType, + fbsdk_like_action_controller_get_og_object_like_completion_block completionHandler) +{ + if (completionHandler == NULL) { + return; + } + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/og.likes" + parameters:@{ + @"fields": @"id,application", + @"object": objectID, + } + tokenString:accessToken.tokenString + HTTPMethod:@"GET" + flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; + + [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + BOOL success = NO; + FBSDKTriStateBOOL objectIsLiked = FBSDKTriStateBOOLValueUnknown; + NSString *unlikeToken = nil; + if (error) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors + formatString:@"Error fetching like state for %@(%@): %@", objectID, NSStringFromFBSDKLikeObjectType(objectType), error]; + FBSDKLikeActionControllerLogError(@"get_og_object_like", objectID, objectType, accessToken, error); + } else { + success = YES; + result = [FBSDKTypeUtility dictionaryValue:result]; + NSArray *dataSet = [FBSDKTypeUtility arrayValue:result[@"data"]]; + for (NSDictionary *data in dataSet) { + objectIsLiked = FBSDKTriStateBOOLValueYES; + NSString *applicationID = [FBSDKTypeUtility stringValue:[data valueForKeyPath:@"application.id"]]; + if ([accessToken.appID isEqualToString:applicationID]) { + unlikeToken = [FBSDKTypeUtility stringValue:data[@"id"]]; + break; + } + } + } + completionHandler(success, objectIsLiked, unlikeToken); + }]; +} + +typedef void(^fbsdk_like_action_controller_publish_like_completion_block)(BOOL success, NSString *unlikeToken); +static void FBSDKLikeActionControllerAddPublishLikeRequest(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *objectID, + FBSDKLikeObjectType objectType, + fbsdk_like_action_controller_publish_like_completion_block completionHandler) +{ + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/og.likes" + parameters:@{ @"object": objectID } + tokenString:accessToken.tokenString + version:nil + HTTPMethod:@"POST"]; + [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + BOOL success = NO; + NSString *unlikeToken = nil; + if (error) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors + formatString:@"Error liking object %@(%@): %@", objectID, NSStringFromFBSDKLikeObjectType(objectType), error]; + FBSDKLikeActionControllerLogError(@"publish_like", objectID, objectType, accessToken, error); + } else { + success = YES; + result = [FBSDKTypeUtility dictionaryValue:result]; + unlikeToken = [FBSDKTypeUtility stringValue:result[@"id"]]; + } + if (completionHandler != NULL) { + completionHandler(success, unlikeToken); + } + }]; +} + +typedef void(^fbsdk_like_action_controller_publish_unlike_completion_block)(BOOL success); +static void FBSDKLikeActionControllerAddPublishUnlikeRequest(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *unlikeToken, + FBSDKLikeObjectType objectType, + fbsdk_like_action_controller_publish_unlike_completion_block completionHandler) +{ + FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:unlikeToken + parameters:nil + tokenString:accessToken.tokenString + version:nil + HTTPMethod:@"DELETE"]; + [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { + BOOL success = NO; + if (error) { + [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors + formatString:@"Error unliking object with unlike token %@(%@): %@", unlikeToken, NSStringFromFBSDKLikeObjectType(objectType), error]; + FBSDKLikeActionControllerLogError(@"publish_unlike", unlikeToken, objectType, accessToken, error); + } else { + success = YES; + } + if (completionHandler != NULL) { + completionHandler(success); + } + }]; +} + +static void FBSDKLikeActionControllerAddRefreshRequests(FBSDKAccessToken *accessToken, + FBSDKGraphRequestConnection *connection, + NSString *objectID, + FBSDKLikeObjectType objectType, + fbsdk_like_action_block completionHandler) +{ + if (completionHandler == NULL) { + return; + } + __block FBSDKTriStateBOOL objectIsLiked = FBSDKTriStateBOOLValueUnknown; + __block NSString *likeCountStringWithLike = nil; + __block NSString *likeCountStringWithoutLike = nil; + __block NSString *socialSentenceWithLike = nil; + __block NSString *socialSentenceWithoutLike = nil; + __block NSString *unlikeToken = nil; + + void(^handleResults)(void) = ^{ + completionHandler(objectIsLiked, + likeCountStringWithLike, + likeCountStringWithoutLike, + socialSentenceWithLike, + socialSentenceWithoutLike, + unlikeToken, + NO, + NO); + }; + + fbsdk_like_action_controller_get_og_object_like_completion_block getLikeStateCompletionBlock = ^(BOOL success, + FBSDKTriStateBOOL innerObjectIsLiked, + NSString *innerUnlikeToken) { + if (success) { + objectIsLiked = innerObjectIsLiked; + if (innerUnlikeToken) { + unlikeToken = [innerUnlikeToken copy]; + } + } + }; + FBSDKLikeActionControllerAddGetOGObjectLikeRequest(accessToken, + connection, + objectID, + objectType, + getLikeStateCompletionBlock); + + fbsdk_like_action_controller_get_engagement_completion_block engagementCompletionBlock = ^(BOOL success, + NSString *innerLikeCountStringWithLike, + NSString *innerLikeCountStringWithoutLike, + NSString *innerSocialSentenceWithLike, + NSString *innerSocialSentenceWithoutLike) { + if (success) { + // Don't lose cached state if certain properties were not included + likeCountStringWithLike = [innerLikeCountStringWithLike copy]; + likeCountStringWithoutLike = [innerLikeCountStringWithoutLike copy]; + socialSentenceWithLike = [innerSocialSentenceWithLike copy]; + socialSentenceWithoutLike = [innerSocialSentenceWithoutLike copy]; + + handleResults(); + } + }; + FBSDKLikeActionControllerAddGetEngagementRequest(accessToken, + connection, + objectID, + objectType, + engagementCompletionBlock); +} + + +- (void)_ensureVerifiedObjectID:(fbsdk_like_action_controller_ensure_verified_object_id_completion_block)completion +{ + if (completion == NULL) { + return; + } + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; + if ([_objectID rangeOfString:@"://"].location != NSNotFound) { + FBSDKLikeActionControllerAddGetObjectIDWithObjectURLRequest(_accessToken, connection, _objectID, ^(BOOL success, + NSString *innerVerifiedObjectID, + BOOL innerObjectIsPage) { + if (success) { + _verifiedObjectID = [innerVerifiedObjectID copy]; + _objectIsPage = innerObjectIsPage; + } + }); + } + + FBSDKLikeActionControllerAddGetObjectIDRequest(_accessToken, connection, _objectID, ^(BOOL success, + NSString *innerVerifiedObjectID, + BOOL innerObjectIsPage) { + if (success) { + // if this was an URL based request, then we want to use the objectID from that request - this value will just + // be an echo of the URL + if (!_verifiedObjectID) { + _verifiedObjectID = [innerVerifiedObjectID copy]; + } + _objectIsPage = innerObjectIsPage; + } + if (_verifiedObjectID) { + completion(_verifiedObjectID); + } + }); + [connection start]; +} + +- (void)_presentLikeDialogWithUpdateBlock:(fbsdk_like_action_block)updateBlock + analyticsParameters:(NSDictionary *)analyticsParameters + fromViewController:(UIViewController *)fromViewController +{ + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidPresentDialog + valueToSum:nil + parameters:analyticsParameters + accessToken:_accessToken]; + FBSDKLikeDialog *dialog = [[FBSDKLikeDialog alloc] init]; + dialog.objectID = _objectID; + dialog.objectType = _objectType; + dialog.delegate = self; + dialog.fromViewController = fromViewController; + [_dialogToUpdateBlockMap setObject:updateBlock forKey:dialog]; + [_dialogToAnalyticsParametersMap setObject:analyticsParameters forKey:dialog]; + if (![dialog like]) { + [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; + } +} + +- (void)_publishIfNeededWithUpdateBlock:(fbsdk_like_action_block)updateBlock + analyticsParameters:(NSDictionary *)analyticsParameters + fromViewController:(UIViewController *)fromViewController +{ + BOOL objectIsLiked = _objectIsLiked; + if (_objectIsLikedOnServer != objectIsLiked) { + if (objectIsLiked) { + [self _publishLikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } else { + [self _publishUnlikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } + } +} + +- (void)_publishLikeWithUpdateBlock:(fbsdk_like_action_block)updateBlock + analyticsParameters:(NSDictionary *)analyticsParameters + fromViewController:(UIViewController *)fromViewController +{ + _objectIsLikedIsPending = YES; + [self _ensureVerifiedObjectID:^(NSString *verifiedObjectID) { + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; + fbsdk_like_action_controller_publish_like_completion_block completionHandler = ^(BOOL success, + NSString *unlikeToken) { + _objectIsLikedIsPending = NO; + if (success) { + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidLike + valueToSum:nil + parameters:analyticsParameters + accessToken:_accessToken]; + _objectIsLikedOnServer = YES; + _unlikeToken = [unlikeToken copy]; + if (updateBlock != NULL) { + updateBlock(FBSDKTriStateBOOLFromBOOL(self.objectIsLiked), + _likeCountStringWithLike, + _likeCountStringWithoutLike, + _socialSentenceWithLike, + _socialSentenceWithoutLike, + _unlikeToken, + NO, + NO); + } + [self _publishIfNeededWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } else { + [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } + }; + FBSDKLikeActionControllerAddPublishLikeRequest(_accessToken, + connection, + verifiedObjectID, + _objectType, + completionHandler); + [connection start]; + }]; +} + +- (void)_publishUnlikeWithUpdateBlock:(fbsdk_like_action_block)updateBlock + analyticsParameters:(NSDictionary *)analyticsParameters + fromViewController:(UIViewController *)fromViewController +{ + _objectIsLikedIsPending = YES; + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; + fbsdk_like_action_controller_publish_unlike_completion_block completionHandler = ^(BOOL success) { + _objectIsLikedIsPending = NO; + if (success) { + [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidUnlike + valueToSum:nil + parameters:analyticsParameters + accessToken:_accessToken]; + _objectIsLikedOnServer = NO; + _unlikeToken = nil; + if (updateBlock != NULL) { + updateBlock(FBSDKTriStateBOOLFromBOOL(self.objectIsLiked), + _likeCountStringWithLike, + _likeCountStringWithoutLike, + _socialSentenceWithLike, + _socialSentenceWithoutLike, + _unlikeToken, + NO, + NO); + } + [self _publishIfNeededWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } else { + [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; + } + }; + FBSDKLikeActionControllerAddPublishUnlikeRequest(_accessToken, + connection, + _unlikeToken, + _objectType, + completionHandler); + [connection start]; +} + +- (void)_refreshWithMode:(FBSDKLikeActionControllerRefreshMode)mode +{ + switch (mode) { + case FBSDKLikeActionControllerRefreshModeForce:{ + // if we're already refreshing, skip + if (_refreshState == FBSDKLikeActionControllerRefreshStateActive) { + return; + } + break; + } + case FBSDKLikeActionControllerRefreshModeInitial:{ + // if we've already started any refresh, skip this + if (_refreshState != FBSDKLikeActionControllerRefreshStateNone) { + return; + } + break; + } + } + + // You must be logged in to fetch the like status + if (!_accessToken) { + return; + } + + [self _setExecuting:YES forKey:FBSDK_LIKE_ACTION_CONTROLLER_REFRESH_PROPERTY_KEY]; + _refreshState = FBSDKLikeActionControllerRefreshStateActive; + + [self _ensureVerifiedObjectID:^(NSString *verifiedObjectID) { + FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; + [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; + FBSDKLikeActionControllerAddRefreshRequests(_accessToken, + connection, + verifiedObjectID, + _objectType, + ^(FBSDKTriStateBOOL objectIsLiked, + NSString *likeCountStringWithLike, + NSString *likeCountStringWithoutLike, + NSString *socialSentenceWithLike, + NSString *socialSentenceWithoutLike, + NSString *unlikeToken, + BOOL likeStateChanged, + BOOL animated) { + [self _updateWithObjectIsLiked:objectIsLiked + likeCountStringWithLike:likeCountStringWithLike + likeCountStringWithoutLike:likeCountStringWithoutLike + socialSentenceWithLike:socialSentenceWithLike + socialSentenceWithoutLike:socialSentenceWithoutLike + unlikeToken:unlikeToken + soundEnabled:NO + animated:NO + deferred:NO]; + [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_REFRESH_PROPERTY_KEY]; + _refreshState = FBSDKLikeActionControllerRefreshStateComplete; + }); + [connection start]; + }]; +} + +- (void)_setExecuting:(BOOL)executing forKey:(NSString *)key +{ + static NSMapTable *_executing = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _executing = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsCopyIn valueOptions:NSPointerFunctionsStrongMemory capacity:0]; + }); + + NSString *objectKey = [NSString stringWithFormat: + @"%@:%@:%@", + _objectID, + NSStringFromFBSDKLikeObjectType(_objectType), + key]; + if (executing) { + [self beginContentAccess]; + [_executing setObject:self forKey:objectKey]; + } else { + [_executing removeObjectForKey:objectKey]; + [self endContentAccess]; + } +} + +- (void)_updateWithObjectIsLiked:(FBSDKTriStateBOOL)objectIsLikedTriState + likeCountStringWithLike:(NSString *)likeCountStringWithLike + likeCountStringWithoutLike:(NSString *)likeCountStringWithoutLike + socialSentenceWithLike:(NSString *)socialSentenceWithLike + socialSentenceWithoutLike:(NSString *)socialSentenceWithoutLike + unlikeToken:(NSString *)unlikeToken + soundEnabled:(BOOL)soundEnabled + animated:(BOOL)animated + deferred:(BOOL)deferred +{ + if (objectIsLikedTriState != FBSDKTriStateBOOLValueUnknown) { + _lastUpdateTime = [NSDate date]; + } + + // This value will not be useable if objectIsLikedTriState is FBSDKTriStateBOOLValueUnknown + BOOL objectIsLiked = BOOLFromFBSDKTriStateBOOL(objectIsLikedTriState, NO); + + // So always check objectIsLikedChanged before using objectIsLiked. + // If the new like state is unknown, we don't consider the state to have changed. + BOOL objectIsLikedChanged = (objectIsLikedTriState != FBSDKTriStateBOOLValueUnknown) && (self.objectIsLiked != objectIsLiked); + + if (!objectIsLikedChanged && + [FBSDKInternalUtility object:_likeCountStringWithLike isEqualToObject:likeCountStringWithLike] && + [FBSDKInternalUtility object:_likeCountStringWithoutLike isEqualToObject:likeCountStringWithoutLike] && + [FBSDKInternalUtility object:_socialSentenceWithLike isEqualToObject:socialSentenceWithLike] && + [FBSDKInternalUtility object:_socialSentenceWithoutLike isEqualToObject:socialSentenceWithoutLike] && + [FBSDKInternalUtility object:_unlikeToken isEqualToObject:unlikeToken]) { + // check if the like state changed and only animate if it did + return; + } + + void(^updateBlock)(void) = ^{ + if (objectIsLikedChanged) { + _objectIsLiked = objectIsLiked; + } + + if (likeCountStringWithLike) { + _likeCountStringWithLike = [likeCountStringWithLike copy]; + } + if (likeCountStringWithoutLike) { + _likeCountStringWithoutLike = [likeCountStringWithoutLike copy]; + } + if (socialSentenceWithLike) { + _socialSentenceWithLike = [socialSentenceWithLike copy]; + } + if (socialSentenceWithoutLike) { + _socialSentenceWithoutLike = [socialSentenceWithoutLike copy]; + } + if (unlikeToken) { + _unlikeToken = [unlikeToken copy]; + } + + // if only meta data changed, don't play the sound + FBSDKLikeButtonPopWAV *likeSound = (objectIsLikedChanged && objectIsLiked && soundEnabled ? [FBSDKLikeButtonPopWAV sharedLoader] : nil); + + void(^notificationBlock)(void) = ^{ + if (likeSound) { + dispatch_time_t soundPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(FBSDK_LIKE_ACTION_CONTROLLER_SOUND_DELAY * NSEC_PER_SEC)); + dispatch_after(soundPopTime, dispatch_get_main_queue(), ^(void){ + [likeSound playSound]; + }); + } + NSDictionary *userInfo = @{FBSDKLikeActionControllerAnimatedKey: @(animated)}; + [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKLikeActionControllerDidUpdateNotification + object:self + userInfo:userInfo]; + }; + + notificationBlock(); + }; + + // if only meta data changed, don't defer + if (deferred && objectIsLikedChanged) { + double delayInSeconds = FBSDK_LIKE_ACTION_CONTROLLER_ANIMATION_DELAY; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), updateBlock); + } else { + updateBlock(); + } +} + +- (BOOL)_useOGLike +{ + return (_accessToken && + !_objectIsPage && + _verifiedObjectID && + [_accessToken.permissions containsObject:@"publish_actions"]); +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h new file mode 100644 index 0000000..e1f30c8 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +@interface FBSDKLikeActionControllerCache : NSObject + +- (instancetype)initWithAccessTokenString:(NSString *)accessTokenString NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, copy, readonly) NSString *accessTokenString; + +- (id)objectForKeyedSubscript:(id)key; +- (void)resetForAccessTokenString:(NSString *)accessTokenString; +- (void)setObject:(id)object forKeyedSubscript:(id)key; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m new file mode 100644 index 0000000..746e819 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m @@ -0,0 +1,116 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeActionControllerCache.h" + +#import + +#import "FBSDKLikeActionController.h" + +// after 1 day, expire the cached states +#define FBSDK_LIKE_ACTION_CONTROLLER_CACHE_TIMEOUT 60 * 24 + +#define FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ACCESS_TOKEN_KEY @"accessTokenString" +#define FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ITEMS_KEY @"items" + +@implementation FBSDKLikeActionControllerCache +{ + NSString *_accessTokenString; + NSMutableDictionary *_items; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithAccessTokenString:(NSString *)accessTokenString +{ + if ((self = [super init])) { + _accessTokenString = [accessTokenString copy]; + _items = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (instancetype)init +{ + FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAccessTokenString:); + return [self initWithAccessTokenString:nil]; +} + +#pragma mark - NSCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + NSString *accessTokenString = [decoder decodeObjectOfClass:[NSString class] + forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ACCESS_TOKEN_KEY]; + if ((self = [self initWithAccessTokenString:accessTokenString])) { + NSSet *allowedClasses = [NSSet setWithObjects:[NSDictionary class], [FBSDKLikeActionController class], nil]; + NSDictionary *items = [decoder decodeObjectOfClasses:allowedClasses + forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ITEMS_KEY]; + _items = [[NSMutableDictionary alloc] initWithDictionary:items]; + [self _prune]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:_accessTokenString forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ACCESS_TOKEN_KEY]; + [encoder encodeObject:_items forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ITEMS_KEY]; +} + +#pragma mark - Public Methods + +- (id)objectForKeyedSubscript:(id)key +{ + return _items[key]; +} + +- (void)resetForAccessTokenString:(NSString *)accessTokenString +{ + _accessTokenString = [accessTokenString copy]; + [_items removeAllObjects]; +} + +- (void)setObject:(id)object forKeyedSubscript:(id)key +{ + _items[key] = object; +} + +#pragma mark - Helper Methods + +- (void)_prune +{ + NSMutableArray *keysToRemove = [[NSMutableArray alloc] init]; + [_items enumerateKeysAndObjectsUsingBlock:^(NSString *objectID, + FBSDKLikeActionController *likeActionController, + BOOL *stop) { + NSDate *lastUpdateTime = likeActionController.lastUpdateTime; + if (!lastUpdateTime || + ([[NSDate date] timeIntervalSinceDate:lastUpdateTime] > FBSDK_LIKE_ACTION_CONTROLLER_CACHE_TIMEOUT)) { + [keysToRemove addObject:objectID]; + } + }]; + [_items removeObjectsForKeys:keysToRemove]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h new file mode 100644 index 0000000..8ad46b6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h @@ -0,0 +1,33 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKLikeBoxView.h" + +@interface FBSDKLikeBoxBorderView : UIView + +@property (nonatomic, assign) CGFloat borderCornerRadius; +@property (nonatomic, assign) CGFloat borderWidth; +@property (nonatomic, assign) FBSDKLikeBoxCaretPosition caretPosition; +@property (nonatomic, assign, readonly) UIEdgeInsets contentInsets; +@property (nonatomic, strong) UIView *contentView; +@property (nonatomic, strong) UIColor *fillColor; +@property (nonatomic, strong) UIColor *foregroundColor; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m new file mode 100644 index 0000000..71faf0f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m @@ -0,0 +1,323 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeBoxBorderView.h" + +#import "FBSDKCoreKit+Internal.h" + +#define FBSDK_LIKE_BOX_BORDER_CARET_WIDTH 6.0 +#define FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT 3.0 +#define FBSDK_LIKE_BOX_BORDER_CARET_PADDING 3.0 +#define FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING 4.0 + +@implementation FBSDKLikeBoxBorderView + +#pragma mark - Object Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + [self _initializeContent]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [super initWithCoder:decoder])) { + [self _initializeContent]; + } + return self; +} + +#pragma mark - Properties + +- (void)setBackgroundColor:(UIColor *)backgroundColor +{ + if (![self.backgroundColor isEqual:backgroundColor]) { + [super setBackgroundColor:backgroundColor]; + [self setNeedsDisplay]; + } +} + +- (void)setBorderCornerRadius:(CGFloat)borderCornerRadius +{ + if (_borderCornerRadius != borderCornerRadius) { + _borderCornerRadius = borderCornerRadius; + [self setNeedsDisplay]; + } +} + +- (void)setBorderWidth:(CGFloat)borderWidth +{ + if (_borderWidth != borderWidth) { + _borderWidth = borderWidth; + [self setNeedsDisplay]; + [self invalidateIntrinsicContentSize]; + } +} + +- (void)setCaretPosition:(FBSDKLikeBoxCaretPosition)caretPosition +{ + if (_caretPosition != caretPosition) { + _caretPosition = caretPosition; + [self setNeedsLayout]; + [self setNeedsDisplay]; + [self invalidateIntrinsicContentSize]; + } +} + +- (UIEdgeInsets)contentInsets +{ + UIEdgeInsets borderInsets = [self _borderInsets]; + return UIEdgeInsetsMake(borderInsets.top + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING, + borderInsets.left + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING, + borderInsets.bottom + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING, + borderInsets.right + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING); +} + +- (void)setContentView:(UIView *)contentView +{ + if (_contentView != contentView) { + [_contentView removeFromSuperview]; + _contentView = contentView; + [self addSubview:_contentView]; + [self setNeedsLayout]; + [self invalidateIntrinsicContentSize]; + } +} + +- (void)setFillColor:(UIColor *)fillColor +{ + if (![_fillColor isEqual:fillColor]) { + _fillColor = fillColor; + [self setNeedsDisplay]; + } +} + +- (void)setForegroundColor:(UIColor *)foregroundColor +{ + if (![_foregroundColor isEqual:foregroundColor]) { + _foregroundColor = foregroundColor; + [self setNeedsDisplay]; + } +} + +#pragma mark - Layout + +- (CGSize)intrinsicContentSize +{ + return FBSDKEdgeInsetsOutsetSize(self.contentView.intrinsicContentSize, self.contentInsets); +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + self.contentView.frame = UIEdgeInsetsInsetRect(self.bounds, self.contentInsets); +} + +- (CGSize)sizeThatFits:(CGSize)size +{ + UIEdgeInsets contentInsets = self.contentInsets; + size = FBSDKEdgeInsetsInsetSize(size, contentInsets); + size = [self.contentView sizeThatFits:size]; + size = FBSDKEdgeInsetsOutsetSize(size, contentInsets); + return size; +} + +#pragma mark - Drawing + +- (void)drawRect:(CGRect)rect +{ + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSaveGState(context); + + // read the configuration properties + CGRect bounds = self.bounds; + CGFloat borderWidth = self.borderWidth; + CGFloat borderCornerRadius = self.borderCornerRadius; + CGFloat contentScaleFactor = self.contentScaleFactor; + + // fill the background + if (self.backgroundColor) { + [self.backgroundColor setFill]; + CGContextFillRect(context, bounds); + } + + // configure the colors and lines + [self.fillColor setFill]; + [self.foregroundColor setStroke]; + CGContextSetLineJoin(context, kCGLineJoinRound); + CGContextSetLineWidth(context, borderWidth); + + // get the frame of the box + CGRect borderFrame = UIEdgeInsetsInsetRect(bounds, [self _borderInsets]); + + // define the arcs for the corners + const int start = 0; + const int tangent = 1; + const int end = 2; + CGPoint topLeftArc[3] = { + CGPointMake(CGRectGetMinX(borderFrame) + borderCornerRadius, CGRectGetMinY(borderFrame)), + CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMinY(borderFrame)), + CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMinY(borderFrame) + borderCornerRadius), + }; + CGPoint bottomLeftArc[3] = { + CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMaxY(borderFrame) - borderCornerRadius), + CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMaxY(borderFrame)), + CGPointMake(CGRectGetMinX(borderFrame) + borderCornerRadius, CGRectGetMaxY(borderFrame)), + }; + CGPoint bottomRightArc[3] = { + CGPointMake(CGRectGetMaxX(borderFrame) - borderCornerRadius, CGRectGetMaxY(borderFrame)), + CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMaxY(borderFrame)), + CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMaxY(borderFrame) - borderCornerRadius), + }; + CGPoint topRightArc[3] = { + CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMinY(borderFrame) + borderCornerRadius), + CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMinY(borderFrame)), + CGPointMake(CGRectGetMaxX(borderFrame) - borderCornerRadius, CGRectGetMinY(borderFrame)), + }; + + // start a path on the context + CGContextBeginPath(context); + + // position the caret and decide which lines to draw + CGPoint caretPoints[3]; + switch (self.caretPosition) { + case FBSDKLikeBoxCaretPositionTop: + CGContextMoveToPoint(context, topRightArc[end].x, topRightArc[end].y); + caretPoints[0] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), + CGRectGetMinY(borderFrame)); + caretPoints[1] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame)), + CGRectGetMinY(borderFrame) - FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT); + caretPoints[2] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), + CGRectGetMinY(borderFrame)); + CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); + CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, bottomLeftArc[start].x, bottomLeftArc[start].y); + CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, bottomRightArc[start].x, bottomRightArc[start].y); + CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, topRightArc[start].x, topRightArc[start].y); + CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); + break; + case FBSDKLikeBoxCaretPositionLeft: + CGContextMoveToPoint(context, topLeftArc[end].x, topLeftArc[end].y); + caretPoints[0] = CGPointMake(CGRectGetMinX(borderFrame), + FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); + caretPoints[1] = CGPointMake(CGRectGetMinX(borderFrame) - FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT, + FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame))); + caretPoints[2] = CGPointMake(CGRectGetMinX(borderFrame), + FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); + CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); + CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, bottomRightArc[start].x, bottomRightArc[start].y); + CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, topRightArc[start].x, topRightArc[start].y); + CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, topLeftArc[start].x, topLeftArc[start].y); + CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); + break; + case FBSDKLikeBoxCaretPositionBottom: + CGContextMoveToPoint(context, bottomLeftArc[end].x, bottomLeftArc[end].y); + caretPoints[0] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), + CGRectGetMaxY(borderFrame)); + caretPoints[1] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame)), + CGRectGetMaxY(borderFrame) + FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT); + caretPoints[2] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), + CGRectGetMaxY(borderFrame)); + CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); + CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, topRightArc[start].x, topRightArc[start].y); + CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, topLeftArc[start].x, topLeftArc[start].y); + CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, bottomLeftArc[start].x, bottomLeftArc[start].y); + CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); + break; + case FBSDKLikeBoxCaretPositionRight: + CGContextMoveToPoint(context, bottomRightArc[end].x, bottomRightArc[end].y); + caretPoints[0] = CGPointMake(CGRectGetMaxX(borderFrame), + FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); + caretPoints[1] = CGPointMake(CGRectGetMaxX(borderFrame) + FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT, + FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame))); + caretPoints[2] = CGPointMake(CGRectGetMaxX(borderFrame), + FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); + CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); + CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, topLeftArc[start].x, topLeftArc[start].y); + CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, bottomLeftArc[start].x, bottomLeftArc[start].y); + CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); + CGContextAddLineToPoint(context, bottomRightArc[start].x, bottomRightArc[start].y); + CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); + break; + } + + // close and draw now that we have it all + CGContextClosePath(context); + CGContextDrawPath(context, kCGPathFillStroke); + + CGContextRestoreGState(context); +} + +#pragma mark - Helper Methods + +- (UIEdgeInsets)_borderInsets +{ + // inset the border bounds by 1/2 of the border width, since it is drawn split between inside and outside of the path + CGFloat scale = self.contentScaleFactor; + CGFloat halfBorderWidth = FBSDKPointsForScreenPixels(ceilf, scale, self.borderWidth / 2); + UIEdgeInsets borderInsets = UIEdgeInsetsMake(halfBorderWidth, halfBorderWidth, halfBorderWidth, halfBorderWidth); + + // adjust the insets for the caret position + switch (self.caretPosition) { + case FBSDKLikeBoxCaretPositionTop:{ + borderInsets.top += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; + break; + } + case FBSDKLikeBoxCaretPositionLeft:{ + borderInsets.left += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; + break; + } + case FBSDKLikeBoxCaretPositionBottom:{ + borderInsets.bottom += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; + break; + } + case FBSDKLikeBoxCaretPositionRight:{ + borderInsets.right += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; + break; + } + } + + return borderInsets; +} + +- (void)_initializeContent +{ + self.backgroundColor = [UIColor clearColor]; + self.borderCornerRadius = 3.0; + self.borderWidth = 1.0; + self.contentMode = UIViewContentModeRedraw; + self.fillColor = [UIColor whiteColor]; + self.foregroundColor = FBSDKUIColorWithRGB(0x6A, 0x71, 0x80); + self.opaque = NO; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h new file mode 100644 index 0000000..49b3756 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h @@ -0,0 +1,43 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKLikeBoxCaretPosition) + + @abstract Specifies the position of the caret relative to the box. + */ +typedef NS_ENUM(NSUInteger, FBSDKLikeBoxCaretPosition) +{ + /*! The caret is on the top of the box. */ + FBSDKLikeBoxCaretPositionTop, + /*! The caret is on the left of the box. */ + FBSDKLikeBoxCaretPositionLeft, + /*! The caret is on the bottom of the box. */ + FBSDKLikeBoxCaretPositionBottom, + /*! The caret is on the right of the box. */ + FBSDKLikeBoxCaretPositionRight, +}; + +@interface FBSDKLikeBoxView : UIView + +@property (nonatomic, assign) FBSDKLikeBoxCaretPosition caretPosition; +@property (nonatomic, copy) NSString *text; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m new file mode 100644 index 0000000..e0afeac --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m @@ -0,0 +1,108 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeBoxView.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKLikeBoxBorderView.h" + +@implementation FBSDKLikeBoxView +{ + FBSDKLikeBoxBorderView *_borderView; + UILabel *_likeCountLabel; +} + +#pragma mark - Object Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + [self _initializeContent]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder +{ + if ((self = [super initWithCoder:decoder])) { + [self _initializeContent]; + } + return self; +} + +#pragma mark - Properties + +- (void)setCaretPosition:(FBSDKLikeBoxCaretPosition)caretPosition +{ + if (_caretPosition != caretPosition) { + _caretPosition = caretPosition; + _borderView.caretPosition = _caretPosition; + [self setNeedsLayout]; + [self invalidateIntrinsicContentSize]; + } +} + +- (NSString *)text +{ + return _likeCountLabel.text; +} + +- (void)setText:(NSString *)text +{ + if (![_likeCountLabel.text isEqualToString:text]) { + _likeCountLabel.text = text; + [self setNeedsLayout]; + [self invalidateIntrinsicContentSize]; + } +} + +#pragma mark - Layout + +- (CGSize)intrinsicContentSize +{ + return _borderView.intrinsicContentSize; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + CGRect bounds = self.bounds; + _borderView.frame = bounds; +} + +- (CGSize)sizeThatFits:(CGSize)size +{ + return [_borderView sizeThatFits:size]; +} + +#pragma mark - Helper Methods + +- (void)_initializeContent +{ + _borderView = [[FBSDKLikeBoxBorderView alloc] initWithFrame:CGRectZero]; + [self addSubview:_borderView]; + + _likeCountLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + _likeCountLabel.font = [UIFont systemFontOfSize:11.0]; + _likeCountLabel.textAlignment = NSTextAlignmentCenter; + _likeCountLabel.textColor = FBSDKUIColorWithRGB(0x6A, 0x71, 0x80); + _borderView.contentView = _likeCountLabel; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h new file mode 100644 index 0000000..032d30d --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h @@ -0,0 +1,29 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKLikeActionController.h" +#import "FBSDKLikeButton.h" + +@interface FBSDKLikeButton () + +@property (nonatomic, strong, readwrite) FBSDKLikeActionController *likeActionController; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h new file mode 100644 index 0000000..aa4c1d8 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h @@ -0,0 +1,24 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKCoreKit+Internal.h" + +@interface FBSDKLikeButtonPopWAV : FBSDKAudioResourceLoader +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m new file mode 100644 index 0000000..c021293 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m @@ -0,0 +1,36 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeButtonPopWAV.h" + +@implementation FBSDKLikeButtonPopWAV + ++ (NSString *)name +{ + return @"FBSDKLikeButtonPop.wav"; +} + ++ (NSData *)data +{ + const Byte bytes[] = { +0x52, 0x49, 0x46, 0x46, 0xfc, 0x57, 0x02, 0x00, 0x57, 0x41, 0x56, 0x45, 0x4a, 0x55, 0x4e, 0x4b, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x65, 0x78, 0x74, 0x5a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x72, 0x6f, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x68, 0x72, 0x72, 0x48, 0x37, 0x38, 0x21, 0x54, 0x66, 0x61, 0x61, 0x61, 0x61, 0x47, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x00, 0x31, 0x35, 0x3a, 0x32, 0x38, 0x3a, 0x30, 0x31, 0xf7, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6d, 0x74, 0x20, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x80, 0xbb, 0x00, 0x00, 0x00, 0xee, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x66, 0x10, 0x00, 0x00, 0x00, 0x70, 0xe2, 0xe6, 0xc4, 0xdb, 0x13, 0xcf, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x6c, 0x6d, 0x31, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x61, 0x74, 0x61, 0x80, 0x53, 0x02, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x19, 0x00, 0x12, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x13, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x11, 0x00, 0x11, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x14, 0x00, 0x14, 0x00, 0x17, 0x00, 0x17, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x21, 0x00, 0x21, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xca, 0xff, 0xca, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xea, 0xff, 0xea, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0x17, 0x00, 0x17, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x11, 0x00, 0x11, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0x02, 0x00, 0x02, 0x00, 0x17, 0x00, 0x17, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x41, 0xff, 0x41, 0xff, 0xe7, 0xfe, 0xe7, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0x39, 0xfe, 0x39, 0xfe, 0xb3, 0xfc, 0xb3, 0xfc, 0x5e, 0xfa, 0x5e, 0xfa, 0x25, 0xf8, 0x25, 0xf8, 0x22, 0xf7, 0x22, 0xf7, 0xc1, 0xf7, 0xc1, 0xf7, 0x5e, 0xf9, 0x5e, 0xf9, 0xec, 0xfa, 0xec, 0xfa, 0xb2, 0xfb, 0xb2, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x0a, 0xfb, 0x0a, 0xfb, 0x9a, 0xfa, 0x9a, 0xfa, 0x94, 0xfa, 0x94, 0xfa, 0x1b, 0xfb, 0x1b, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0x6f, 0xfc, 0x6f, 0xfc, 0xba, 0xfb, 0xba, 0xfb, 0xbc, 0xf9, 0xbc, 0xf9, 0x08, 0xf7, 0x08, 0xf7, 0xe5, 0xf4, 0xe5, 0xf4, 0x7f, 0xf4, 0x7f, 0xf4, 0xde, 0xf5, 0xde, 0xf5, 0x1e, 0xf8, 0x1e, 0xf8, 0x5a, 0xfa, 0x5a, 0xfa, 0x26, 0xfc, 0x26, 0xfc, 0xca, 0xfd, 0xca, 0xfd, 0xdb, 0xff, 0xdb, 0xff, 0x61, 0x02, 0x61, 0x02, 0xc6, 0x04, 0xc6, 0x04, 0x54, 0x06, 0x54, 0x06, 0xb4, 0x06, 0xb4, 0x06, 0x24, 0x06, 0x24, 0x06, 0x3b, 0x05, 0x3b, 0x05, 0x72, 0x04, 0x72, 0x04, 0x27, 0x04, 0x27, 0x04, 0x8e, 0x04, 0x8e, 0x04, 0x73, 0x05, 0x73, 0x05, 0x7f, 0x06, 0x7f, 0x06, 0x72, 0x07, 0x72, 0x07, 0x28, 0x08, 0x28, 0x08, 0xeb, 0x08, 0xeb, 0x08, 0x57, 0x0a, 0x57, 0x0a, 0x8c, 0x0c, 0x8c, 0x0c, 0x00, 0x0f, 0x00, 0x0f, 0xf6, 0x10, 0xf6, 0x10, 0xf2, 0x11, 0xf2, 0x11, 0x14, 0x12, 0x14, 0x12, 0xfa, 0x11, 0xfa, 0x11, 0x1e, 0x12, 0x1e, 0x12, 0x82, 0x12, 0x82, 0x12, 0xc4, 0x12, 0xc4, 0x12, 0x75, 0x12, 0x75, 0x12, 0x86, 0x11, 0x86, 0x11, 0x35, 0x10, 0x35, 0x10, 0xba, 0x0e, 0xba, 0x0e, 0x62, 0x0d, 0x62, 0x0d, 0x79, 0x0c, 0x79, 0x0c, 0x01, 0x0c, 0x01, 0x0c, 0xcf, 0x0b, 0xcf, 0x0b, 0xa7, 0x0b, 0xa7, 0x0b, 0x27, 0x0b, 0x27, 0x0b, 0x32, 0x0a, 0x32, 0x0a, 0x1d, 0x09, 0x1d, 0x09, 0x35, 0x08, 0x35, 0x08, 0x88, 0x07, 0x88, 0x07, 0xf7, 0x06, 0xf7, 0x06, 0x38, 0x06, 0x38, 0x06, 0x1c, 0x05, 0x1c, 0x05, 0xab, 0x03, 0xab, 0x03, 0xea, 0x01, 0xea, 0x01, 0xd7, 0xff, 0xd7, 0xff, 0x72, 0xfd, 0x72, 0xfd, 0xc3, 0xfa, 0xc3, 0xfa, 0x04, 0xf8, 0x04, 0xf8, 0x88, 0xf5, 0x88, 0xf5, 0x63, 0xf3, 0x63, 0xf3, 0x93, 0xf1, 0x93, 0xf1, 0x18, 0xf0, 0x18, 0xf0, 0xe7, 0xee, 0xe7, 0xee, 0x07, 0xee, 0x07, 0xee, 0x8a, 0xed, 0x8a, 0xed, 0x62, 0xed, 0x62, 0xed, 0x68, 0xed, 0x68, 0xed, 0x87, 0xed, 0x87, 0xed, 0xb5, 0xed, 0xb5, 0xed, 0xde, 0xed, 0xde, 0xed, 0xf0, 0xed, 0xf0, 0xed, 0xe5, 0xed, 0xe5, 0xed, 0xe2, 0xed, 0xe2, 0xed, 0x0a, 0xee, 0x0a, 0xee, 0x63, 0xee, 0x63, 0xee, 0xdb, 0xee, 0xdb, 0xee, 0x47, 0xef, 0x47, 0xef, 0x81, 0xef, 0x81, 0xef, 0xb5, 0xef, 0xb5, 0xef, 0x45, 0xf0, 0x45, 0xf0, 0x7b, 0xf1, 0x7b, 0xf1, 0x6c, 0xf3, 0x6c, 0xf3, 0xf1, 0xf5, 0xf1, 0xf5, 0xbf, 0xf8, 0xbf, 0xf8, 0x86, 0xfb, 0x86, 0xfb, 0x15, 0xfe, 0x15, 0xfe, 0x6c, 0x00, 0x6c, 0x00, 0xb3, 0x02, 0xb3, 0x02, 0x1f, 0x05, 0x1f, 0x05, 0xd0, 0x07, 0xd0, 0x07, 0xad, 0x0a, 0xad, 0x0a, 0x48, 0x0d, 0x48, 0x0d, 0x2a, 0x0f, 0x2a, 0x0f, 0x2c, 0x10, 0x2c, 0x10, 0x83, 0x10, 0x83, 0x10, 0xa3, 0x10, 0xa3, 0x10, 0xf5, 0x10, 0xf5, 0x10, 0x93, 0x11, 0x93, 0x11, 0x47, 0x12, 0x47, 0x12, 0xba, 0x12, 0xba, 0x12, 0xb3, 0x12, 0xb3, 0x12, 0x3d, 0x12, 0x3d, 0x12, 0x9c, 0x11, 0x9c, 0x11, 0x26, 0x11, 0x26, 0x11, 0x20, 0x11, 0x20, 0x11, 0x81, 0x11, 0x81, 0x11, 0xdb, 0x11, 0xdb, 0x11, 0xac, 0x11, 0xac, 0x11, 0x90, 0x10, 0x90, 0x10, 0x86, 0x0e, 0x86, 0x0e, 0x06, 0x0c, 0x06, 0x0c, 0xa0, 0x09, 0xa0, 0x09, 0x8b, 0x07, 0x8b, 0x07, 0x97, 0x05, 0x97, 0x05, 0x5a, 0x03, 0x5a, 0x03, 0x73, 0x00, 0x73, 0x00, 0xe1, 0xfc, 0xe1, 0xfc, 0x09, 0xf9, 0x09, 0xf9, 0x6f, 0xf5, 0x6f, 0xf5, 0x7e, 0xf2, 0x7e, 0xf2, 0x4b, 0xf0, 0x4b, 0xf0, 0x99, 0xee, 0x99, 0xee, 0x07, 0xed, 0x07, 0xed, 0x4f, 0xeb, 0x4f, 0xeb, 0x79, 0xe9, 0x79, 0xe9, 0xd4, 0xe7, 0xd4, 0xe7, 0xcc, 0xe6, 0xcc, 0xe6, 0x81, 0xe6, 0x81, 0xe6, 0xc2, 0xe6, 0xc2, 0xe6, 0x2a, 0xe7, 0x2a, 0xe7, 0x4d, 0xe7, 0x4d, 0xe7, 0x09, 0xe7, 0x09, 0xe7, 0x8b, 0xe6, 0x8b, 0xe6, 0x23, 0xe6, 0x23, 0xe6, 0x17, 0xe6, 0x17, 0xe6, 0x7b, 0xe6, 0x7b, 0xe6, 0x38, 0xe7, 0x38, 0xe7, 0x2b, 0xe8, 0x2b, 0xe8, 0x49, 0xe9, 0x49, 0xe9, 0xa6, 0xea, 0xa6, 0xea, 0x72, 0xec, 0x72, 0xec, 0xc5, 0xee, 0xc5, 0xee, 0x92, 0xf1, 0x92, 0xf1, 0xc2, 0xf4, 0xc2, 0xf4, 0x2b, 0xf8, 0x2b, 0xf8, 0xaa, 0xfb, 0xaa, 0xfb, 0x2d, 0xff, 0x2d, 0xff, 0xa6, 0x02, 0xa6, 0x02, 0xff, 0x05, 0xff, 0x05, 0x23, 0x09, 0x23, 0x09, 0xf9, 0x0b, 0xf9, 0x0b, 0x72, 0x0e, 0x72, 0x0e, 0x92, 0x10, 0x92, 0x10, 0x60, 0x12, 0x60, 0x12, 0xe5, 0x13, 0xe5, 0x13, 0x1b, 0x15, 0x1b, 0x15, 0xf4, 0x15, 0xf4, 0x15, 0x79, 0x16, 0x79, 0x16, 0xc1, 0x16, 0xc1, 0x16, 0xf4, 0x16, 0xf4, 0x16, 0x35, 0x17, 0x35, 0x17, 0x95, 0x17, 0x95, 0x17, 0xfc, 0x17, 0xfc, 0x17, 0x39, 0x18, 0x39, 0x18, 0x1d, 0x18, 0x1d, 0x18, 0x92, 0x17, 0x92, 0x17, 0xa8, 0x16, 0xa8, 0x16, 0x86, 0x15, 0x86, 0x15, 0x41, 0x14, 0x41, 0x14, 0xc8, 0x12, 0xc8, 0x12, 0xeb, 0x10, 0xeb, 0x10, 0x84, 0x0e, 0x84, 0x0e, 0x9e, 0x0b, 0x9e, 0x0b, 0x65, 0x08, 0x65, 0x08, 0x10, 0x05, 0x10, 0x05, 0xc8, 0x01, 0xc8, 0x01, 0x9e, 0xfe, 0x9e, 0xfe, 0x8f, 0xfb, 0x8f, 0xfb, 0x9d, 0xf8, 0x9d, 0xf8, 0xd8, 0xf5, 0xd8, 0xf5, 0x5f, 0xf3, 0x5f, 0xf3, 0x5a, 0xf1, 0x5a, 0xf1, 0xe7, 0xef, 0xe7, 0xef, 0xf7, 0xee, 0xf7, 0xee, 0x62, 0xee, 0x62, 0xee, 0x00, 0xee, 0x00, 0xee, 0xb5, 0xed, 0xb5, 0xed, 0x84, 0xed, 0x84, 0xed, 0x80, 0xed, 0x80, 0xed, 0xb9, 0xed, 0xb9, 0xed, 0x26, 0xee, 0x26, 0xee, 0xa8, 0xee, 0xa8, 0xee, 0x24, 0xef, 0x24, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0x37, 0xf0, 0x37, 0xf0, 0x0d, 0xf1, 0x0d, 0xf1, 0x46, 0xf2, 0x46, 0xf2, 0xe5, 0xf3, 0xe5, 0xf3, 0xd2, 0xf5, 0xd2, 0xf5, 0xf9, 0xf7, 0xf9, 0xf7, 0x59, 0xfa, 0x59, 0xfa, 0xf4, 0xfc, 0xf4, 0xfc, 0xd3, 0xff, 0xd3, 0xff, 0xf3, 0x02, 0xf3, 0x02, 0x35, 0x06, 0x35, 0x06, 0x5f, 0x09, 0x5f, 0x09, 0x36, 0x0c, 0x36, 0x0c, 0x97, 0x0e, 0x97, 0x0e, 0x7b, 0x10, 0x7b, 0x10, 0xf1, 0x11, 0xf1, 0x11, 0x0c, 0x13, 0x0c, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0x2a, 0x14, 0x2a, 0x14, 0x15, 0x14, 0x15, 0x14, 0xa2, 0x13, 0xa2, 0x13, 0xf2, 0x12, 0xf2, 0x12, 0x25, 0x12, 0x25, 0x12, 0x57, 0x11, 0x57, 0x11, 0x81, 0x10, 0x81, 0x10, 0x8b, 0x0f, 0x8b, 0x0f, 0x6e, 0x0e, 0x6e, 0x0e, 0x32, 0x0d, 0x32, 0x0d, 0xe7, 0x0b, 0xe7, 0x0b, 0x9b, 0x0a, 0x9b, 0x0a, 0x4f, 0x09, 0x4f, 0x09, 0xec, 0x07, 0xec, 0x07, 0x50, 0x06, 0x50, 0x06, 0x69, 0x04, 0x69, 0x04, 0x3c, 0x02, 0x3c, 0x02, 0xda, 0xff, 0xda, 0xff, 0x5e, 0xfd, 0x5e, 0xfd, 0xe4, 0xfa, 0xe4, 0xfa, 0x7c, 0xf8, 0x7c, 0xf8, 0x29, 0xf6, 0x29, 0xf6, 0xfc, 0xf3, 0xfc, 0xf3, 0x11, 0xf2, 0x11, 0xf2, 0x88, 0xf0, 0x88, 0xf0, 0x81, 0xef, 0x81, 0xef, 0x01, 0xef, 0x01, 0xef, 0xf0, 0xee, 0xf0, 0xee, 0x2c, 0xef, 0x2c, 0xef, 0xb0, 0xef, 0xb0, 0xef, 0x91, 0xf0, 0x91, 0xf0, 0xe6, 0xf1, 0xe6, 0xf1, 0xa9, 0xf3, 0xa9, 0xf3, 0xb9, 0xf5, 0xb9, 0xf5, 0xde, 0xf7, 0xde, 0xf7, 0xdd, 0xf9, 0xdd, 0xf9, 0x8e, 0xfb, 0x8e, 0xfb, 0xe7, 0xfc, 0xe7, 0xfc, 0xfe, 0xfd, 0xfe, 0xfd, 0xf0, 0xfe, 0xf0, 0xfe, 0xd2, 0xff, 0xd2, 0xff, 0xb0, 0x00, 0xb0, 0x00, 0x89, 0x01, 0x89, 0x01, 0x57, 0x02, 0x57, 0x02, 0x25, 0x03, 0x25, 0x03, 0x1b, 0x04, 0x1b, 0x04, 0x64, 0x05, 0x64, 0x05, 0x0a, 0x07, 0x0a, 0x07, 0xf4, 0x08, 0xf4, 0x08, 0xe4, 0x0a, 0xe4, 0x0a, 0x88, 0x0c, 0x88, 0x0c, 0xbf, 0x0d, 0xbf, 0x0d, 0x7c, 0x0e, 0x7c, 0x0e, 0xd1, 0x0e, 0xd1, 0x0e, 0xca, 0x0e, 0xca, 0x0e, 0x48, 0x0e, 0x48, 0x0e, 0x33, 0x0d, 0x33, 0x0d, 0x8f, 0x0b, 0x8f, 0x0b, 0x74, 0x09, 0x74, 0x09, 0x0f, 0x07, 0x0f, 0x07, 0x97, 0x04, 0x97, 0x04, 0x37, 0x02, 0x37, 0x02, 0x11, 0x00, 0x11, 0x00, 0x42, 0xfe, 0x42, 0xfe, 0xe1, 0xfc, 0xe1, 0xfc, 0xfe, 0xfb, 0xfe, 0xfb, 0x91, 0xfb, 0x91, 0xfb, 0x7d, 0xfb, 0x7d, 0xfb, 0x9b, 0xfb, 0x9b, 0xfb, 0xd4, 0xfb, 0xd4, 0xfb, 0x12, 0xfc, 0x12, 0xfc, 0x39, 0xfc, 0x39, 0xfc, 0x2f, 0xfc, 0x2f, 0xfc, 0xe5, 0xfb, 0xe5, 0xfb, 0x56, 0xfb, 0x56, 0xfb, 0x8f, 0xfa, 0x8f, 0xfa, 0xab, 0xf9, 0xab, 0xf9, 0xc8, 0xf8, 0xc8, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x6c, 0xf7, 0x6c, 0xf7, 0x1a, 0xf7, 0x1a, 0xf7, 0x25, 0xf7, 0x25, 0xf7, 0xa0, 0xf7, 0xa0, 0xf7, 0x95, 0xf8, 0x95, 0xf8, 0xf5, 0xf9, 0xf5, 0xf9, 0xa0, 0xfb, 0xa0, 0xfb, 0x76, 0xfd, 0x76, 0xfd, 0x68, 0xff, 0x68, 0xff, 0x62, 0x01, 0x62, 0x01, 0x3d, 0x03, 0x3d, 0x03, 0xbb, 0x04, 0xbb, 0x04, 0xa6, 0x05, 0xa6, 0x05, 0xef, 0x05, 0xef, 0x05, 0xac, 0x05, 0xac, 0x05, 0xfe, 0x04, 0xfe, 0x04, 0x03, 0x04, 0x03, 0x04, 0xc8, 0x02, 0xc8, 0x02, 0x61, 0x01, 0x61, 0x01, 0xf5, 0xff, 0xf5, 0xff, 0xb9, 0xfe, 0xb9, 0xfe, 0xd6, 0xfd, 0xd6, 0xfd, 0x5a, 0xfd, 0x5a, 0xfd, 0x3b, 0xfd, 0x3b, 0xfd, 0x62, 0xfd, 0x62, 0xfd, 0xb8, 0xfd, 0xb8, 0xfd, 0x3a, 0xfe, 0x3a, 0xfe, 0xde, 0xfe, 0xde, 0xfe, 0x87, 0xff, 0x87, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x33, 0x00, 0x33, 0x00, 0xc8, 0xff, 0xc8, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x41, 0xfe, 0x41, 0xfe, 0x4a, 0xfd, 0x4a, 0xfd, 0x4b, 0xfc, 0x4b, 0xfc, 0x68, 0xfb, 0x68, 0xfb, 0xd0, 0xfa, 0xd0, 0xfa, 0xb3, 0xfa, 0xb3, 0xfa, 0x2b, 0xfb, 0x2b, 0xfb, 0x38, 0xfc, 0x38, 0xfc, 0xbd, 0xfd, 0xbd, 0xfd, 0x95, 0xff, 0x95, 0xff, 0xa5, 0x01, 0xa5, 0x01, 0xd7, 0x03, 0xd7, 0x03, 0x07, 0x06, 0x07, 0x06, 0x02, 0x08, 0x02, 0x08, 0x9a, 0x09, 0x9a, 0x09, 0xb6, 0x0a, 0xb6, 0x0a, 0x4b, 0x0b, 0x4b, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0xd9, 0x0a, 0xd9, 0x0a, 0xdb, 0x09, 0xdb, 0x09, 0x7c, 0x08, 0x7c, 0x08, 0xe8, 0x06, 0xe8, 0x06, 0x48, 0x05, 0x48, 0x05, 0xaf, 0x03, 0xaf, 0x03, 0x28, 0x02, 0x28, 0x02, 0xcf, 0x00, 0xcf, 0x00, 0xce, 0xff, 0xce, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0xd1, 0xfe, 0xd1, 0xfe, 0x7c, 0xfe, 0x7c, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0x76, 0xfd, 0x76, 0xfd, 0xda, 0xfc, 0xda, 0xfc, 0x37, 0xfc, 0x37, 0xfc, 0x68, 0xfb, 0x68, 0xfb, 0x4b, 0xfa, 0x4b, 0xfa, 0xd8, 0xf8, 0xd8, 0xf8, 0x1e, 0xf7, 0x1e, 0xf7, 0x3a, 0xf5, 0x3a, 0xf5, 0x5d, 0xf3, 0x5d, 0xf3, 0xce, 0xf1, 0xce, 0xf1, 0xda, 0xf0, 0xda, 0xf0, 0xba, 0xf0, 0xba, 0xf0, 0x69, 0xf1, 0x69, 0xf1, 0x8d, 0xf2, 0x8d, 0xf2, 0xc6, 0xf3, 0xc6, 0xf3, 0x20, 0xf5, 0x20, 0xf5, 0x11, 0xf7, 0x11, 0xf7, 0xf4, 0xf9, 0xf4, 0xf9, 0x96, 0xfd, 0x96, 0xfd, 0x4d, 0x01, 0x4d, 0x01, 0x79, 0x04, 0x79, 0x04, 0xe9, 0x06, 0xe9, 0x06, 0xd0, 0x08, 0xd0, 0x08, 0x6b, 0x0a, 0x6b, 0x0a, 0xb5, 0x0b, 0xb5, 0x0b, 0x80, 0x0c, 0x80, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xd4, 0x0c, 0xd4, 0x0c, 0xda, 0x0c, 0xda, 0x0c, 0xdd, 0x0c, 0xdd, 0x0c, 0xae, 0x0c, 0xae, 0x0c, 0x4a, 0x0c, 0x4a, 0x0c, 0xee, 0x0b, 0xee, 0x0b, 0xdf, 0x0b, 0xdf, 0x0b, 0x13, 0x0c, 0x13, 0x0c, 0x26, 0x0c, 0x26, 0x0c, 0xb3, 0x0b, 0xb3, 0x0b, 0xa5, 0x0a, 0xa5, 0x0a, 0x34, 0x09, 0x34, 0x09, 0x7d, 0x07, 0x7d, 0x07, 0x55, 0x05, 0x55, 0x05, 0x7c, 0x02, 0x7c, 0x02, 0xfd, 0xfe, 0xfd, 0xfe, 0x35, 0xfb, 0x35, 0xfb, 0x85, 0xf7, 0x85, 0xf7, 0x10, 0xf4, 0x10, 0xf4, 0xc9, 0xf0, 0xc9, 0xf0, 0xc0, 0xed, 0xc0, 0xed, 0x3b, 0xeb, 0x3b, 0xeb, 0x95, 0xe9, 0x95, 0xe9, 0xf6, 0xe8, 0xf6, 0xe8, 0x3a, 0xe9, 0x3a, 0xe9, 0x2d, 0xea, 0x2d, 0xea, 0xb6, 0xeb, 0xb6, 0xeb, 0xcd, 0xed, 0xcd, 0xed, 0x55, 0xf0, 0x55, 0xf0, 0x13, 0xf3, 0x13, 0xf3, 0xda, 0xf5, 0xda, 0xf5, 0xa6, 0xf8, 0xa6, 0xf8, 0x8d, 0xfb, 0x8d, 0xfb, 0x87, 0xfe, 0x87, 0xfe, 0x5c, 0x01, 0x5c, 0x01, 0xd9, 0x03, 0xd9, 0x03, 0x0b, 0x06, 0x0b, 0x06, 0x38, 0x08, 0x38, 0x08, 0x96, 0x0a, 0x96, 0x0a, 0x14, 0x0d, 0x14, 0x0d, 0x78, 0x0f, 0x78, 0x0f, 0xa7, 0x11, 0xa7, 0x11, 0xae, 0x13, 0xae, 0x13, 0xa2, 0x15, 0xa2, 0x15, 0x72, 0x17, 0x72, 0x17, 0xe1, 0x18, 0xe1, 0x18, 0xae, 0x19, 0xae, 0x19, 0xb8, 0x19, 0xb8, 0x19, 0x03, 0x19, 0x03, 0x19, 0x8f, 0x17, 0x8f, 0x17, 0x4b, 0x15, 0x4b, 0x15, 0x33, 0x12, 0x33, 0x12, 0x68, 0x0e, 0x68, 0x0e, 0x22, 0x0a, 0x22, 0x0a, 0x91, 0x05, 0x91, 0x05, 0xcb, 0x00, 0xcb, 0x00, 0xea, 0xfb, 0xea, 0xfb, 0x1b, 0xf7, 0x1b, 0xf7, 0x9f, 0xf2, 0x9f, 0xf2, 0xa8, 0xee, 0xa8, 0xee, 0x47, 0xeb, 0x47, 0xeb, 0x76, 0xe8, 0x76, 0xe8, 0x3a, 0xe6, 0x3a, 0xe6, 0x9d, 0xe4, 0x9d, 0xe4, 0xaa, 0xe3, 0xaa, 0xe3, 0x51, 0xe3, 0x51, 0xe3, 0x77, 0xe3, 0x77, 0xe3, 0x08, 0xe4, 0x08, 0xe4, 0x02, 0xe5, 0x02, 0xe5, 0x70, 0xe6, 0x70, 0xe6, 0x56, 0xe8, 0x56, 0xe8, 0xb1, 0xea, 0xb1, 0xea, 0x82, 0xed, 0x82, 0xed, 0xd8, 0xf0, 0xd8, 0xf0, 0xba, 0xf4, 0xba, 0xf4, 0x1b, 0xf9, 0x1b, 0xf9, 0xd9, 0xfd, 0xd9, 0xfd, 0xd2, 0x02, 0xd2, 0x02, 0xec, 0x07, 0xec, 0x07, 0x05, 0x0d, 0x05, 0x0d, 0xec, 0x11, 0xec, 0x11, 0x6c, 0x16, 0x6c, 0x16, 0x59, 0x1a, 0x59, 0x1a, 0x93, 0x1d, 0x93, 0x1d, 0x03, 0x20, 0x03, 0x20, 0x96, 0x21, 0x96, 0x21, 0x38, 0x22, 0x38, 0x22, 0xd9, 0x21, 0xd9, 0x21, 0x7f, 0x20, 0x7f, 0x20, 0x44, 0x1e, 0x44, 0x1e, 0x51, 0x1b, 0x51, 0x1b, 0xcf, 0x17, 0xcf, 0x17, 0xe0, 0x13, 0xe0, 0x13, 0xa4, 0x0f, 0xa4, 0x0f, 0x34, 0x0b, 0x34, 0x0b, 0xa9, 0x06, 0xa9, 0x06, 0x13, 0x02, 0x13, 0x02, 0x89, 0xfd, 0x89, 0xfd, 0x21, 0xf9, 0x21, 0xf9, 0xea, 0xf4, 0xea, 0xf4, 0xe9, 0xf0, 0xe9, 0xf0, 0x20, 0xed, 0x20, 0xed, 0x97, 0xe9, 0x97, 0xe9, 0x60, 0xe6, 0x60, 0xe6, 0x9f, 0xe3, 0x9f, 0xe3, 0x70, 0xe1, 0x70, 0xe1, 0xe6, 0xdf, 0xe6, 0xdf, 0x10, 0xdf, 0x10, 0xdf, 0x03, 0xdf, 0x03, 0xdf, 0xd2, 0xdf, 0xd2, 0xdf, 0x85, 0xe1, 0x85, 0xe1, 0x1d, 0xe4, 0x1d, 0xe4, 0x94, 0xe7, 0x94, 0xe7, 0xd8, 0xeb, 0xd8, 0xeb, 0xd0, 0xf0, 0xd0, 0xf0, 0x51, 0xf6, 0x51, 0xf6, 0x25, 0xfc, 0x25, 0xfc, 0x0f, 0x02, 0x0f, 0x02, 0xdb, 0x07, 0xdb, 0x07, 0x5c, 0x0d, 0x5c, 0x0d, 0x6c, 0x12, 0x6c, 0x12, 0xe0, 0x16, 0xe0, 0x16, 0x99, 0x1a, 0x99, 0x1a, 0x81, 0x1d, 0x81, 0x1d, 0x95, 0x1f, 0x95, 0x1f, 0xd7, 0x20, 0xd7, 0x20, 0x48, 0x21, 0x48, 0x21, 0xee, 0x20, 0xee, 0x20, 0xd3, 0x1f, 0xd3, 0x1f, 0x0d, 0x1e, 0x0d, 0x1e, 0xae, 0x1b, 0xae, 0x1b, 0xc5, 0x18, 0xc5, 0x18, 0x5c, 0x15, 0x5c, 0x15, 0x7b, 0x11, 0x7b, 0x11, 0x31, 0x0d, 0x31, 0x0d, 0x92, 0x08, 0x92, 0x08, 0xb2, 0x03, 0xb2, 0x03, 0xa4, 0xfe, 0xa4, 0xfe, 0x80, 0xf9, 0x80, 0xf9, 0x67, 0xf4, 0x67, 0xf4, 0x7f, 0xef, 0x7f, 0xef, 0xef, 0xea, 0xef, 0xea, 0xe2, 0xe6, 0xe2, 0xe6, 0x78, 0xe3, 0x78, 0xe3, 0xd2, 0xe0, 0xd2, 0xe0, 0x0f, 0xdf, 0x0f, 0xdf, 0x40, 0xde, 0x40, 0xde, 0x65, 0xde, 0x65, 0xde, 0x73, 0xdf, 0x73, 0xdf, 0x5c, 0xe1, 0x5c, 0xe1, 0x09, 0xe4, 0x09, 0xe4, 0x62, 0xe7, 0x62, 0xe7, 0x4f, 0xeb, 0x4f, 0xeb, 0xab, 0xef, 0xab, 0xef, 0x53, 0xf4, 0x53, 0xf4, 0x29, 0xf9, 0x29, 0xf9, 0x0e, 0xfe, 0x0e, 0xfe, 0xe3, 0x02, 0xe3, 0x02, 0x8a, 0x07, 0x8a, 0x07, 0xe8, 0x0b, 0xe8, 0x0b, 0xeb, 0x0f, 0xeb, 0x0f, 0x7b, 0x13, 0x7b, 0x13, 0x89, 0x16, 0x89, 0x16, 0x09, 0x19, 0x09, 0x19, 0xf3, 0x1a, 0xf3, 0x1a, 0x3a, 0x1c, 0x3a, 0x1c, 0xcb, 0x1c, 0xcb, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, 0xa8, 0x1b, 0xa8, 0x1b, 0xf8, 0x19, 0xf8, 0x19, 0x99, 0x17, 0x99, 0x17, 0x9d, 0x14, 0x9d, 0x14, 0x15, 0x11, 0x15, 0x11, 0x13, 0x0d, 0x13, 0x0d, 0xac, 0x08, 0xac, 0x08, 0x09, 0x04, 0x09, 0x04, 0x55, 0xff, 0x55, 0xff, 0xb8, 0xfa, 0xb8, 0xfa, 0x59, 0xf6, 0x59, 0xf6, 0x5a, 0xf2, 0x5a, 0xf2, 0xd4, 0xee, 0xd4, 0xee, 0xe1, 0xeb, 0xe1, 0xeb, 0x95, 0xe9, 0x95, 0xe9, 0xfb, 0xe7, 0xfb, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0x01, 0xe7, 0x01, 0xe7, 0xa4, 0xe7, 0xa4, 0xe7, 0xf6, 0xe8, 0xf6, 0xe8, 0xe1, 0xea, 0xe1, 0xea, 0x50, 0xed, 0x50, 0xed, 0x2d, 0xf0, 0x2d, 0xf0, 0x5e, 0xf3, 0x5e, 0xf3, 0xc7, 0xf6, 0xc7, 0xf6, 0x4d, 0xfa, 0x4d, 0xfa, 0xd9, 0xfd, 0xd9, 0xfd, 0x55, 0x01, 0x55, 0x01, 0xb0, 0x04, 0xb0, 0x04, 0xdd, 0x07, 0xdd, 0x07, 0xc8, 0x0a, 0xc8, 0x0a, 0x5f, 0x0d, 0x5f, 0x0d, 0x94, 0x0f, 0x94, 0x0f, 0x5d, 0x11, 0x5d, 0x11, 0xa4, 0x12, 0xa4, 0x12, 0x5c, 0x13, 0x5c, 0x13, 0x7c, 0x13, 0x7c, 0x13, 0x0a, 0x13, 0x0a, 0x13, 0x0e, 0x12, 0x0e, 0x12, 0x93, 0x10, 0x93, 0x10, 0xa2, 0x0e, 0xa2, 0x0e, 0x3f, 0x0c, 0x3f, 0x0c, 0x75, 0x09, 0x75, 0x09, 0x5d, 0x06, 0x5d, 0x06, 0x19, 0x03, 0x19, 0x03, 0xc4, 0xff, 0xc4, 0xff, 0x7b, 0xfc, 0x7b, 0xfc, 0x5f, 0xf9, 0x5f, 0xf9, 0x8b, 0xf6, 0x8b, 0xf6, 0x1b, 0xf4, 0x1b, 0xf4, 0x1f, 0xf2, 0x1f, 0xf2, 0xa2, 0xf0, 0xa2, 0xf0, 0xa4, 0xef, 0xa4, 0xef, 0x27, 0xef, 0x27, 0xef, 0x31, 0xef, 0x31, 0xef, 0xbd, 0xef, 0xbd, 0xef, 0xbf, 0xf0, 0xbf, 0xf0, 0x29, 0xf2, 0x29, 0xf2, 0xf1, 0xf3, 0xf1, 0xf3, 0x0a, 0xf6, 0x0a, 0xf6, 0x66, 0xf8, 0x66, 0xf8, 0xf4, 0xfa, 0xf4, 0xfa, 0x9d, 0xfd, 0x9d, 0xfd, 0x49, 0x00, 0x49, 0x00, 0xe7, 0x02, 0xe7, 0x02, 0x65, 0x05, 0x65, 0x05, 0xb2, 0x07, 0xb2, 0x07, 0xbb, 0x09, 0xbb, 0x09, 0x75, 0x0b, 0x75, 0x0b, 0xd7, 0x0c, 0xd7, 0x0c, 0xda, 0x0d, 0xda, 0x0d, 0x78, 0x0e, 0x78, 0x0e, 0xa9, 0x0e, 0xa9, 0x0e, 0x6d, 0x0e, 0x6d, 0x0e, 0xc4, 0x0d, 0xc4, 0x0d, 0xb6, 0x0c, 0xb6, 0x0c, 0x4e, 0x0b, 0x4e, 0x0b, 0xa2, 0x09, 0xa2, 0x09, 0xba, 0x07, 0xba, 0x07, 0xa8, 0x05, 0xa8, 0x05, 0x82, 0x03, 0x82, 0x03, 0x5c, 0x01, 0x5c, 0x01, 0x41, 0xff, 0x41, 0xff, 0x3e, 0xfd, 0x3e, 0xfd, 0x65, 0xfb, 0x65, 0xfb, 0xc6, 0xf9, 0xc6, 0xf9, 0x69, 0xf8, 0x69, 0xf8, 0x55, 0xf7, 0x55, 0xf7, 0x8f, 0xf6, 0x8f, 0xf6, 0x15, 0xf6, 0x15, 0xf6, 0xea, 0xf5, 0xea, 0xf5, 0x17, 0xf6, 0x17, 0xf6, 0x99, 0xf6, 0x99, 0xf6, 0x6f, 0xf7, 0x6f, 0xf7, 0x8a, 0xf8, 0x8a, 0xf8, 0xe0, 0xf9, 0xe0, 0xf9, 0x58, 0xfb, 0x58, 0xfb, 0xe7, 0xfc, 0xe7, 0xfc, 0x86, 0xfe, 0x86, 0xfe, 0x2a, 0x00, 0x2a, 0x00, 0xc3, 0x01, 0xc3, 0x01, 0x44, 0x03, 0x44, 0x03, 0x9e, 0x04, 0x9e, 0x04, 0xc3, 0x05, 0xc3, 0x05, 0xaf, 0x06, 0xaf, 0x06, 0x5b, 0x07, 0x5b, 0x07, 0xbe, 0x07, 0xbe, 0x07, 0xd5, 0x07, 0xd5, 0x07, 0xa1, 0x07, 0xa1, 0x07, 0x25, 0x07, 0x25, 0x07, 0x6c, 0x06, 0x6c, 0x06, 0x84, 0x05, 0x84, 0x05, 0x7d, 0x04, 0x7d, 0x04, 0x5d, 0x03, 0x5d, 0x03, 0x2b, 0x02, 0x2b, 0x02, 0xf3, 0x00, 0xf3, 0x00, 0xbd, 0xff, 0xbd, 0xff, 0x91, 0xfe, 0x91, 0xfe, 0x7b, 0xfd, 0x7b, 0xfd, 0x86, 0xfc, 0x86, 0xfc, 0xbb, 0xfb, 0xbb, 0xfb, 0x23, 0xfb, 0x23, 0xfb, 0xc1, 0xfa, 0xc1, 0xfa, 0x8b, 0xfa, 0x8b, 0xfa, 0x76, 0xfa, 0x76, 0xfa, 0x7f, 0xfa, 0x7f, 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0x09, 0xfb, 0x09, 0xfb, 0x94, 0xfb, 0x94, 0xfb, 0x47, 0xfc, 0x47, 0xfc, 0x0c, 0xfd, 0x0c, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0xa0, 0xfe, 0xa0, 0xfe, 0x74, 0xff, 0x74, 0xff, 0x56, 0x00, 0x56, 0x00, 0x3b, 0x01, 0x3b, 0x01, 0x13, 0x02, 0x13, 0x02, 0xcc, 0x02, 0xcc, 0x02, 0x5e, 0x03, 0x5e, 0x03, 0xce, 0x03, 0xce, 0x03, 0x17, 0x04, 0x17, 0x04, 0x36, 0x04, 0x36, 0x04, 0x26, 0x04, 0x26, 0x04, 0xec, 0x03, 0xec, 0x03, 0x95, 0x03, 0x95, 0x03, 0x28, 0x03, 0x28, 0x03, 0xab, 0x02, 0xab, 0x02, 0x23, 0x02, 0x23, 0x02, 0x8c, 0x01, 0x8c, 0x01, 0xe8, 0x00, 0xe8, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x85, 0xff, 0x85, 0xff, 0xca, 0xfe, 0xca, 0xfe, 0x0d, 0xfe, 0x0d, 0xfe, 0x59, 0xfd, 0x59, 0xfd, 0xb7, 0xfc, 0xb7, 0xfc, 0x2b, 0xfc, 0x2b, 0xfc, 0xbc, 0xfb, 0xbc, 0xfb, 0x6d, 0xfb, 0x6d, 0xfb, 0x44, 0xfb, 0x44, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0xa7, 0xfb, 0xa7, 0xfb, 0x3f, 0xfc, 0x3f, 0xfc, 0x0e, 0xfd, 0x0e, 0xfd, 0x00, 0xfe, 0x00, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0xf6, 0xff, 0xf6, 0xff, 0xe0, 0x00, 0xe0, 0x00, 0xb2, 0x01, 0xb2, 0x01, 0x58, 0x02, 0x58, 0x02, 0xbd, 0x02, 0xbd, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0x3a, 0x02, 0x3a, 0x02, 0xa4, 0x01, 0xa4, 0x01, 0xff, 0x00, 0xff, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0xd6, 0xff, 0xd6, 0xff, 0x73, 0xff, 0x73, 0xff, 0x35, 0xff, 0x35, 0xff, 0x12, 0xff, 0x12, 0xff, 0x01, 0xff, 0x01, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0x12, 0xff, 0x12, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x71, 0xff, 0x71, 0xff, 0x94, 0xff, 0x94, 0xff, 0x91, 0xff, 0x91, 0xff, 0x67, 0xff, 0x67, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x03, 0xff, 0x03, 0xff, 0xfb, 0xfe, 0xfb, 0xfe, 0x12, 0xff, 0x12, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x70, 0xff, 0x70, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x40, 0x00, 0x40, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xa0, 0x01, 0xa0, 0x01, 0x7b, 0x02, 0x7b, 0x02, 0xfc, 0x02, 0xfc, 0x02, 0xe0, 0x02, 0xe0, 0x02, 0x47, 0x02, 0x47, 0x02, 0xa9, 0x01, 0xa9, 0x01, 0x87, 0x01, 0x87, 0x01, 0x0b, 0x02, 0x0b, 0x02, 0xe2, 0x02, 0xe2, 0x02, 0x6c, 0x03, 0x6c, 0x03, 0x3d, 0x03, 0x3d, 0x03, 0x5e, 0x02, 0x5e, 0x02, 0x39, 0x01, 0x39, 0x01, 0x4e, 0x00, 0x4e, 0x00, 0xee, 0xff, 0xee, 0xff, 0x19, 0x00, 0x19, 0x00, 0x87, 0x00, 0x87, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x5b, 0xff, 0x5b, 0xff, 0xdf, 0xfd, 0xdf, 0xfd, 0x9c, 0xfc, 0x9c, 0xfc, 0x1e, 0xfc, 0x1e, 0xfc, 0x7e, 0xfc, 0x7e, 0xfc, 0x5d, 0xfd, 0x5d, 0xfd, 0x24, 0xfe, 0x24, 0xfe, 0x69, 0xfe, 0x69, 0xfe, 0x2b, 0xfe, 0x2b, 0xfe, 0xcb, 0xfd, 0xcb, 0xfd, 0xb2, 0xfd, 0xb2, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0xbb, 0xfe, 0xbb, 0xfe, 0x8b, 0xff, 0x8b, 0xff, 0x4c, 0x00, 0x4c, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x27, 0x01, 0x27, 0x01, 0x35, 0x01, 0x35, 0x01, 0x27, 0x01, 0x27, 0x01, 0x27, 0x01, 0x27, 0x01, 0x41, 0x01, 0x41, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x39, 0x01, 0x39, 0x01, 0xfd, 0x00, 0xfd, 0x00, 0xba, 0x00, 0xba, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x03, 0x00, 0x03, 0x00, 0x7b, 0xff, 0x7b, 0xff, 0xf2, 0xfe, 0xf2, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0xc5, 0xfe, 0xc5, 0xfe, 0xf3, 0xfe, 0xf3, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0xd2, 0xfe, 0xd2, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x12, 0xff, 0x12, 0xff, 0x68, 0xff, 0x68, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0x5a, 0x00, 0x5a, 0x00, 0xde, 0x00, 0xde, 0x00, 0x4d, 0x01, 0x4d, 0x01, 0x97, 0x01, 0x97, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0xe9, 0x01, 0xe9, 0x01, 0x22, 0x02, 0x22, 0x02, 0x69, 0x02, 0x69, 0x02, 0xad, 0x02, 0xad, 0x02, 0xda, 0x02, 0xda, 0x02, 0xe2, 0x02, 0xe2, 0x02, 0xbc, 0x02, 0xbc, 0x02, 0x61, 0x02, 0x61, 0x02, 0xd1, 0x01, 0xd1, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x65, 0x00, 0x65, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x62, 0xff, 0x62, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0xbb, 0xfe, 0xbb, 0xfe, 0x5c, 0xfe, 0x5c, 0xfe, 0xf8, 0xfd, 0xf8, 0xfd, 0xa6, 0xfd, 0xa6, 0xfd, 0x7b, 0xfd, 0x7b, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0xa6, 0xfd, 0xa6, 0xfd, 0xf2, 0xfd, 0xf2, 0xfd, 0x5b, 0xfe, 0x5b, 0xfe, 0xd1, 0xfe, 0xd1, 0xfe, 0x41, 0xff, 0x41, 0xff, 0x98, 0xff, 0x98, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0x01, 0x00, 0x01, 0x00, 0x28, 0x00, 0x28, 0x00, 0x53, 0x00, 0x53, 0x00, 0x86, 0x00, 0x86, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xef, 0x00, 0xef, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0x12, 0x01, 0x12, 0x01, 0xff, 0x00, 0xff, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0xda, 0x00, 0xda, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x63, 0x00, 0x63, 0x00, 0x14, 0x00, 0x14, 0x00, 0xb2, 0xff, 0xb2, 0xff, 0x42, 0xff, 0x42, 0xff, 0xca, 0xfe, 0xca, 0xfe, 0x58, 0xfe, 0x58, 0xfe, 0xfa, 0xfd, 0xfa, 0xfd, 0xae, 0xfd, 0xae, 0xfd, 0x6b, 0xfd, 0x6b, 0xfd, 0x33, 0xfd, 0x33, 0xfd, 0x11, 0xfd, 0x11, 0xfd, 0x1a, 0xfd, 0x1a, 0xfd, 0x50, 0xfd, 0x50, 0xfd, 0xac, 0xfd, 0xac, 0xfd, 0x22, 0xfe, 0x22, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x3d, 0xff, 0x3d, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0x73, 0x00, 0x73, 0x00, 0x03, 0x01, 0x03, 0x01, 0x85, 0x01, 0x85, 0x01, 0xfd, 0x01, 0xfd, 0x01, 0x6f, 0x02, 0x6f, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0x24, 0x03, 0x24, 0x03, 0x4c, 0x03, 0x4c, 0x03, 0x48, 0x03, 0x48, 0x03, 0x23, 0x03, 0x23, 0x03, 0xe5, 0x02, 0xe5, 0x02, 0x94, 0x02, 0x94, 0x02, 0x34, 0x02, 0x34, 0x02, 0xcf, 0x01, 0xcf, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x04, 0x01, 0x04, 0x01, 0x9b, 0x00, 0x9b, 0x00, 0x29, 0x00, 0x29, 0x00, 0xb2, 0xff, 0xb2, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0xde, 0xfe, 0xde, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x20, 0xfe, 0x20, 0xfe, 0xe7, 0xfd, 0xe7, 0xfd, 0xb7, 0xfd, 0xb7, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0x9f, 0xfd, 0x9f, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0x04, 0xfe, 0x04, 0xfe, 0x40, 0xfe, 0x40, 0xfe, 0x8d, 0xfe, 0x8d, 0xfe, 0xec, 0xfe, 0xec, 0xfe, 0x5a, 0xff, 0x5a, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x4a, 0x00, 0x4a, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0x12, 0x01, 0x12, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x63, 0x01, 0x63, 0x01, 0x54, 0x01, 0x54, 0x01, 0x45, 0x01, 0x45, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x11, 0x01, 0x11, 0x01, 0xec, 0x00, 0xec, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x30, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0x96, 0xff, 0x96, 0xff, 0x68, 0xff, 0x68, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x12, 0xff, 0x12, 0xff, 0xf5, 0xfe, 0xf5, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0xea, 0xfe, 0xea, 0xfe, 0xf4, 0xfe, 0xf4, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0x0d, 0xff, 0x0d, 0xff, 0x27, 0xff, 0x27, 0xff, 0x58, 0xff, 0x58, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x4f, 0x00, 0x4f, 0x00, 0x98, 0x00, 0x98, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0x14, 0x01, 0x14, 0x01, 0x50, 0x01, 0x50, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0xcb, 0x01, 0xcb, 0x01, 0x02, 0x02, 0x02, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0x4a, 0x02, 0x4a, 0x02, 0x53, 0x02, 0x53, 0x02, 0x45, 0x02, 0x45, 0x02, 0x27, 0x02, 0x27, 0x02, 0xfc, 0x01, 0xfc, 0x01, 0xc9, 0x01, 0xc9, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0x43, 0x01, 0x43, 0x01, 0xe9, 0x00, 0xe9, 0x00, 0x82, 0x00, 0x82, 0x00, 0x16, 0x00, 0x16, 0x00, 0xad, 0xff, 0xad, 0xff, 0x49, 0xff, 0x49, 0xff, 0xeb, 0xfe, 0xeb, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x04, 0xfe, 0x04, 0xfe, 0xcb, 0xfd, 0xcb, 0xfd, 0x9e, 0xfd, 0x9e, 0xfd, 0x81, 0xfd, 0x81, 0xfd, 0x76, 0xfd, 0x76, 0xfd, 0x80, 0xfd, 0x80, 0xfd, 0x98, 0xfd, 0x98, 0xfd, 0xb9, 0xfd, 0xb9, 0xfd, 0xdf, 0xfd, 0xdf, 0xfd, 0x08, 0xfe, 0x08, 0xfe, 0x36, 0xfe, 0x36, 0xfe, 0x6f, 0xfe, 0x6f, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xf4, 0xfe, 0xf4, 0xfe, 0x35, 0xff, 0x35, 0xff, 0x70, 0xff, 0x70, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0x27, 0x00, 0x27, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0x06, 0x01, 0x06, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0xcc, 0x01, 0xcc, 0x01, 0x0c, 0x02, 0x0c, 0x02, 0x42, 0x02, 0x42, 0x02, 0x6e, 0x02, 0x6e, 0x02, 0x8f, 0x02, 0x8f, 0x02, 0x9e, 0x02, 0x9e, 0x02, 0x95, 0x02, 0x95, 0x02, 0x72, 0x02, 0x72, 0x02, 0x3e, 0x02, 0x3e, 0x02, 0x00, 0x02, 0x00, 0x02, 0xbe, 0x01, 0xbe, 0x01, 0x7e, 0x01, 0x7e, 0x01, 0x40, 0x01, 0x40, 0x01, 0x04, 0x01, 0x04, 0x01, 0xc8, 0x00, 0xc8, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x55, 0x00, 0x55, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0xe8, 0xff, 0xe8, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x49, 0xff, 0x49, 0xff, 0x11, 0xff, 0x11, 0xff, 0xd3, 0xfe, 0xd3, 0xfe, 0x90, 0xfe, 0x90, 0xfe, 0x4a, 0xfe, 0x4a, 0xfe, 0x04, 0xfe, 0x04, 0xfe, 0xc4, 0xfd, 0xc4, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0x60, 0xfd, 0x60, 0xfd, 0x41, 0xfd, 0x41, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x2b, 0xfd, 0x2b, 0xfd, 0x2f, 0xfd, 0x2f, 0xfd, 0x40, 0xfd, 0x40, 0xfd, 0x61, 0xfd, 0x61, 0xfd, 0x94, 0xfd, 0x94, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0x1a, 0xfe, 0x1a, 0xfe, 0x62, 0xfe, 0x62, 0xfe, 0xaa, 0xfe, 0xaa, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x37, 0xff, 0x37, 0xff, 0x80, 0xff, 0x80, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x48, 0x00, 0x48, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xae, 0x00, 0xae, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x09, 0x01, 0x09, 0x01, 0x39, 0x01, 0x39, 0x01, 0x67, 0x01, 0x67, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0xa7, 0x01, 0xa7, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xc9, 0x01, 0xc9, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xc5, 0x01, 0xc5, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x57, 0x01, 0x57, 0x01, 0x19, 0x01, 0x19, 0x01, 0xdb, 0x00, 0xdb, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x71, 0x00, 0x71, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x39, 0x00, 0x39, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x92, 0x00, 0x92, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xec, 0x00, 0xec, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0x25, 0x01, 0x25, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x20, 0x01, 0x20, 0x01, 0x06, 0x01, 0x06, 0x01, 0xdd, 0x00, 0xdd, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0x65, 0x00, 0x65, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0xce, 0xff, 0xce, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x24, 0xff, 0x24, 0xff, 0xcf, 0xfe, 0xcf, 0xfe, 0x7c, 0xfe, 0x7c, 0xfe, 0x2e, 0xfe, 0x2e, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xaa, 0xfd, 0xaa, 0xfd, 0x7a, 0xfd, 0x7a, 0xfd, 0x55, 0xfd, 0x55, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0x2c, 0xfd, 0x2c, 0xfd, 0x24, 0xfd, 0x24, 0xfd, 0x29, 0xfd, 0x29, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0x63, 0xfd, 0x63, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0xe7, 0xfd, 0xe7, 0xfd, 0x40, 0xfe, 0x40, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x24, 0xff, 0x24, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x53, 0x00, 0x53, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xa9, 0x01, 0xa9, 0x01, 0x4b, 0x02, 0x4b, 0x02, 0xe0, 0x02, 0xe0, 0x02, 0x66, 0x03, 0x66, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x32, 0x04, 0x32, 0x04, 0x6c, 0x04, 0x6c, 0x04, 0x83, 0x04, 0x83, 0x04, 0x75, 0x04, 0x75, 0x04, 0x45, 0x04, 0x45, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0x97, 0x03, 0x97, 0x03, 0x1f, 0x03, 0x1f, 0x03, 0x96, 0x02, 0x96, 0x02, 0xfb, 0x01, 0xfb, 0x01, 0x53, 0x01, 0x53, 0x01, 0x9f, 0x00, 0x9f, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x7e, 0xfe, 0x7e, 0xfe, 0xd8, 0xfd, 0xd8, 0xfd, 0x3a, 0xfd, 0x3a, 0xfd, 0xa6, 0xfc, 0xa6, 0xfc, 0x21, 0xfc, 0x21, 0xfc, 0xb5, 0xfb, 0xb5, 0xfb, 0x6c, 0xfb, 0x6c, 0xfb, 0x47, 0xfb, 0x47, 0xfb, 0x47, 0xfb, 0x47, 0xfb, 0x6a, 0xfb, 0x6a, 0xfb, 0xaf, 0xfb, 0xaf, 0xfb, 0x17, 0xfc, 0x17, 0xfc, 0xa1, 0xfc, 0xa1, 0xfc, 0x48, 0xfd, 0x48, 0xfd, 0x08, 0xfe, 0x08, 0xfe, 0xda, 0xfe, 0xda, 0xfe, 0xb8, 0xff, 0xb8, 0xff, 0x98, 0x00, 0x98, 0x00, 0x78, 0x01, 0x78, 0x01, 0x52, 0x02, 0x52, 0x02, 0x22, 0x03, 0x22, 0x03, 0xe8, 0x03, 0xe8, 0x03, 0x9b, 0x04, 0x9b, 0x04, 0x33, 0x05, 0x33, 0x05, 0xa6, 0x05, 0xa6, 0x05, 0xf2, 0x05, 0xf2, 0x05, 0x19, 0x06, 0x19, 0x06, 0x1f, 0x06, 0x1f, 0x06, 0x04, 0x06, 0x04, 0x06, 0xc4, 0x05, 0xc4, 0x05, 0x5b, 0x05, 0x5b, 0x05, 0xc7, 0x04, 0xc7, 0x04, 0x0e, 0x04, 0x0e, 0x04, 0x3b, 0x03, 0x3b, 0x03, 0x55, 0x02, 0x55, 0x02, 0x60, 0x01, 0x60, 0x01, 0x61, 0x00, 0x61, 0x00, 0x5a, 0xff, 0x5a, 0xff, 0x4d, 0xfe, 0x4d, 0xfe, 0x47, 0xfd, 0x47, 0xfd, 0x52, 0xfc, 0x52, 0xfc, 0x77, 0xfb, 0x77, 0xfb, 0xb9, 0xfa, 0xb9, 0xfa, 0x1d, 0xfa, 0x1d, 0xfa, 0xa7, 0xf9, 0xa7, 0xf9, 0x57, 0xf9, 0x57, 0xf9, 0x30, 0xf9, 0x30, 0xf9, 0x36, 0xf9, 0x36, 0xf9, 0x69, 0xf9, 0x69, 0xf9, 0xc6, 0xf9, 0xc6, 0xf9, 0x4a, 0xfa, 0x4a, 0xfa, 0xf0, 0xfa, 0xf0, 0xfa, 0xb0, 0xfb, 0xb0, 0xfb, 0x81, 0xfc, 0x81, 0xfc, 0x61, 0xfd, 0x61, 0xfd, 0x4a, 0xfe, 0x4a, 0xfe, 0x3c, 0xff, 0x3c, 0xff, 0x31, 0x00, 0x31, 0x00, 0x23, 0x01, 0x23, 0x01, 0x0f, 0x02, 0x0f, 0x02, 0xf1, 0x02, 0xf1, 0x02, 0xc7, 0x03, 0xc7, 0x03, 0x8d, 0x04, 0x8d, 0x04, 0x3c, 0x05, 0x3c, 0x05, 0xce, 0x05, 0xce, 0x05, 0x3d, 0x06, 0x3d, 0x06, 0x88, 0x06, 0x88, 0x06, 0xae, 0x06, 0xae, 0x06, 0xaf, 0x06, 0xaf, 0x06, 0x87, 0x06, 0x87, 0x06, 0x35, 0x06, 0x35, 0x06, 0xbc, 0x05, 0xbc, 0x05, 0x1d, 0x05, 0x1d, 0x05, 0x5f, 0x04, 0x5f, 0x04, 0x88, 0x03, 0x88, 0x03, 0xa2, 0x02, 0xa2, 0x02, 0xb1, 0x01, 0xb1, 0x01, 0xbe, 0x00, 0xbe, 0x00, 0xd2, 0xff, 0xd2, 0xff, 0xf0, 0xfe, 0xf0, 0xfe, 0x1c, 0xfe, 0x1c, 0xfe, 0x5b, 0xfd, 0x5b, 0xfd, 0xb5, 0xfc, 0xb5, 0xfc, 0x2e, 0xfc, 0x2e, 0xfc, 0xc5, 0xfb, 0xc5, 0xfb, 0x75, 0xfb, 0x75, 0xfb, 0x3d, 0xfb, 0x3d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x19, 0xfb, 0x19, 0xfb, 0x31, 0xfb, 0x31, 0xfb, 0x65, 0xfb, 0x65, 0xfb, 0xae, 0xfb, 0xae, 0xfb, 0x06, 0xfc, 0x06, 0xfc, 0x66, 0xfc, 0x66, 0xfc, 0xce, 0xfc, 0xce, 0xfc, 0x41, 0xfd, 0x41, 0xfd, 0xbf, 0xfd, 0xbf, 0xfd, 0x47, 0xfe, 0x47, 0xfe, 0xd0, 0xfe, 0xd0, 0xfe, 0x5b, 0xff, 0x5b, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0x5b, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x1f, 0x01, 0x1f, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0xa9, 0x01, 0xa9, 0x01, 0xda, 0x01, 0xda, 0x01, 0xfc, 0x01, 0xfc, 0x01, 0x0e, 0x02, 0x0e, 0x02, 0x0b, 0x02, 0x0b, 0x02, 0xf9, 0x01, 0xf9, 0x01, 0xda, 0x01, 0xda, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x60, 0x01, 0x60, 0x01, 0x34, 0x01, 0x34, 0x01, 0x05, 0x01, 0x05, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x62, 0x00, 0x62, 0x00, 0x55, 0x00, 0x55, 0x00, 0x53, 0x00, 0x53, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x63, 0x00, 0x63, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x56, 0x00, 0x56, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0xe9, 0xff, 0xe9, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x78, 0xff, 0x78, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xdc, 0xfe, 0xdc, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x53, 0xfe, 0x53, 0xfe, 0x2d, 0xfe, 0x2d, 0xfe, 0x11, 0xfe, 0x11, 0xfe, 0xfc, 0xfd, 0xfc, 0xfd, 0xec, 0xfd, 0xec, 0xfd, 0xdf, 0xfd, 0xdf, 0xfd, 0xd3, 0xfd, 0xd3, 0xfd, 0xc9, 0xfd, 0xc9, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xcc, 0xfd, 0xcc, 0xfd, 0xe3, 0xfd, 0xe3, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0x45, 0xfe, 0x45, 0xfe, 0x90, 0xfe, 0x90, 0xfe, 0xe9, 0xfe, 0xe9, 0xfe, 0x53, 0xff, 0x53, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0x50, 0x00, 0x50, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x6c, 0x01, 0x6c, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0x79, 0x02, 0x79, 0x02, 0xea, 0x02, 0xea, 0x02, 0x4b, 0x03, 0x4b, 0x03, 0x98, 0x03, 0x98, 0x03, 0xd1, 0x03, 0xd1, 0x03, 0xf4, 0x03, 0xf4, 0x03, 0x03, 0x04, 0x03, 0x04, 0xfd, 0x03, 0xfd, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xab, 0x03, 0xab, 0x03, 0x5e, 0x03, 0x5e, 0x03, 0xfe, 0x02, 0xfe, 0x02, 0x8c, 0x02, 0x8c, 0x02, 0x09, 0x02, 0x09, 0x02, 0x7b, 0x01, 0x7b, 0x01, 0xe2, 0x00, 0xe2, 0x00, 0x44, 0x00, 0x44, 0x00, 0xa4, 0xff, 0xa4, 0xff, 0x08, 0xff, 0x08, 0xff, 0x74, 0xfe, 0x74, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0x6e, 0xfd, 0x6e, 0xfd, 0xfd, 0xfc, 0xfd, 0xfc, 0x99, 0xfc, 0x99, 0xfc, 0x47, 0xfc, 0x47, 0xfc, 0x0c, 0xfc, 0x0c, 0xfc, 0xec, 0xfb, 0xec, 0xfb, 0xea, 0xfb, 0xea, 0xfb, 0x05, 0xfc, 0x05, 0xfc, 0x38, 0xfc, 0x38, 0xfc, 0x7d, 0xfc, 0x7d, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0x33, 0xfd, 0x33, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0x3e, 0xfe, 0x3e, 0xfe, 0xe4, 0xfe, 0xe4, 0xfe, 0x97, 0xff, 0x97, 0xff, 0x50, 0x00, 0x50, 0x00, 0x03, 0x01, 0x03, 0x01, 0xa6, 0x01, 0xa6, 0x01, 0x36, 0x02, 0x36, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x2c, 0x03, 0x2c, 0x03, 0x91, 0x03, 0x91, 0x03, 0xe4, 0x03, 0xe4, 0x03, 0x1d, 0x04, 0x1d, 0x04, 0x35, 0x04, 0x35, 0x04, 0x27, 0x04, 0x27, 0x04, 0xf7, 0x03, 0xf7, 0x03, 0xb1, 0x03, 0xb1, 0x03, 0x5b, 0x03, 0x5b, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x83, 0x02, 0x83, 0x02, 0xfa, 0x01, 0xfa, 0x01, 0x61, 0x01, 0x61, 0x01, 0xbe, 0x00, 0xbe, 0x00, 0x19, 0x00, 0x19, 0x00, 0x7c, 0xff, 0x7c, 0xff, 0xf0, 0xfe, 0xf0, 0xfe, 0x78, 0xfe, 0x78, 0xfe, 0x14, 0xfe, 0x14, 0xfe, 0xbf, 0xfd, 0xbf, 0xfd, 0x75, 0xfd, 0x75, 0xfd, 0x38, 0xfd, 0x38, 0xfd, 0x0c, 0xfd, 0x0c, 0xfd, 0xf6, 0xfc, 0xf6, 0xfc, 0xf4, 0xfc, 0xf4, 0xfc, 0x06, 0xfd, 0x06, 0xfd, 0x26, 0xfd, 0x26, 0xfd, 0x4e, 0xfd, 0x4e, 0xfd, 0x7d, 0xfd, 0x7d, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0xf7, 0xfd, 0xf7, 0xfd, 0x48, 0xfe, 0x48, 0xfe, 0xaa, 0xfe, 0xaa, 0xfe, 0x1c, 0xff, 0x1c, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x22, 0x00, 0x22, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x1c, 0x01, 0x1c, 0x01, 0x87, 0x01, 0x87, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0x35, 0x02, 0x35, 0x02, 0x75, 0x02, 0x75, 0x02, 0x9f, 0x02, 0x9f, 0x02, 0xaf, 0x02, 0xaf, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0x7d, 0x02, 0x7d, 0x02, 0x42, 0x02, 0x42, 0x02, 0xf9, 0x01, 0xf9, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0x57, 0x01, 0x57, 0x01, 0x04, 0x01, 0x04, 0x01, 0xad, 0x00, 0xad, 0x00, 0x53, 0x00, 0x53, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0x97, 0xff, 0x97, 0xff, 0x44, 0xff, 0x44, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xc9, 0xfe, 0xc9, 0xfe, 0x9c, 0xfe, 0x9c, 0xfe, 0x76, 0xfe, 0x76, 0xfe, 0x57, 0xfe, 0x57, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x3a, 0xfe, 0x3a, 0xfe, 0x3d, 0xfe, 0x3d, 0xfe, 0x4a, 0xfe, 0x4a, 0xfe, 0x5b, 0xfe, 0x5b, 0xfe, 0x71, 0xfe, 0x71, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0xac, 0xfe, 0xac, 0xfe, 0xd6, 0xfe, 0xd6, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x48, 0xff, 0x48, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0x25, 0x00, 0x25, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x48, 0x01, 0x48, 0x01, 0xad, 0x01, 0xad, 0x01, 0x07, 0x02, 0x07, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x82, 0x02, 0x82, 0x02, 0x9e, 0x02, 0x9e, 0x02, 0xa7, 0x02, 0xa7, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0x90, 0x02, 0x90, 0x02, 0x6a, 0x02, 0x6a, 0x02, 0x2f, 0x02, 0x2f, 0x02, 0xe2, 0x01, 0xe2, 0x01, 0x86, 0x01, 0x86, 0x01, 0x24, 0x01, 0x24, 0x01, 0xc4, 0x00, 0xc4, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x84, 0xff, 0x84, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0xf4, 0xfe, 0xf4, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0x30, 0xfe, 0x30, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0xa7, 0xfd, 0xa7, 0xfd, 0x67, 0xfd, 0x67, 0xfd, 0x2f, 0xfd, 0x2f, 0xfd, 0x02, 0xfd, 0x02, 0xfd, 0xe2, 0xfc, 0xe2, 0xfc, 0xd1, 0xfc, 0xd1, 0xfc, 0xd1, 0xfc, 0xd1, 0xfc, 0xe5, 0xfc, 0xe5, 0xfc, 0x10, 0xfd, 0x10, 0xfd, 0x53, 0xfd, 0x53, 0xfd, 0xab, 0xfd, 0xab, 0xfd, 0x15, 0xfe, 0x15, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x08, 0xff, 0x08, 0xff, 0x87, 0xff, 0x87, 0xff, 0x04, 0x00, 0x04, 0x00, 0x80, 0x00, 0x80, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x6c, 0x01, 0x6c, 0x01, 0xcf, 0x01, 0xcf, 0x01, 0x1f, 0x02, 0x1f, 0x02, 0x59, 0x02, 0x59, 0x02, 0x81, 0x02, 0x81, 0x02, 0x99, 0x02, 0x99, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0x9e, 0x02, 0x9e, 0x02, 0x87, 0x02, 0x87, 0x02, 0x65, 0x02, 0x65, 0x02, 0x3b, 0x02, 0x3b, 0x02, 0x0d, 0x02, 0x0d, 0x02, 0xd9, 0x01, 0xd9, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x5e, 0x01, 0x5e, 0x01, 0x11, 0x01, 0x11, 0x01, 0xba, 0x00, 0xba, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x41, 0xff, 0x41, 0xff, 0xea, 0xfe, 0xea, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0xf7, 0xfd, 0xf7, 0xfd, 0xba, 0xfd, 0xba, 0xfd, 0x92, 0xfd, 0x92, 0xfd, 0x87, 0xfd, 0x87, 0xfd, 0x97, 0xfd, 0x97, 0xfd, 0xb8, 0xfd, 0xb8, 0xfd, 0xe5, 0xfd, 0xe5, 0xfd, 0x19, 0xfe, 0x19, 0xfe, 0x53, 0xfe, 0x53, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0x28, 0xff, 0x28, 0xff, 0x77, 0xff, 0x77, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x2e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x69, 0x00, 0x69, 0x00, 0x84, 0x00, 0x84, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xda, 0x00, 0xda, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x01, 0x04, 0x01, 0x14, 0x01, 0x14, 0x01, 0x24, 0x01, 0x24, 0x01, 0x34, 0x01, 0x34, 0x01, 0x40, 0x01, 0x40, 0x01, 0x45, 0x01, 0x45, 0x01, 0x40, 0x01, 0x40, 0x01, 0x30, 0x01, 0x30, 0x01, 0x18, 0x01, 0x18, 0x01, 0xfb, 0x00, 0xfb, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x81, 0x00, 0x81, 0x00, 0x69, 0x00, 0x69, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x64, 0x00, 0x64, 0x00, 0x73, 0x00, 0x73, 0x00, 0x83, 0x00, 0x83, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x55, 0x00, 0x55, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x19, 0x00, 0x19, 0x00, 0xeb, 0xff, 0xeb, 0xff, 0xac, 0xff, 0xac, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x0c, 0xff, 0x0c, 0xff, 0xbd, 0xfe, 0xbd, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x3e, 0xfe, 0x3e, 0xfe, 0x10, 0xfe, 0x10, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0xce, 0xfd, 0xce, 0xfd, 0xb9, 0xfd, 0xb9, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0xac, 0xfd, 0xac, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xce, 0xfd, 0xce, 0xfd, 0xf1, 0xfd, 0xf1, 0xfd, 0x1a, 0xfe, 0x1a, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x73, 0xfe, 0x73, 0xfe, 0xa2, 0xfe, 0xa2, 0xfe, 0xd4, 0xfe, 0xd4, 0xfe, 0x07, 0xff, 0x07, 0xff, 0x3e, 0xff, 0x3e, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0x26, 0x00, 0x26, 0x00, 0x85, 0x00, 0x85, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x3e, 0x01, 0x3e, 0x01, 0x93, 0x01, 0x93, 0x01, 0xe3, 0x01, 0xe3, 0x01, 0x2c, 0x02, 0x2c, 0x02, 0x6e, 0x02, 0x6e, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0xd0, 0x02, 0xd0, 0x02, 0xea, 0x02, 0xea, 0x02, 0xf0, 0x02, 0xf0, 0x02, 0xe8, 0x02, 0xe8, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xc0, 0x02, 0xc0, 0x02, 0xad, 0x02, 0xad, 0x02, 0x9d, 0x02, 0x9d, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0x76, 0x02, 0x76, 0x02, 0x5f, 0x02, 0x5f, 0x02, 0x48, 0x02, 0x48, 0x02, 0x32, 0x02, 0x32, 0x02, 0x1b, 0x02, 0x1b, 0x02, 0xff, 0x01, 0xff, 0x01, 0xdb, 0x01, 0xdb, 0x01, 0xae, 0x01, 0xae, 0x01, 0x75, 0x01, 0x75, 0x01, 0x37, 0x01, 0x37, 0x01, 0xf5, 0x00, 0xf5, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0x79, 0x00, 0x79, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x03, 0x00, 0xc7, 0xff, 0xc7, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x54, 0xff, 0x54, 0xff, 0x22, 0xff, 0x22, 0xff, 0xf2, 0xfe, 0xf2, 0xfe, 0xbf, 0xfe, 0xbf, 0xfe, 0x85, 0xfe, 0x85, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0xf9, 0xfd, 0xf9, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0x63, 0xfd, 0x63, 0xfd, 0x20, 0xfd, 0x20, 0xfd, 0xe3, 0xfc, 0xe3, 0xfc, 0xa9, 0xfc, 0xa9, 0xfc, 0x73, 0xfc, 0x73, 0xfc, 0x45, 0xfc, 0x45, 0xfc, 0x24, 0xfc, 0x24, 0xfc, 0x15, 0xfc, 0x15, 0xfc, 0x1b, 0xfc, 0x1b, 0xfc, 0x35, 0xfc, 0x35, 0xfc, 0x61, 0xfc, 0x61, 0xfc, 0x9c, 0xfc, 0x9c, 0xfc, 0xe5, 0xfc, 0xe5, 0xfc, 0x3c, 0xfd, 0x3c, 0xfd, 0x9f, 0xfd, 0x9f, 0xfd, 0x11, 0xfe, 0x11, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x15, 0xff, 0x15, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x29, 0x00, 0x29, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x32, 0x01, 0x32, 0x01, 0xae, 0x01, 0xae, 0x01, 0x22, 0x02, 0x22, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0xef, 0x02, 0xef, 0x02, 0x3f, 0x03, 0x3f, 0x03, 0x82, 0x03, 0x82, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xe9, 0x03, 0xe9, 0x03, 0x0c, 0x04, 0x0c, 0x04, 0x1e, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x1f, 0x04, 0x0a, 0x04, 0x0a, 0x04, 0xde, 0x03, 0xde, 0x03, 0x9c, 0x03, 0x9c, 0x03, 0x4a, 0x03, 0x4a, 0x03, 0xed, 0x02, 0xed, 0x02, 0x88, 0x02, 0x88, 0x02, 0x19, 0x02, 0x19, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x94, 0x00, 0x94, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x86, 0xff, 0x86, 0xff, 0x0e, 0xff, 0x0e, 0xff, 0xa3, 0xfe, 0xa3, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0xf5, 0xfd, 0xf5, 0xfd, 0xae, 0xfd, 0xae, 0xfd, 0x73, 0xfd, 0x73, 0xfd, 0x45, 0xfd, 0x45, 0xfd, 0x22, 0xfd, 0x22, 0xfd, 0x0d, 0xfd, 0x0d, 0xfd, 0x05, 0xfd, 0x05, 0xfd, 0x07, 0xfd, 0x07, 0xfd, 0x11, 0xfd, 0x11, 0xfd, 0x21, 0xfd, 0x21, 0xfd, 0x3b, 0xfd, 0x3b, 0xfd, 0x5e, 0xfd, 0x5e, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0x5c, 0xfe, 0x5c, 0xfe, 0xb3, 0xfe, 0xb3, 0xfe, 0x0d, 0xff, 0x0d, 0xff, 0x65, 0xff, 0x65, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0x16, 0x00, 0x16, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x10, 0x01, 0x10, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xb0, 0x01, 0xb0, 0x01, 0xae, 0x01, 0xae, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x7e, 0x01, 0x7e, 0x01, 0x58, 0x01, 0x58, 0x01, 0x27, 0x01, 0x27, 0x01, 0xf1, 0x00, 0xf1, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xd9, 0xff, 0xd9, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0x80, 0xff, 0x80, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x17, 0xff, 0x17, 0xff, 0x04, 0xff, 0x04, 0xff, 0xf3, 0xfe, 0xf3, 0xfe, 0xe4, 0xfe, 0xe4, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xdc, 0xfe, 0xdc, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0x01, 0xff, 0x01, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x45, 0xff, 0x45, 0xff, 0x79, 0xff, 0x79, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x47, 0x00, 0x47, 0x00, 0x90, 0x00, 0x90, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x18, 0x01, 0x18, 0x01, 0x53, 0x01, 0x53, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0xb8, 0x01, 0xb8, 0x01, 0xda, 0x01, 0xda, 0x01, 0xf0, 0x01, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xef, 0x01, 0xef, 0x01, 0xe2, 0x01, 0xe2, 0x01, 0xd2, 0x01, 0xd2, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0x9c, 0x01, 0x9c, 0x01, 0x73, 0x01, 0x73, 0x01, 0x44, 0x01, 0x44, 0x01, 0x13, 0x01, 0x13, 0x01, 0xe2, 0x00, 0xe2, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x77, 0x00, 0x77, 0x00, 0x38, 0x00, 0x38, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xab, 0xff, 0xab, 0xff, 0x62, 0xff, 0x62, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0xd7, 0xfe, 0xd7, 0xfe, 0x96, 0xfe, 0x96, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x22, 0xfe, 0x22, 0xfe, 0xf2, 0xfd, 0xf2, 0xfd, 0xcb, 0xfd, 0xcb, 0xfd, 0xb1, 0xfd, 0xb1, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa6, 0xfd, 0xa6, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xd0, 0xfd, 0xd0, 0xfd, 0xf5, 0xfd, 0xf5, 0xfd, 0x24, 0xfe, 0x24, 0xfe, 0x5b, 0xfe, 0x5b, 0xfe, 0x9a, 0xfe, 0x9a, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0x30, 0xff, 0x30, 0xff, 0x82, 0xff, 0x82, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0x3b, 0x00, 0x3b, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0x14, 0x01, 0x14, 0x01, 0x82, 0x01, 0x82, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x46, 0x02, 0x46, 0x02, 0x99, 0x02, 0x99, 0x02, 0xdd, 0x02, 0xdd, 0x02, 0x11, 0x03, 0x11, 0x03, 0x32, 0x03, 0x32, 0x03, 0x3c, 0x03, 0x3c, 0x03, 0x30, 0x03, 0x30, 0x03, 0x0a, 0x03, 0x0a, 0x03, 0xcf, 0x02, 0xcf, 0x02, 0x83, 0x02, 0x83, 0x02, 0x2d, 0x02, 0x2d, 0x02, 0xd3, 0x01, 0xd3, 0x01, 0x76, 0x01, 0x76, 0x01, 0x16, 0x01, 0x16, 0x01, 0xb3, 0x00, 0xb3, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xe7, 0xff, 0xe7, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x18, 0xff, 0x18, 0xff, 0xb2, 0xfe, 0xb2, 0xfe, 0x50, 0xfe, 0x50, 0xfe, 0xf2, 0xfd, 0xf2, 0xfd, 0x97, 0xfd, 0x97, 0xfd, 0x42, 0xfd, 0x42, 0xfd, 0xf8, 0xfc, 0xf8, 0xfc, 0xbc, 0xfc, 0xbc, 0xfc, 0x93, 0xfc, 0x93, 0xfc, 0x81, 0xfc, 0x81, 0xfc, 0x85, 0xfc, 0x85, 0xfc, 0xa0, 0xfc, 0xa0, 0xfc, 0xcd, 0xfc, 0xcd, 0xfc, 0x09, 0xfd, 0x09, 0xfd, 0x54, 0xfd, 0x54, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0x1a, 0xfe, 0x1a, 0xfe, 0x8f, 0xfe, 0x8f, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x88, 0xff, 0x88, 0xff, 0x02, 0x00, 0x02, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x6f, 0x01, 0x6f, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x58, 0x02, 0x58, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xfd, 0x02, 0xfd, 0x02, 0x2b, 0x03, 0x2b, 0x03, 0x46, 0x03, 0x46, 0x03, 0x53, 0x03, 0x53, 0x03, 0x56, 0x03, 0x56, 0x03, 0x4e, 0x03, 0x4e, 0x03, 0x36, 0x03, 0x36, 0x03, 0x0c, 0x03, 0x0c, 0x03, 0xd2, 0x02, 0xd2, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0x3f, 0x02, 0x3f, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xa6, 0x01, 0xa6, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x07, 0x01, 0x07, 0x01, 0xa6, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0xc7, 0xff, 0xc7, 0xff, 0x55, 0xff, 0x55, 0xff, 0xe7, 0xfe, 0xe7, 0xfe, 0x80, 0xfe, 0x80, 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0xc3, 0xfd, 0xc3, 0xfd, 0x70, 0xfd, 0x70, 0xfd, 0x2d, 0xfd, 0x2d, 0xfd, 0xfe, 0xfc, 0xfe, 0xfc, 0xe6, 0xfc, 0xe6, 0xfc, 0xe5, 0xfc, 0xe5, 0xfc, 0xf8, 0xfc, 0xf8, 0xfc, 0x19, 0xfd, 0x19, 0xfd, 0x45, 0xfd, 0x45, 0xfd, 0x7a, 0xfd, 0x7a, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xf3, 0xfd, 0xf3, 0xfd, 0x35, 0xfe, 0x35, 0xfe, 0x7b, 0xfe, 0x7b, 0xfe, 0xc6, 0xfe, 0xc6, 0xfe, 0x0f, 0xff, 0x0f, 0xff, 0x56, 0xff, 0x56, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x32, 0x00, 0x32, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x1a, 0x01, 0x1a, 0x01, 0x6e, 0x01, 0x6e, 0x01, 0xc3, 0x01, 0xc3, 0x01, 0x14, 0x02, 0x14, 0x02, 0x60, 0x02, 0x60, 0x02, 0xa4, 0x02, 0xa4, 0x02, 0xde, 0x02, 0xde, 0x02, 0x0e, 0x03, 0x0e, 0x03, 0x31, 0x03, 0x31, 0x03, 0x45, 0x03, 0x45, 0x03, 0x46, 0x03, 0x46, 0x03, 0x33, 0x03, 0x33, 0x03, 0x0a, 0x03, 0x0a, 0x03, 0xce, 0x02, 0xce, 0x02, 0x86, 0x02, 0x86, 0x02, 0x32, 0x02, 0x32, 0x02, 0xd7, 0x01, 0xd7, 0x01, 0x74, 0x01, 0x74, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0xa2, 0x00, 0xa2, 0x00, 0x38, 0x00, 0x38, 0x00, 0xce, 0xff, 0xce, 0xff, 0x66, 0xff, 0x66, 0xff, 0x03, 0xff, 0x03, 0xff, 0xa4, 0xfe, 0xa4, 0xfe, 0x48, 0xfe, 0x48, 0xfe, 0xef, 0xfd, 0xef, 0xfd, 0x95, 0xfd, 0x95, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0xe5, 0xfc, 0xe5, 0xfc, 0x94, 0xfc, 0x94, 0xfc, 0x4f, 0xfc, 0x4f, 0xfc, 0x15, 0xfc, 0x15, 0xfc, 0xe8, 0xfb, 0xe8, 0xfb, 0xcc, 0xfb, 0xcc, 0xfb, 0xc3, 0xfb, 0xc3, 0xfb, 0xcf, 0xfb, 0xcf, 0xfb, 0xf2, 0xfb, 0xf2, 0xfb, 0x2f, 0xfc, 0x2f, 0xfc, 0x84, 0xfc, 0x84, 0xfc, 0xee, 0xfc, 0xee, 0xfc, 0x67, 0xfd, 0x67, 0xfd, 0xee, 0xfd, 0xee, 0xfd, 0x81, 0xfe, 0x81, 0xfe, 0x1f, 0xff, 0x1f, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0x6d, 0x00, 0x6d, 0x00, 0x13, 0x01, 0x13, 0x01, 0xb1, 0x01, 0xb1, 0x01, 0x42, 0x02, 0x42, 0x02, 0xc6, 0x02, 0xc6, 0x02, 0x3a, 0x03, 0x3a, 0x03, 0x9e, 0x03, 0x9e, 0x03, 0xf3, 0x03, 0xf3, 0x03, 0x38, 0x04, 0x38, 0x04, 0x6a, 0x04, 0x6a, 0x04, 0x89, 0x04, 0x89, 0x04, 0x95, 0x04, 0x95, 0x04, 0x8e, 0x04, 0x8e, 0x04, 0x78, 0x04, 0x78, 0x04, 0x51, 0x04, 0x51, 0x04, 0x19, 0x04, 0x19, 0x04, 0xcd, 0x03, 0xcd, 0x03, 0x6d, 0x03, 0x6d, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x73, 0x02, 0x73, 0x02, 0xde, 0x01, 0xde, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x97, 0x00, 0x97, 0x00, 0xe8, 0xff, 0xe8, 0xff, 0x36, 0xff, 0x36, 0xff, 0x88, 0xfe, 0x88, 0xfe, 0xe1, 0xfd, 0xe1, 0xfd, 0x47, 0xfd, 0x47, 0xfd, 0xc0, 0xfc, 0xc0, 0xfc, 0x51, 0xfc, 0x51, 0xfc, 0x01, 0xfc, 0x01, 0xfc, 0xcc, 0xfb, 0xcc, 0xfb, 0xaf, 0xfb, 0xaf, 0xfb, 0xa9, 0xfb, 0xa9, 0xfb, 0xb9, 0xfb, 0xb9, 0xfb, 0xe0, 0xfb, 0xe0, 0xfb, 0x1a, 0xfc, 0x1a, 0xfc, 0x66, 0xfc, 0x66, 0xfc, 0xc0, 0xfc, 0xc0, 0xfc, 0x23, 0xfd, 0x23, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0xfc, 0xfd, 0xfc, 0xfd, 0x73, 0xfe, 0x73, 0xfe, 0xf2, 0xfe, 0xf2, 0xfe, 0x75, 0xff, 0x75, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x80, 0x00, 0x80, 0x00, 0x05, 0x01, 0x05, 0x01, 0x86, 0x01, 0x86, 0x01, 0xfd, 0x01, 0xfd, 0x01, 0x67, 0x02, 0x67, 0x02, 0xc2, 0x02, 0xc2, 0x02, 0x0c, 0x03, 0x0c, 0x03, 0x43, 0x03, 0x43, 0x03, 0x60, 0x03, 0x60, 0x03, 0x64, 0x03, 0x64, 0x03, 0x4a, 0x03, 0x4a, 0x03, 0x16, 0x03, 0x16, 0x03, 0xc9, 0x02, 0xc9, 0x02, 0x64, 0x02, 0x64, 0x02, 0xeb, 0x01, 0xeb, 0x01, 0x62, 0x01, 0x62, 0x01, 0xd0, 0x00, 0xd0, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0xae, 0xff, 0xae, 0xff, 0x29, 0xff, 0x29, 0xff, 0xae, 0xfe, 0xae, 0xfe, 0x40, 0xfe, 0x40, 0xfe, 0xe2, 0xfd, 0xe2, 0xfd, 0x96, 0xfd, 0x96, 0xfd, 0x5a, 0xfd, 0x5a, 0xfd, 0x2d, 0xfd, 0x2d, 0xfd, 0x12, 0xfd, 0x12, 0xfd, 0x0c, 0xfd, 0x0c, 0xfd, 0x1b, 0xfd, 0x1b, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0x70, 0xfd, 0x70, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0x08, 0xfe, 0x08, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x5a, 0xff, 0x5a, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0x6a, 0x00, 0x6a, 0x00, 0xf5, 0x00, 0xf5, 0x00, 0x7f, 0x01, 0x7f, 0x01, 0x01, 0x02, 0x01, 0x02, 0x76, 0x02, 0x76, 0x02, 0xdd, 0x02, 0xdd, 0x02, 0x35, 0x03, 0x35, 0x03, 0x7d, 0x03, 0x7d, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xcb, 0x03, 0xcb, 0x03, 0xcf, 0x03, 0xcf, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0x93, 0x03, 0x93, 0x03, 0x59, 0x03, 0x59, 0x03, 0x0b, 0x03, 0x0b, 0x03, 0xaa, 0x02, 0xaa, 0x02, 0x39, 0x02, 0x39, 0x02, 0xb9, 0x01, 0xb9, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x99, 0x00, 0x99, 0x00, 0x02, 0x00, 0x02, 0x00, 0x6d, 0xff, 0x6d, 0xff, 0xe0, 0xfe, 0xe0, 0xfe, 0x59, 0xfe, 0x59, 0xfe, 0xd9, 0xfd, 0xd9, 0xfd, 0x64, 0xfd, 0x64, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xa7, 0xfc, 0xa7, 0xfc, 0x69, 0xfc, 0x69, 0xfc, 0x47, 0xfc, 0x47, 0xfc, 0x41, 0xfc, 0x41, 0xfc, 0x56, 0xfc, 0x56, 0xfc, 0x83, 0xfc, 0x83, 0xfc, 0xc5, 0xfc, 0xc5, 0xfc, 0x1b, 0xfd, 0x1b, 0xfd, 0x84, 0xfd, 0x84, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0x88, 0xfe, 0x88, 0xfe, 0x1a, 0xff, 0x1a, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0x3e, 0x00, 0x3e, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x43, 0x01, 0x43, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0x14, 0x02, 0x14, 0x02, 0x65, 0x02, 0x65, 0x02, 0xa7, 0x02, 0xa7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x06, 0x03, 0x06, 0x03, 0x03, 0x03, 0x03, 0x03, 0xf0, 0x02, 0xf0, 0x02, 0xcf, 0x02, 0xcf, 0x02, 0xa2, 0x02, 0xa2, 0x02, 0x68, 0x02, 0x68, 0x02, 0x26, 0x02, 0x26, 0x02, 0xd9, 0x01, 0xd9, 0x01, 0x81, 0x01, 0x81, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0xad, 0x00, 0xad, 0x00, 0x37, 0x00, 0x37, 0x00, 0xbf, 0xff, 0xbf, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0xe2, 0xfe, 0xe2, 0xfe, 0x84, 0xfe, 0x84, 0xfe, 0x32, 0xfe, 0x32, 0xfe, 0xed, 0xfd, 0xed, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0x70, 0xfd, 0x70, 0xfd, 0x6b, 0xfd, 0x6b, 0xfd, 0x7b, 0xfd, 0x7b, 0xfd, 0x9e, 0xfd, 0x9e, 0xfd, 0xcc, 0xfd, 0xcc, 0xfd, 0x00, 0xfe, 0x00, 0xfe, 0x36, 0xfe, 0x36, 0xfe, 0x6f, 0xfe, 0x6f, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0xea, 0xfe, 0xea, 0xfe, 0x2a, 0xff, 0x2a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x09, 0x00, 0x09, 0x00, 0x26, 0x00, 0x26, 0x00, 0x43, 0x00, 0x43, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x75, 0x00, 0x75, 0x00, 0x86, 0x00, 0x86, 0x00, 0x93, 0x00, 0x93, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xec, 0x00, 0xec, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0x01, 0x01, 0x01, 0x01, 0x11, 0x01, 0x11, 0x01, 0x20, 0x01, 0x20, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x32, 0x01, 0x32, 0x01, 0x37, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x48, 0x01, 0x48, 0x01, 0x56, 0x01, 0x56, 0x01, 0x62, 0x01, 0x62, 0x01, 0x68, 0x01, 0x68, 0x01, 0x62, 0x01, 0x62, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x04, 0x01, 0x04, 0x01, 0xd2, 0x00, 0xd2, 0x00, 0x96, 0x00, 0x96, 0x00, 0x50, 0x00, 0x50, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0xd8, 0xfe, 0xd8, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0x10, 0xfe, 0x10, 0xfe, 0xb4, 0xfd, 0xb4, 0xfd, 0x5f, 0xfd, 0x5f, 0xfd, 0x16, 0xfd, 0x16, 0xfd, 0xdb, 0xfc, 0xdb, 0xfc, 0xb3, 0xfc, 0xb3, 0xfc, 0x9f, 0xfc, 0x9f, 0xfc, 0xa1, 0xfc, 0xa1, 0xfc, 0xb6, 0xfc, 0xb6, 0xfc, 0xe0, 0xfc, 0xe0, 0xfc, 0x1e, 0xfd, 0x1e, 0xfd, 0x6f, 0xfd, 0x6f, 0xfd, 0xd0, 0xfd, 0xd0, 0xfd, 0x3b, 0xfe, 0x3b, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0x2b, 0xff, 0x2b, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0x2a, 0x00, 0x2a, 0x00, 0xab, 0x00, 0xab, 0x00, 0x2d, 0x01, 0x2d, 0x01, 0xac, 0x01, 0xac, 0x01, 0x23, 0x02, 0x23, 0x02, 0x91, 0x02, 0x91, 0x02, 0xf2, 0x02, 0xf2, 0x02, 0x46, 0x03, 0x46, 0x03, 0x8c, 0x03, 0x8c, 0x03, 0xc4, 0x03, 0xc4, 0x03, 0xea, 0x03, 0xea, 0x03, 0xfb, 0x03, 0xfb, 0x03, 0xf3, 0x03, 0xf3, 0x03, 0xd2, 0x03, 0xd2, 0x03, 0x99, 0x03, 0x99, 0x03, 0x49, 0x03, 0x49, 0x03, 0xe6, 0x02, 0xe6, 0x02, 0x70, 0x02, 0x70, 0x02, 0xe7, 0x01, 0xe7, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0xa2, 0x00, 0xa2, 0x00, 0xf1, 0xff, 0xf1, 0xff, 0x41, 0xff, 0x41, 0xff, 0x9d, 0xfe, 0x9d, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0x82, 0xfd, 0x82, 0xfd, 0x08, 0xfd, 0x08, 0xfd, 0x9e, 0xfc, 0x9e, 0xfc, 0x48, 0xfc, 0x48, 0xfc, 0x09, 0xfc, 0x09, 0xfc, 0xe8, 0xfb, 0xe8, 0xfb, 0xe4, 0xfb, 0xe4, 0xfb, 0xf9, 0xfb, 0xf9, 0xfb, 0x24, 0xfc, 0x24, 0xfc, 0x5f, 0xfc, 0x5f, 0xfc, 0xac, 0xfc, 0xac, 0xfc, 0x08, 0xfd, 0x08, 0xfd, 0x78, 0xfd, 0x78, 0xfd, 0xf6, 0xfd, 0xf6, 0xfd, 0x81, 0xfe, 0x81, 0xfe, 0x15, 0xff, 0x15, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x3a, 0x00, 0x3a, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x51, 0x01, 0x51, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0x4c, 0x02, 0x4c, 0x02, 0xb2, 0x02, 0xb2, 0x02, 0x03, 0x03, 0x03, 0x03, 0x40, 0x03, 0x40, 0x03, 0x66, 0x03, 0x66, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x64, 0x03, 0x64, 0x03, 0x3d, 0x03, 0x3d, 0x03, 0x01, 0x03, 0x01, 0x03, 0xb1, 0x02, 0xb1, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0xe1, 0x01, 0xe1, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0xff, 0x00, 0xff, 0x00, 0x91, 0x00, 0x91, 0x00, 0x25, 0x00, 0x25, 0x00, 0xb8, 0xff, 0xb8, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0xf0, 0xfe, 0xf0, 0xfe, 0x9f, 0xfe, 0x9f, 0xfe, 0x5f, 0xfe, 0x5f, 0xfe, 0x31, 0xfe, 0x31, 0xfe, 0x14, 0xfe, 0x14, 0xfe, 0x03, 0xfe, 0x03, 0xfe, 0xfb, 0xfd, 0xfb, 0xfd, 0xfb, 0xfd, 0xfb, 0xfd, 0x04, 0xfe, 0x04, 0xfe, 0x19, 0xfe, 0x19, 0xfe, 0x3c, 0xfe, 0x3c, 0xfe, 0x70, 0xfe, 0x70, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x3f, 0xff, 0x3f, 0xff, 0x88, 0xff, 0x88, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0x20, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x0b, 0x01, 0x0b, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x87, 0x01, 0x87, 0x01, 0xac, 0x01, 0xac, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xad, 0x01, 0xad, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0x5e, 0x01, 0x5e, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0xd7, 0x00, 0xd7, 0x00, 0x87, 0x00, 0x87, 0x00, 0x32, 0x00, 0x32, 0x00, 0xdc, 0xff, 0xdc, 0xff, 0x87, 0xff, 0x87, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0xf9, 0xfe, 0xf9, 0xfe, 0xc6, 0xfe, 0xc6, 0xfe, 0xa0, 0xfe, 0xa0, 0xfe, 0x89, 0xfe, 0x89, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xbb, 0xfe, 0xbb, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0x0e, 0xff, 0x0e, 0xff, 0x41, 0xff, 0x41, 0xff, 0x79, 0xff, 0x79, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x31, 0x00, 0x31, 0x00, 0x71, 0x00, 0x71, 0x00, 0xad, 0x00, 0xad, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0x1e, 0x01, 0x1e, 0x01, 0x4d, 0x01, 0x4d, 0x01, 0x72, 0x01, 0x72, 0x01, 0x88, 0x01, 0x88, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0x83, 0x01, 0x83, 0x01, 0x68, 0x01, 0x68, 0x01, 0x40, 0x01, 0x40, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xc9, 0x00, 0xc9, 0x00, 0x81, 0x00, 0x81, 0x00, 0x34, 0x00, 0x34, 0x00, 0xe2, 0xff, 0xe2, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x38, 0xff, 0x38, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x9d, 0xfe, 0x9d, 0xfe, 0x5e, 0xfe, 0x5e, 0xfe, 0x2f, 0xfe, 0x2f, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe, 0xfa, 0xfd, 0xfa, 0xfd, 0xf4, 0xfd, 0xf4, 0xfd, 0xfa, 0xfd, 0xfa, 0xfd, 0x0e, 0xfe, 0x0e, 0xfe, 0x32, 0xfe, 0x32, 0xfe, 0x67, 0xfe, 0x67, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0x55, 0xff, 0x55, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x70, 0x00, 0x70, 0x00, 0xce, 0x00, 0xce, 0x00, 0x28, 0x01, 0x28, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0xfc, 0x01, 0xfc, 0x01, 0x29, 0x02, 0x29, 0x02, 0x47, 0x02, 0x47, 0x02, 0x58, 0x02, 0x58, 0x02, 0x5b, 0x02, 0x5b, 0x02, 0x4d, 0x02, 0x4d, 0x02, 0x31, 0x02, 0x31, 0x02, 0x05, 0x02, 0x05, 0x02, 0xca, 0x01, 0xca, 0x01, 0x81, 0x01, 0x81, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0xd1, 0x00, 0xd1, 0x00, 0x73, 0x00, 0x73, 0x00, 0x11, 0x00, 0x11, 0x00, 0xad, 0xff, 0xad, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0xed, 0xfe, 0xed, 0xfe, 0x9b, 0xfe, 0x9b, 0xfe, 0x58, 0xfe, 0x58, 0xfe, 0x24, 0xfe, 0x24, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xef, 0xfd, 0xef, 0xfd, 0xeb, 0xfd, 0xeb, 0xfd, 0xf4, 0xfd, 0xf4, 0xfd, 0x09, 0xfe, 0x09, 0xfe, 0x28, 0xfe, 0x28, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0x15, 0xff, 0x15, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xed, 0xff, 0xed, 0xff, 0x2f, 0x00, 0x2f, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x08, 0x01, 0x08, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x44, 0x01, 0x3b, 0x01, 0x3b, 0x01, 0x28, 0x01, 0x28, 0x01, 0x0d, 0x01, 0x0d, 0x01, 0xee, 0x00, 0xee, 0x00, 0xca, 0x00, 0xca, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x71, 0x00, 0x71, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xd9, 0xff, 0xd9, 0xff, 0xab, 0xff, 0xab, 0xff, 0x82, 0xff, 0x82, 0xff, 0x62, 0xff, 0x62, 0xff, 0x47, 0xff, 0x47, 0xff, 0x31, 0xff, 0x31, 0xff, 0x22, 0xff, 0x22, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x24, 0xff, 0x24, 0xff, 0x39, 0xff, 0x39, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x89, 0xff, 0x89, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x85, 0x00, 0x85, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x06, 0x01, 0x06, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0xa2, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa5, 0x01, 0xa5, 0x01, 0x99, 0x01, 0x99, 0x01, 0x81, 0x01, 0x81, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0xf4, 0x00, 0xf4, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x64, 0x00, 0x64, 0x00, 0x17, 0x00, 0x17, 0x00, 0xc8, 0xff, 0xc8, 0xff, 0x79, 0xff, 0x79, 0xff, 0x28, 0xff, 0x28, 0xff, 0xd8, 0xfe, 0xd8, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x1c, 0xfe, 0x1c, 0xfe, 0xf8, 0xfd, 0xf8, 0xfd, 0xe2, 0xfd, 0xe2, 0xfd, 0xda, 0xfd, 0xda, 0xfd, 0xe0, 0xfd, 0xe0, 0xfd, 0xf4, 0xfd, 0xf4, 0xfd, 0x14, 0xfe, 0x14, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x82, 0xfe, 0x82, 0xfe, 0xcc, 0xfe, 0xcc, 0xfe, 0x1f, 0xff, 0x1f, 0xff, 0x75, 0xff, 0x75, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0x23, 0x00, 0x23, 0x00, 0x77, 0x00, 0x77, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x12, 0x01, 0x12, 0x01, 0x53, 0x01, 0x53, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xf5, 0x01, 0xf5, 0x01, 0xdc, 0x01, 0xdc, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x85, 0x01, 0x85, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xc7, 0x00, 0xc7, 0x00, 0x81, 0x00, 0x81, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x37, 0xff, 0x37, 0xff, 0x16, 0xff, 0x16, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x12, 0xff, 0x12, 0xff, 0x22, 0xff, 0x22, 0xff, 0x34, 0xff, 0x34, 0xff, 0x49, 0xff, 0x49, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x73, 0xff, 0x73, 0xff, 0x85, 0xff, 0x85, 0xff, 0x95, 0xff, 0x95, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xac, 0xff, 0xac, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x15, 0x00, 0x15, 0x00, 0x31, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x68, 0x00, 0x68, 0x00, 0x85, 0x00, 0x85, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xca, 0x00, 0xce, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x83, 0x00, 0x83, 0x00, 0x67, 0x00, 0x67, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x15, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x69, 0x00, 0x69, 0x00, 0x71, 0x00, 0x71, 0x00, 0x74, 0x00, 0x74, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x24, 0x00, 0x02, 0x00, 0x02, 0x00, 0xdc, 0xff, 0xdc, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x62, 0xff, 0x62, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x16, 0xff, 0x16, 0xff, 0xf9, 0xfe, 0xf9, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0xd1, 0xfe, 0xd1, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe, 0x20, 0xff, 0x20, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x82, 0xff, 0x82, 0xff, 0xba, 0xff, 0xba, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x3e, 0x00, 0x3e, 0x00, 0x86, 0x00, 0x86, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x44, 0x01, 0x44, 0x01, 0x71, 0x01, 0x71, 0x01, 0x94, 0x01, 0x94, 0x01, 0xae, 0x01, 0xae, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xbe, 0x01, 0xbe, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0x98, 0x01, 0x98, 0x01, 0x70, 0x01, 0x70, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x02, 0x01, 0x02, 0x01, 0xc1, 0x00, 0xc1, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0xda, 0xff, 0xda, 0xff, 0x83, 0xff, 0x83, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0xd6, 0xfe, 0xd6, 0xfe, 0x88, 0xfe, 0x88, 0xfe, 0x41, 0xfe, 0x41, 0xfe, 0x03, 0xfe, 0x03, 0xfe, 0xd1, 0xfd, 0xd1, 0xfd, 0xae, 0xfd, 0xae, 0xfd, 0x9b, 0xfd, 0x9b, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0xe1, 0xfd, 0xe1, 0xfd, 0x23, 0xfe, 0x23, 0xfe, 0x74, 0xfe, 0x74, 0xfe, 0xd1, 0xfe, 0xd1, 0xfe, 0x38, 0xff, 0x38, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x92, 0x00, 0x92, 0x00, 0x05, 0x01, 0x05, 0x01, 0x70, 0x01, 0x70, 0x01, 0xce, 0x01, 0xce, 0x01, 0x1d, 0x02, 0x1d, 0x02, 0x5c, 0x02, 0x5c, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb1, 0x02, 0xb1, 0x02, 0x99, 0x02, 0x99, 0x02, 0x6d, 0x02, 0x6d, 0x02, 0x32, 0x02, 0x32, 0x02, 0xe9, 0x01, 0xe9, 0x01, 0x95, 0x01, 0x95, 0x01, 0x33, 0x01, 0x33, 0x01, 0xc5, 0x00, 0xc5, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xcd, 0xfe, 0xcd, 0xfe, 0x52, 0xfe, 0x52, 0xfe, 0xe1, 0xfd, 0xe1, 0xfd, 0x7a, 0xfd, 0x7a, 0xfd, 0x22, 0xfd, 0x22, 0xfd, 0xd7, 0xfc, 0xd7, 0xfc, 0x9c, 0xfc, 0x9c, 0xfc, 0x75, 0xfc, 0x75, 0xfc, 0x61, 0xfc, 0x61, 0xfc, 0x63, 0xfc, 0x63, 0xfc, 0x79, 0xfc, 0x79, 0xfc, 0xa3, 0xfc, 0xa3, 0xfc, 0xe2, 0xfc, 0xe2, 0xfc, 0x35, 0xfd, 0x35, 0xfd, 0x9b, 0xfd, 0x9b, 0xfd, 0x10, 0xfe, 0x10, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0x23, 0xff, 0x23, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0x4c, 0x00, 0x4c, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x6f, 0x01, 0x6f, 0x01, 0xf2, 0x01, 0xf2, 0x01, 0x68, 0x02, 0x68, 0x02, 0xcd, 0x02, 0xcd, 0x02, 0x21, 0x03, 0x21, 0x03, 0x60, 0x03, 0x60, 0x03, 0x8d, 0x03, 0x8d, 0x03, 0xa7, 0x03, 0xa7, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xa6, 0x03, 0xa6, 0x03, 0x8a, 0x03, 0x8a, 0x03, 0x5f, 0x03, 0x5f, 0x03, 0x26, 0x03, 0x26, 0x03, 0xde, 0x02, 0xde, 0x02, 0x89, 0x02, 0x89, 0x02, 0x29, 0x02, 0x29, 0x02, 0xbe, 0x01, 0xbe, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0xc5, 0xff, 0xc5, 0xff, 0x3e, 0xff, 0x3e, 0xff, 0xbb, 0xfe, 0xbb, 0xfe, 0x3b, 0xfe, 0x3b, 0xfe, 0xc6, 0xfd, 0xc6, 0xfd, 0x5e, 0xfd, 0x5e, 0xfd, 0x05, 0xfd, 0x05, 0xfd, 0xbe, 0xfc, 0xbe, 0xfc, 0x8c, 0xfc, 0x8c, 0xfc, 0x70, 0xfc, 0x70, 0xfc, 0x67, 0xfc, 0x67, 0xfc, 0x77, 0xfc, 0x77, 0xfc, 0x9c, 0xfc, 0x9c, 0xfc, 0xd6, 0xfc, 0xd6, 0xfc, 0x21, 0xfd, 0x21, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x59, 0xfe, 0x59, 0xfe, 0xd0, 0xfe, 0xd0, 0xfe, 0x49, 0xff, 0x49, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0x35, 0x00, 0x35, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x14, 0x01, 0x14, 0x01, 0x7d, 0x01, 0x7d, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0x3c, 0x02, 0x3c, 0x02, 0x91, 0x02, 0x91, 0x02, 0xde, 0x02, 0xde, 0x02, 0x20, 0x03, 0x20, 0x03, 0x55, 0x03, 0x55, 0x03, 0x7f, 0x03, 0x7f, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0xa4, 0x03, 0xa4, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x43, 0x03, 0x43, 0x03, 0xfa, 0x02, 0xfa, 0x02, 0xa0, 0x02, 0xa0, 0x02, 0x34, 0x02, 0x34, 0x02, 0xba, 0x01, 0xba, 0x01, 0x34, 0x01, 0x34, 0x01, 0xa8, 0x00, 0xa8, 0x00, 0x19, 0x00, 0x19, 0x00, 0x8d, 0xff, 0x8d, 0xff, 0x08, 0xff, 0x08, 0xff, 0x8b, 0xfe, 0x8b, 0xfe, 0x1d, 0xfe, 0x1d, 0xfe, 0xbc, 0xfd, 0xbc, 0xfd, 0x6b, 0xfd, 0x6b, 0xfd, 0x2a, 0xfd, 0x2a, 0xfd, 0xf5, 0xfc, 0xf5, 0xfc, 0xcd, 0xfc, 0xcd, 0xfc, 0xb2, 0xfc, 0xb2, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa1, 0xfc, 0xa1, 0xfc, 0xab, 0xfc, 0xab, 0xfc, 0xbf, 0xfc, 0xbf, 0xfc, 0xe1, 0xfc, 0xe1, 0xfc, 0x14, 0xfd, 0x14, 0xfd, 0x55, 0xfd, 0x55, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0x62, 0xfe, 0x62, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0x3e, 0xff, 0x3e, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0x2c, 0x00, 0x2c, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0xc3, 0x01, 0xc3, 0x01, 0x06, 0x02, 0x06, 0x02, 0x3a, 0x02, 0x3a, 0x02, 0x5b, 0x02, 0x5b, 0x02, 0x6d, 0x02, 0x6d, 0x02, 0x6f, 0x02, 0x6f, 0x02, 0x62, 0x02, 0x62, 0x02, 0x4c, 0x02, 0x4c, 0x02, 0x2a, 0x02, 0x2a, 0x02, 0x02, 0x02, 0x02, 0x02, 0xd1, 0x01, 0xd1, 0x01, 0x9c, 0x01, 0x9c, 0x01, 0x63, 0x01, 0x63, 0x01, 0x24, 0x01, 0x24, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x68, 0x00, 0x68, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x74, 0xff, 0x74, 0xff, 0x54, 0xff, 0x54, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x22, 0xff, 0x22, 0xff, 0x20, 0xff, 0x20, 0xff, 0x24, 0xff, 0x24, 0xff, 0x30, 0xff, 0x30, 0xff, 0x43, 0xff, 0x43, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x77, 0xff, 0x77, 0xff, 0x99, 0xff, 0x99, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x09, 0x00, 0x09, 0x00, 0x25, 0x00, 0x25, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x57, 0x00, 0x57, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x53, 0x00, 0x53, 0x00, 0x42, 0x00, 0x42, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xee, 0xff, 0xee, 0xff, 0xce, 0xff, 0xce, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x70, 0xff, 0x70, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x43, 0xff, 0x43, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x43, 0xff, 0x43, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x84, 0xff, 0x84, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x23, 0x00, 0x23, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x72, 0x00, 0x72, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0xe6, 0x00, 0xe6, 0x00, 0x05, 0x01, 0x05, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x21, 0x01, 0x21, 0x01, 0x0f, 0x01, 0x0f, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x32, 0x00, 0x32, 0x00, 0x08, 0x00, 0x08, 0x00, 0xde, 0xff, 0xde, 0xff, 0xba, 0xff, 0xba, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x82, 0xff, 0x82, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x52, 0xff, 0x52, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x48, 0xff, 0x48, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x51, 0xff, 0x51, 0xff, 0x58, 0xff, 0x58, 0xff, 0x61, 0xff, 0x61, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x80, 0xff, 0x80, 0xff, 0x96, 0xff, 0x96, 0xff, 0xac, 0xff, 0xac, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x18, 0x00, 0x18, 0x00, 0x37, 0x00, 0x37, 0x00, 0x54, 0x00, 0x54, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x81, 0x00, 0x81, 0x00, 0x92, 0x00, 0x92, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x93, 0x00, 0x93, 0x00, 0x84, 0x00, 0x84, 0x00, 0x74, 0x00, 0x74, 0x00, 0x62, 0x00, 0x62, 0x00, 0x50, 0x00, 0x50, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x13, 0x00, 0x13, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x03, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x96, 0xff, 0x96, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x75, 0xff, 0x75, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x61, 0xff, 0x61, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x63, 0xff, 0x63, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x52, 0x00, 0x52, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x82, 0x00, 0x82, 0x00, 0x93, 0x00, 0x93, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xad, 0x00, 0xad, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x99, 0x00, 0x99, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x79, 0x00, 0x79, 0x00, 0x64, 0x00, 0x64, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xef, 0xff, 0xef, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xae, 0xff, 0xae, 0xff, 0x90, 0xff, 0x90, 0xff, 0x73, 0xff, 0x73, 0xff, 0x59, 0xff, 0x59, 0xff, 0x45, 0xff, 0x45, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x39, 0xff, 0x39, 0xff, 0x41, 0xff, 0x41, 0xff, 0x52, 0xff, 0x52, 0xff, 0x68, 0xff, 0x68, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xce, 0xff, 0xce, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x24, 0x00, 0x24, 0x00, 0x53, 0x00, 0x53, 0x00, 0x82, 0x00, 0x82, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x14, 0x01, 0x14, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x39, 0x01, 0x39, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x39, 0x01, 0x39, 0x01, 0x28, 0x01, 0x28, 0x01, 0x0e, 0x01, 0x0e, 0x01, 0xec, 0x00, 0xec, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x93, 0x00, 0x93, 0x00, 0x58, 0x00, 0x58, 0x00, 0x17, 0x00, 0x17, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x81, 0xff, 0x81, 0xff, 0x33, 0xff, 0x33, 0xff, 0xe9, 0xfe, 0xe9, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x5b, 0xfe, 0x5b, 0xfe, 0x1a, 0xfe, 0x1a, 0xfe, 0xe2, 0xfd, 0xe2, 0xfd, 0xb5, 0xfd, 0xb5, 0xfd, 0x95, 0xfd, 0x95, 0xfd, 0x86, 0xfd, 0x86, 0xfd, 0x8a, 0xfd, 0x8a, 0xfd, 0xa0, 0xfd, 0xa0, 0xfd, 0xc7, 0xfd, 0xc7, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0x43, 0xfe, 0x43, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0xf7, 0xfe, 0xf7, 0xfe, 0x5e, 0xff, 0x5e, 0xff, 0xca, 0xff, 0xca, 0xff, 0x35, 0x00, 0x35, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x00, 0x01, 0x00, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0xab, 0x01, 0xab, 0x01, 0xf0, 0x01, 0xf0, 0x01, 0x29, 0x02, 0x29, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x8a, 0x02, 0x8a, 0x02, 0x92, 0x02, 0x92, 0x02, 0x8c, 0x02, 0x8c, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x5c, 0x02, 0x5c, 0x02, 0x2f, 0x02, 0x2f, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0x52, 0x01, 0x52, 0x01, 0xf3, 0x00, 0xf3, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x24, 0x00, 0x24, 0x00, 0xb7, 0xff, 0xb7, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0x42, 0xfe, 0x42, 0xfe, 0x0a, 0xfe, 0x0a, 0xfe, 0xe7, 0xfd, 0xe7, 0xfd, 0xda, 0xfd, 0xda, 0xfd, 0xdf, 0xfd, 0xdf, 0xfd, 0xf9, 0xfd, 0xf9, 0xfd, 0x26, 0xfe, 0x26, 0xfe, 0x63, 0xfe, 0x63, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x02, 0xff, 0x02, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0xba, 0xff, 0xba, 0xff, 0x11, 0x00, 0x11, 0x00, 0x64, 0x00, 0x64, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x2b, 0x01, 0x2b, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0x80, 0x01, 0x80, 0x01, 0x98, 0x01, 0x98, 0x01, 0xa2, 0x01, 0xa2, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x40, 0x01, 0x40, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x84, 0x00, 0x84, 0x00, 0x31, 0x00, 0x31, 0x00, 0xd9, 0xff, 0xd9, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x28, 0xff, 0x28, 0xff, 0xd6, 0xfe, 0xd6, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0xdb, 0xfd, 0xdb, 0xfd, 0xba, 0xfd, 0xba, 0xfd, 0xaa, 0xfd, 0xaa, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0xc3, 0xfd, 0xc3, 0xfd, 0xeb, 0xfd, 0xeb, 0xfd, 0x24, 0xfe, 0x24, 0xfe, 0x6d, 0xfe, 0x6d, 0xfe, 0xc4, 0xfe, 0xc4, 0xfe, 0x25, 0xff, 0x25, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x6d, 0x00, 0x6d, 0x00, 0xda, 0x00, 0xda, 0x00, 0x3d, 0x01, 0x3d, 0x01, 0x97, 0x01, 0x97, 0x01, 0xe7, 0x01, 0xe7, 0x01, 0x2b, 0x02, 0x2b, 0x02, 0x60, 0x02, 0x60, 0x02, 0x83, 0x02, 0x83, 0x02, 0x95, 0x02, 0x95, 0x02, 0x94, 0x02, 0x94, 0x02, 0x81, 0x02, 0x81, 0x02, 0x5d, 0x02, 0x5d, 0x02, 0x2b, 0x02, 0x2b, 0x02, 0xec, 0x01, 0xec, 0x01, 0xa4, 0x01, 0xa4, 0x01, 0x55, 0x01, 0x55, 0x01, 0xff, 0x00, 0xff, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x44, 0x00, 0x44, 0x00, 0xe7, 0xff, 0xe7, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x32, 0xff, 0x32, 0xff, 0xdf, 0xfe, 0xdf, 0xfe, 0x92, 0xfe, 0x92, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x15, 0xfe, 0x15, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0xa3, 0xfd, 0xa3, 0xfd, 0xa9, 0xfd, 0xa9, 0xfd, 0xc0, 0xfd, 0xc0, 0xfd, 0xe8, 0xfd, 0xe8, 0xfd, 0x20, 0xfe, 0x20, 0xfe, 0x6a, 0xfe, 0x6a, 0xfe, 0xc4, 0xfe, 0xc4, 0xfe, 0x2a, 0xff, 0x2a, 0xff, 0x96, 0xff, 0x96, 0xff, 0x04, 0x00, 0x04, 0x00, 0x71, 0x00, 0x71, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x3d, 0x01, 0x3d, 0x01, 0x93, 0x01, 0x93, 0x01, 0xdd, 0x01, 0xdd, 0x01, 0x16, 0x02, 0x16, 0x02, 0x3c, 0x02, 0x3c, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x53, 0x02, 0x53, 0x02, 0x48, 0x02, 0x48, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0x0a, 0x02, 0x0a, 0x02, 0xde, 0x01, 0xde, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0xe9, 0x00, 0xe9, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x15, 0x00, 0x15, 0x00, 0xce, 0xff, 0xce, 0xff, 0x87, 0xff, 0x87, 0xff, 0x40, 0xff, 0x40, 0xff, 0xfa, 0xfe, 0xfa, 0xfe, 0xb7, 0xfe, 0xb7, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x3d, 0xfe, 0x3d, 0xfe, 0x0a, 0xfe, 0x0a, 0xfe, 0xe1, 0xfd, 0xe1, 0xfd, 0xc3, 0xfd, 0xc3, 0xfd, 0xb5, 0xfd, 0xb5, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe4, 0xfd, 0xe4, 0xfd, 0x11, 0xfe, 0x11, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0x39, 0xff, 0x39, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0x32, 0x00, 0x32, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x26, 0x01, 0x26, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x70, 0x01, 0x70, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0xae, 0x01, 0xae, 0x01, 0xb9, 0x01, 0xb9, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0xc6, 0x01, 0xc6, 0x01, 0xc4, 0x01, 0xc4, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0x93, 0x01, 0x93, 0x01, 0x75, 0x01, 0x75, 0x01, 0x52, 0x01, 0x52, 0x01, 0x29, 0x01, 0x29, 0x01, 0xfa, 0x00, 0xfa, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x90, 0x00, 0x90, 0x00, 0x58, 0x00, 0x58, 0x00, 0x21, 0x00, 0x21, 0x00, 0xec, 0xff, 0xec, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0x88, 0xff, 0x88, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x04, 0xff, 0x04, 0xff, 0xf2, 0xfe, 0xf2, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xdf, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xec, 0xfe, 0xec, 0xfe, 0xf4, 0xfe, 0xf4, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x10, 0xff, 0x10, 0xff, 0x19, 0xff, 0x19, 0xff, 0x24, 0xff, 0x24, 0xff, 0x32, 0xff, 0x32, 0xff, 0x42, 0xff, 0x42, 0xff, 0x53, 0xff, 0x53, 0xff, 0x65, 0xff, 0x65, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x92, 0xff, 0x92, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x27, 0x00, 0x27, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x60, 0x00, 0x60, 0x00, 0x67, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x74, 0x00, 0x78, 0x00, 0x78, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x84, 0x00, 0x84, 0x00, 0x89, 0x00, 0x89, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x95, 0x00, 0x95, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x95, 0x00, 0x95, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x82, 0x00, 0x82, 0x00, 0x72, 0x00, 0x72, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0x95, 0xff, 0x95, 0xff, 0x84, 0xff, 0x84, 0xff, 0x75, 0xff, 0x75, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x64, 0xff, 0x64, 0xff, 0x60, 0xff, 0x60, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x54, 0xff, 0x54, 0xff, 0x50, 0xff, 0x50, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x46, 0xff, 0x46, 0xff, 0x43, 0xff, 0x43, 0xff, 0x43, 0xff, 0x43, 0xff, 0x49, 0xff, 0x49, 0xff, 0x53, 0xff, 0x53, 0xff, 0x60, 0xff, 0x60, 0xff, 0x71, 0xff, 0x71, 0xff, 0x89, 0xff, 0x89, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x24, 0x00, 0x24, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x99, 0x00, 0x99, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xff, 0x00, 0xff, 0x00, 0x05, 0x01, 0x05, 0x01, 0x09, 0x01, 0x09, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x09, 0x01, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xe6, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x89, 0x00, 0x89, 0x00, 0x59, 0x00, 0x59, 0x00, 0x21, 0x00, 0x21, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x69, 0xff, 0x69, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0xf3, 0xfe, 0xf3, 0xfe, 0xbd, 0xfe, 0xbd, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x69, 0xfe, 0x69, 0xfe, 0x4d, 0xfe, 0x4d, 0xfe, 0x3f, 0xfe, 0x3f, 0xfe, 0x3c, 0xfe, 0x3c, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x52, 0xfe, 0x52, 0xfe, 0x6a, 0xfe, 0x6a, 0xfe, 0x89, 0xfe, 0x89, 0xfe, 0xb1, 0xfe, 0xb1, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0x17, 0xff, 0x17, 0xff, 0x53, 0xff, 0x53, 0xff, 0x94, 0xff, 0x94, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0x1b, 0x00, 0x1b, 0x00, 0x60, 0x00, 0x60, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xee, 0x00, 0xee, 0x00, 0x31, 0x01, 0x31, 0x01, 0x70, 0x01, 0x70, 0x01, 0xac, 0x01, 0xac, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0x17, 0x02, 0x17, 0x02, 0x3c, 0x02, 0x3c, 0x02, 0x53, 0x02, 0x53, 0x02, 0x5d, 0x02, 0x5d, 0x02, 0x57, 0x02, 0x57, 0x02, 0x41, 0x02, 0x41, 0x02, 0x1c, 0x02, 0x1c, 0x02, 0xe9, 0x01, 0xe9, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0x03, 0x01, 0x03, 0x01, 0xa4, 0x00, 0xa4, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0xd8, 0xff, 0xd8, 0xff, 0x71, 0xff, 0x71, 0xff, 0x0e, 0xff, 0x0e, 0xff, 0xb0, 0xfe, 0xb0, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x0c, 0xfe, 0x0c, 0xfe, 0xcd, 0xfd, 0xcd, 0xfd, 0x9f, 0xfd, 0x9f, 0xfd, 0x7f, 0xfd, 0x7f, 0xfd, 0x71, 0xfd, 0x71, 0xfd, 0x73, 0xfd, 0x73, 0xfd, 0x82, 0xfd, 0x82, 0xfd, 0x9e, 0xfd, 0x9e, 0xfd, 0xc7, 0xfd, 0xc7, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0x42, 0xfe, 0x42, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0x3b, 0xff, 0x3b, 0xff, 0x98, 0xff, 0x98, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x59, 0x00, 0x59, 0x00, 0xba, 0x00, 0xba, 0x00, 0x1a, 0x01, 0x1a, 0x01, 0x74, 0x01, 0x74, 0x01, 0xc6, 0x01, 0xc6, 0x01, 0x0d, 0x02, 0x0d, 0x02, 0x48, 0x02, 0x48, 0x02, 0x78, 0x02, 0x78, 0x02, 0x98, 0x02, 0x98, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0x9b, 0x02, 0x9b, 0x02, 0x7d, 0x02, 0x7d, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x10, 0x02, 0x10, 0x02, 0xc3, 0x01, 0xc3, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x12, 0x01, 0x12, 0x01, 0xb2, 0x00, 0xb2, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0x84, 0xff, 0x84, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0xd6, 0xfe, 0xd6, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x49, 0xfe, 0x49, 0xfe, 0x15, 0xfe, 0x15, 0xfe, 0xef, 0xfd, 0xef, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xca, 0xfd, 0xca, 0xfd, 0xc9, 0xfd, 0xc9, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x03, 0xfe, 0x03, 0xfe, 0x29, 0xfe, 0x29, 0xfe, 0x57, 0xfe, 0x57, 0xfe, 0x8d, 0xfe, 0x8d, 0xfe, 0xc8, 0xfe, 0xc8, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x46, 0xff, 0x46, 0xff, 0x87, 0xff, 0x87, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0x07, 0x00, 0x07, 0x00, 0x41, 0x00, 0x41, 0x00, 0x77, 0x00, 0x77, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xed, 0x00, 0xed, 0x00, 0x03, 0x01, 0x03, 0x01, 0x10, 0x01, 0x10, 0x01, 0x15, 0x01, 0x15, 0x01, 0x13, 0x01, 0x13, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xfb, 0x00, 0xfb, 0x00, 0xe6, 0x00, 0xe6, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x94, 0x00, 0x94, 0x00, 0x78, 0x00, 0x78, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x37, 0x00, 0x37, 0x00, 0x35, 0x00, 0x35, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x71, 0x00, 0x71, 0x00, 0x85, 0x00, 0x85, 0x00, 0x97, 0x00, 0x97, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xca, 0x00, 0xca, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x99, 0x00, 0x99, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x58, 0x00, 0x58, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0x86, 0xff, 0x86, 0xff, 0x47, 0xff, 0x47, 0xff, 0x06, 0xff, 0x06, 0xff, 0xc6, 0xfe, 0xc6, 0xfe, 0x88, 0xfe, 0x88, 0xfe, 0x51, 0xfe, 0x51, 0xfe, 0x23, 0xfe, 0x23, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xe5, 0xfd, 0xe5, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0xdd, 0xfd, 0xdd, 0xfd, 0xf5, 0xfd, 0xf5, 0xfd, 0x18, 0xfe, 0x18, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0xba, 0xfe, 0xba, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x43, 0xff, 0x43, 0xff, 0x87, 0xff, 0x87, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x51, 0x00, 0x51, 0x00, 0x90, 0x00, 0x90, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x26, 0x01, 0x26, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x83, 0x01, 0x83, 0x01, 0x91, 0x01, 0x91, 0x01, 0x95, 0x01, 0x95, 0x01, 0x90, 0x01, 0x90, 0x01, 0x84, 0x01, 0x84, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x52, 0x01, 0x52, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x08, 0x01, 0x08, 0x01, 0xde, 0x00, 0xde, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x81, 0x00, 0x81, 0x00, 0x54, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xef, 0xff, 0xef, 0xff, 0xda, 0xff, 0xda, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x29, 0x00, 0x31, 0x00, 0x31, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0xea, 0xff, 0xea, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0x85, 0xff, 0x85, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x38, 0xff, 0x38, 0xff, 0x13, 0xff, 0x13, 0xff, 0xef, 0xfe, 0xef, 0xfe, 0xcc, 0xfe, 0xcc, 0xfe, 0xac, 0xfe, 0xac, 0xfe, 0x91, 0xfe, 0x91, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x59, 0xfe, 0x59, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x55, 0xfe, 0x55, 0xfe, 0x60, 0xfe, 0x60, 0xfe, 0x76, 0xfe, 0x76, 0xfe, 0x96, 0xfe, 0x96, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x2b, 0xff, 0x2b, 0xff, 0x70, 0xff, 0x70, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x08, 0x01, 0x08, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0xa7, 0x01, 0xa7, 0x01, 0xec, 0x01, 0xec, 0x01, 0x27, 0x02, 0x27, 0x02, 0x57, 0x02, 0x57, 0x02, 0x7e, 0x02, 0x7e, 0x02, 0x9a, 0x02, 0x9a, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0x99, 0x02, 0x99, 0x02, 0x7c, 0x02, 0x7c, 0x02, 0x52, 0x02, 0x52, 0x02, 0x1a, 0x02, 0x1a, 0x02, 0xdb, 0x01, 0xdb, 0x01, 0x95, 0x01, 0x95, 0x01, 0x49, 0x01, 0x49, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x47, 0xff, 0x47, 0xff, 0xf9, 0xfe, 0xf9, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0x2d, 0xfe, 0x2d, 0xfe, 0xf4, 0xfd, 0xf4, 0xfd, 0xc3, 0xfd, 0xc3, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0x86, 0xfd, 0x86, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0xa2, 0xfd, 0xa2, 0xfd, 0xc7, 0xfd, 0xc7, 0xfd, 0xf7, 0xfd, 0xf7, 0xfd, 0x30, 0xfe, 0x30, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x96, 0xff, 0x96, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0x30, 0x00, 0x30, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x12, 0x01, 0x12, 0x01, 0x50, 0x01, 0x50, 0x01, 0x86, 0x01, 0x86, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0x02, 0x02, 0x02, 0x02, 0x1d, 0x02, 0x1d, 0x02, 0x2d, 0x02, 0x2d, 0x02, 0x34, 0x02, 0x34, 0x02, 0x2f, 0x02, 0x2f, 0x02, 0x21, 0x02, 0x21, 0x02, 0x0b, 0x02, 0x0b, 0x02, 0xec, 0x01, 0xec, 0x01, 0xc4, 0x01, 0xc4, 0x01, 0x98, 0x01, 0x98, 0x01, 0x67, 0x01, 0x67, 0x01, 0x30, 0x01, 0x30, 0x01, 0xf3, 0x00, 0xf3, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x70, 0x00, 0x70, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xee, 0xff, 0xee, 0xff, 0xac, 0xff, 0xac, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x28, 0xff, 0x28, 0xff, 0xe8, 0xfe, 0xe8, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x1b, 0xfe, 0x1b, 0xfe, 0xf9, 0xfd, 0xf9, 0xfd, 0xde, 0xfd, 0xde, 0xfd, 0xca, 0xfd, 0xca, 0xfd, 0xc2, 0xfd, 0xc2, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xf3, 0xfd, 0xf3, 0xfd, 0x19, 0xfe, 0x19, 0xfe, 0x48, 0xfe, 0x48, 0xfe, 0x81, 0xfe, 0x81, 0xfe, 0xc4, 0xfe, 0xc4, 0xfe, 0x10, 0xff, 0x10, 0xff, 0x65, 0xff, 0x65, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x1b, 0x00, 0x1b, 0x00, 0x78, 0x00, 0x78, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x27, 0x01, 0x27, 0x01, 0x78, 0x01, 0x78, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0x04, 0x02, 0x04, 0x02, 0x3d, 0x02, 0x3d, 0x02, 0x6a, 0x02, 0x6a, 0x02, 0x8c, 0x02, 0x8c, 0x02, 0xa4, 0x02, 0xa4, 0x02, 0xb3, 0x02, 0xb3, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0x88, 0x02, 0x88, 0x02, 0x61, 0x02, 0x61, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0xf0, 0x01, 0xf0, 0x01, 0xa7, 0x01, 0xa7, 0x01, 0x55, 0x01, 0x55, 0x01, 0xfc, 0x00, 0xfc, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x35, 0x00, 0x35, 0x00, 0xc9, 0xff, 0xc9, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0xf1, 0xfe, 0xf1, 0xfe, 0x89, 0xfe, 0x89, 0xfe, 0x28, 0xfe, 0x28, 0xfe, 0xd1, 0xfd, 0xd1, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0x4f, 0xfd, 0x4f, 0xfd, 0x24, 0xfd, 0x24, 0xfd, 0x08, 0xfd, 0x08, 0xfd, 0xfb, 0xfc, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x0b, 0xfd, 0x0b, 0xfd, 0x29, 0xfd, 0x29, 0xfd, 0x53, 0xfd, 0x53, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0xc9, 0xfd, 0xc9, 0xfd, 0x10, 0xfe, 0x10, 0xfe, 0x5c, 0xfe, 0x5c, 0xfe, 0xae, 0xfe, 0xae, 0xfe, 0x01, 0xff, 0x01, 0xff, 0x55, 0xff, 0x55, 0xff, 0xad, 0xff, 0xad, 0xff, 0x07, 0x00, 0x07, 0x00, 0x60, 0x00, 0x60, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0x0b, 0x01, 0x0b, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0xa5, 0x01, 0xa5, 0x01, 0xe6, 0x01, 0xe6, 0x01, 0x1f, 0x02, 0x1f, 0x02, 0x4d, 0x02, 0x4d, 0x02, 0x6f, 0x02, 0x6f, 0x02, 0x85, 0x02, 0x85, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x89, 0x02, 0x89, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x28, 0x02, 0x28, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xb1, 0x01, 0xb1, 0x01, 0x68, 0x01, 0x68, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x28, 0xff, 0x28, 0xff, 0xf7, 0xfe, 0xf7, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0x90, 0xfe, 0x90, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x73, 0xfe, 0x73, 0xfe, 0x6f, 0xfe, 0x6f, 0xfe, 0x71, 0xfe, 0x71, 0xfe, 0x7b, 0xfe, 0x7b, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xa0, 0xfe, 0xa0, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xec, 0xff, 0xec, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xed, 0x00, 0xed, 0x00, 0x00, 0x01, 0x00, 0x01, 0x08, 0x01, 0x08, 0x01, 0x06, 0x01, 0x06, 0x01, 0xfa, 0x00, 0xfa, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x81, 0x00, 0x81, 0x00, 0x59, 0x00, 0x59, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x05, 0x00, 0x05, 0x00, 0xdf, 0xff, 0xdf, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x87, 0xff, 0x87, 0xff, 0x76, 0xff, 0x76, 0xff, 0x68, 0xff, 0x68, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x53, 0xff, 0x53, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x50, 0xff, 0x50, 0xff, 0x56, 0xff, 0x56, 0xff, 0x60, 0xff, 0x60, 0xff, 0x6d, 0xff, 0x6d, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x95, 0xff, 0x95, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x1e, 0x00, 0x1e, 0x00, 0x49, 0x00, 0x49, 0x00, 0x76, 0x00, 0x76, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0x00, 0x01, 0x00, 0x01, 0x0e, 0x01, 0x0e, 0x01, 0x11, 0x01, 0x11, 0x01, 0x07, 0x01, 0x07, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xce, 0x00, 0xce, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x17, 0x00, 0x17, 0x00, 0xe1, 0xff, 0xe1, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x84, 0xff, 0x84, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x18, 0xff, 0x18, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x03, 0xff, 0x03, 0xff, 0x02, 0xff, 0x02, 0xff, 0x07, 0xff, 0x07, 0xff, 0x10, 0xff, 0x10, 0xff, 0x20, 0xff, 0x20, 0xff, 0x36, 0xff, 0x36, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0x16, 0x00, 0x16, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x17, 0x01, 0x17, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x38, 0x01, 0x38, 0x01, 0x38, 0x01, 0x38, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x12, 0x01, 0x12, 0x01, 0xef, 0x00, 0xef, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x18, 0x00, 0x18, 0x00, 0xe1, 0xff, 0xe1, 0xff, 0xad, 0xff, 0xad, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x55, 0xff, 0x55, 0xff, 0x34, 0xff, 0x34, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0x09, 0xff, 0x09, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0x11, 0xff, 0x11, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x30, 0xff, 0x30, 0xff, 0x49, 0xff, 0x49, 0xff, 0x65, 0xff, 0x65, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x28, 0x00, 0x28, 0x00, 0x58, 0x00, 0x58, 0x00, 0x89, 0x00, 0x89, 0x00, 0xba, 0x00, 0xba, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0x11, 0x01, 0x11, 0x01, 0x35, 0x01, 0x35, 0x01, 0x50, 0x01, 0x50, 0x01, 0x61, 0x01, 0x61, 0x01, 0x66, 0x01, 0x66, 0x01, 0x60, 0x01, 0x60, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x27, 0x01, 0x27, 0x01, 0xf9, 0x00, 0xf9, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x85, 0x00, 0x85, 0x00, 0x44, 0x00, 0x44, 0x00, 0x03, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc3, 0xff, 0x86, 0xff, 0x86, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0xf5, 0xfe, 0xf5, 0xfe, 0xcf, 0xfe, 0xcf, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0x86, 0xfe, 0x86, 0xfe, 0x7c, 0xfe, 0x7c, 0xfe, 0x79, 0xfe, 0x79, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0xaf, 0xfe, 0xaf, 0xfe, 0xcf, 0xfe, 0xcf, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x24, 0xff, 0x24, 0xff, 0x58, 0xff, 0x58, 0xff, 0x92, 0xff, 0x92, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x48, 0x00, 0x48, 0x00, 0x82, 0x00, 0x82, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0x11, 0x01, 0x11, 0x01, 0x31, 0x01, 0x31, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0x64, 0x01, 0x64, 0x01, 0x65, 0x01, 0x65, 0x01, 0x60, 0x01, 0x60, 0x01, 0x57, 0x01, 0x57, 0x01, 0x45, 0x01, 0x45, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xe6, 0x00, 0xe6, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x98, 0x00, 0x98, 0x00, 0x71, 0x00, 0x71, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x25, 0x00, 0x25, 0x00, 0x02, 0x00, 0x02, 0x00, 0xe2, 0xff, 0xe2, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xac, 0xff, 0xac, 0xff, 0x98, 0xff, 0x98, 0xff, 0x88, 0xff, 0x88, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x71, 0xff, 0x71, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x68, 0xff, 0x68, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x72, 0xff, 0x72, 0xff, 0x79, 0xff, 0x79, 0xff, 0x81, 0xff, 0x81, 0xff, 0x89, 0xff, 0x89, 0xff, 0x91, 0xff, 0x91, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xad, 0xff, 0xad, 0xff, 0xae, 0xff, 0xae, 0xff, 0xac, 0xff, 0xac, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x93, 0xff, 0x93, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x89, 0xff, 0x89, 0xff, 0x88, 0xff, 0x88, 0xff, 0x87, 0xff, 0x87, 0xff, 0x89, 0xff, 0x89, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x42, 0x00, 0x42, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xde, 0x00, 0xde, 0x00, 0x00, 0x01, 0x00, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0x36, 0x01, 0x36, 0x01, 0x48, 0x01, 0x48, 0x01, 0x54, 0x01, 0x54, 0x01, 0x59, 0x01, 0x59, 0x01, 0x54, 0x01, 0x54, 0x01, 0x45, 0x01, 0x45, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xd3, 0xff, 0xd3, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x12, 0xff, 0x12, 0xff, 0xee, 0xfe, 0xee, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0x99, 0xfe, 0x99, 0xfe, 0x86, 0xfe, 0x86, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0x71, 0xfe, 0x71, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xc9, 0xfe, 0xc9, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x1e, 0xff, 0x1e, 0xff, 0x54, 0xff, 0x54, 0xff, 0x91, 0xff, 0x91, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0x19, 0x00, 0x19, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x10, 0x01, 0x10, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x62, 0x01, 0x62, 0x01, 0x7b, 0x01, 0x7b, 0x01, 0x89, 0x01, 0x89, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0x88, 0x01, 0x88, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0x70, 0x01, 0x70, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0xfa, 0x00, 0xfa, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xab, 0x00, 0xab, 0x00, 0x81, 0x00, 0x81, 0x00, 0x54, 0x00, 0x54, 0x00, 0x23, 0x00, 0x23, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xba, 0xff, 0xba, 0xff, 0x83, 0xff, 0x83, 0xff, 0x50, 0xff, 0x50, 0xff, 0x23, 0xff, 0x23, 0xff, 0xfd, 0xfe, 0xfd, 0xfe, 0xda, 0xfe, 0xda, 0xfe, 0xbd, 0xfe, 0xbd, 0xfe, 0xa7, 0xfe, 0xa7, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0x8f, 0xfe, 0x8f, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0xa3, 0xfe, 0xa3, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xf3, 0xfe, 0xf3, 0xfe, 0x18, 0xff, 0x18, 0xff, 0x40, 0xff, 0x40, 0xff, 0x69, 0xff, 0x69, 0xff, 0x92, 0xff, 0x92, 0xff, 0xba, 0xff, 0xba, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x82, 0x00, 0x82, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xec, 0x00, 0xec, 0x00, 0x07, 0x01, 0x07, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x30, 0x01, 0x30, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x47, 0x01, 0x47, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x47, 0x01, 0x47, 0x01, 0x38, 0x01, 0x38, 0x01, 0x20, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0xba, 0x00, 0xba, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x60, 0x00, 0x60, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xca, 0xff, 0xca, 0xff, 0x99, 0xff, 0x99, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x42, 0xff, 0x42, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0xfb, 0xfe, 0xfb, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0xc2, 0xfe, 0xc2, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xc2, 0xfe, 0xc2, 0xfe, 0xcf, 0xfe, 0xcf, 0xfe, 0xe3, 0xfe, 0xe3, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0x21, 0xff, 0x21, 0xff, 0x48, 0xff, 0x48, 0xff, 0x73, 0xff, 0x73, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0x09, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x21, 0x01, 0x21, 0x01, 0x41, 0x01, 0x41, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x57, 0x01, 0x57, 0x01, 0x36, 0x01, 0x36, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0xda, 0x00, 0xda, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0xda, 0xff, 0xda, 0xff, 0x92, 0xff, 0x92, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x06, 0xff, 0x06, 0xff, 0xcc, 0xfe, 0xcc, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0x49, 0xfe, 0x49, 0xfe, 0x33, 0xfe, 0x33, 0xfe, 0x2a, 0xfe, 0x2a, 0xfe, 0x2b, 0xfe, 0x2b, 0xfe, 0x39, 0xfe, 0x39, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x34, 0xff, 0x34, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0xba, 0x00, 0xba, 0x00, 0x03, 0x01, 0x03, 0x01, 0x45, 0x01, 0x45, 0x01, 0x80, 0x01, 0x80, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xdd, 0x01, 0xdd, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0x0c, 0x02, 0x0c, 0x02, 0x10, 0x02, 0x10, 0x02, 0x07, 0x02, 0x07, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xd1, 0x01, 0xd1, 0x01, 0xa4, 0x01, 0xa4, 0x01, 0x6e, 0x01, 0x6e, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0x94, 0x00, 0x94, 0x00, 0x40, 0x00, 0x40, 0x00, 0xeb, 0xff, 0xeb, 0xff, 0x96, 0xff, 0x96, 0xff, 0x44, 0xff, 0x44, 0xff, 0xf6, 0xfe, 0xf6, 0xfe, 0xac, 0xfe, 0xac, 0xfe, 0x6a, 0xfe, 0x6a, 0xfe, 0x33, 0xfe, 0x33, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0xda, 0xfd, 0xda, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xe0, 0xfd, 0xe0, 0xfd, 0xf6, 0xfd, 0xf6, 0xfd, 0x1b, 0xfe, 0x1b, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xd0, 0xfe, 0xd0, 0xfe, 0x17, 0xff, 0x17, 0xff, 0x62, 0xff, 0x62, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x00, 0x4a, 0x00, 0x91, 0x00, 0x91, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x3c, 0x01, 0x3c, 0x01, 0x61, 0x01, 0x61, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0x94, 0x01, 0x94, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0xa2, 0x01, 0xa2, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x92, 0x01, 0x92, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0x59, 0x01, 0x59, 0x01, 0x31, 0x01, 0x31, 0x01, 0x05, 0x01, 0x05, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x39, 0x00, 0x39, 0x00, 0x05, 0x00, 0x05, 0x00, 0xd3, 0xff, 0xd3, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0x80, 0xff, 0x80, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x43, 0xff, 0x43, 0xff, 0x32, 0xff, 0x32, 0xff, 0x29, 0xff, 0x29, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x31, 0xff, 0x31, 0xff, 0x41, 0xff, 0x41, 0xff, 0x56, 0xff, 0x56, 0xff, 0x71, 0xff, 0x71, 0xff, 0x91, 0xff, 0x91, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x16, 0x00, 0x16, 0x00, 0x34, 0x00, 0x34, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x62, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x74, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x51, 0x00, 0x51, 0x00, 0x40, 0x00, 0x40, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x16, 0x00, 0x16, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x92, 0xff, 0x92, 0xff, 0x74, 0xff, 0x74, 0xff, 0x57, 0xff, 0x57, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x14, 0xff, 0x14, 0xff, 0x10, 0xff, 0x10, 0xff, 0x15, 0xff, 0x15, 0xff, 0x22, 0xff, 0x22, 0xff, 0x37, 0xff, 0x37, 0xff, 0x53, 0xff, 0x53, 0xff, 0x74, 0xff, 0x74, 0xff, 0x98, 0xff, 0x98, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x15, 0x00, 0x15, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x64, 0x00, 0x64, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x19, 0x01, 0x19, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x3c, 0x01, 0x3c, 0x01, 0x47, 0x01, 0x47, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x40, 0x01, 0x40, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x16, 0x01, 0x16, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0xad, 0x00, 0xad, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x14, 0x00, 0xdf, 0xff, 0xdf, 0xff, 0xab, 0xff, 0xab, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x21, 0xff, 0x21, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xc7, 0xfe, 0xc7, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0xa4, 0xfe, 0xa4, 0xfe, 0x9f, 0xfe, 0x9f, 0xfe, 0xa4, 0xfe, 0xa4, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xc0, 0xfe, 0xc0, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0x02, 0xff, 0x02, 0xff, 0x22, 0xff, 0x22, 0xff, 0x43, 0xff, 0x43, 0xff, 0x66, 0xff, 0x66, 0xff, 0x88, 0xff, 0x88, 0xff, 0xab, 0xff, 0xab, 0xff, 0xce, 0xff, 0xce, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x14, 0x00, 0x14, 0x00, 0x36, 0x00, 0x36, 0x00, 0x53, 0x00, 0x53, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x87, 0x00, 0x87, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0x92, 0x00, 0x92, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x57, 0x00, 0x57, 0x00, 0x44, 0x00, 0x44, 0x00, 0x34, 0x00, 0x34, 0x00, 0x28, 0x00, 0x28, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x18, 0x00, 0x18, 0x00, 0x15, 0x00, 0x15, 0x00, 0x16, 0x00, 0x16, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0x00, 0x17, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x09, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xad, 0xff, 0xad, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xae, 0xff, 0xae, 0xff, 0xae, 0xff, 0xae, 0xff, 0xad, 0xff, 0xad, 0xff, 0xab, 0xff, 0xab, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xac, 0xff, 0xac, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xee, 0xff, 0xee, 0xff, 0x05, 0x00, 0x05, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x77, 0x00, 0x77, 0x00, 0x90, 0x00, 0x90, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x74, 0x00, 0x74, 0x00, 0x57, 0x00, 0x57, 0x00, 0x35, 0x00, 0x35, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xe6, 0xff, 0xe6, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x62, 0xff, 0x62, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x35, 0xff, 0x35, 0xff, 0x23, 0xff, 0x23, 0xff, 0x14, 0xff, 0x14, 0xff, 0x07, 0xff, 0x07, 0xff, 0xfc, 0xfe, 0xfc, 0xfe, 0xf3, 0xfe, 0xf3, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0x03, 0xff, 0x03, 0xff, 0x17, 0xff, 0x17, 0xff, 0x33, 0xff, 0x33, 0xff, 0x54, 0xff, 0x54, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x23, 0x00, 0x23, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x92, 0x00, 0x92, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0x1b, 0x01, 0x1b, 0x01, 0x39, 0x01, 0x39, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x56, 0x01, 0x56, 0x01, 0x58, 0x01, 0x58, 0x01, 0x55, 0x01, 0x55, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x17, 0x01, 0x17, 0x01, 0xfc, 0x00, 0xfc, 0x00, 0xda, 0x00, 0xda, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x88, 0x00, 0x88, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x27, 0x00, 0x27, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x58, 0xff, 0x58, 0xff, 0x28, 0xff, 0x28, 0xff, 0xfd, 0xfe, 0xfd, 0xfe, 0xd9, 0xfe, 0xd9, 0xfe, 0xbf, 0xfe, 0xbf, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xae, 0xfe, 0xae, 0xfe, 0xb5, 0xfe, 0xb5, 0xfe, 0xc3, 0xfe, 0xc3, 0xfe, 0xd9, 0xfe, 0xd9, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0x24, 0xff, 0x24, 0xff, 0x53, 0xff, 0x53, 0xff, 0x86, 0xff, 0x86, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x2a, 0x00, 0x2a, 0x00, 0x61, 0x00, 0x61, 0x00, 0x94, 0x00, 0x94, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0x09, 0x01, 0x09, 0x01, 0x24, 0x01, 0x24, 0x01, 0x37, 0x01, 0x37, 0x01, 0x41, 0x01, 0x41, 0x01, 0x45, 0x01, 0x45, 0x01, 0x43, 0x01, 0x43, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x30, 0x01, 0x30, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0xff, 0x00, 0xff, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x06, 0x00, 0x06, 0x00, 0xc5, 0xff, 0xc5, 0xff, 0x82, 0xff, 0x82, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x03, 0xff, 0x03, 0xff, 0xcf, 0xfe, 0xcf, 0xfe, 0xa3, 0xfe, 0xa3, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x61, 0xfe, 0x61, 0xfe, 0x4d, 0xfe, 0x4d, 0xfe, 0x44, 0xfe, 0x44, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x6c, 0xfe, 0x6c, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0xb4, 0xfe, 0xb4, 0xfe, 0xe3, 0xfe, 0xe3, 0xfe, 0x19, 0xff, 0x19, 0xff, 0x53, 0xff, 0x53, 0xff, 0x92, 0xff, 0x92, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0x14, 0x00, 0x14, 0x00, 0x57, 0x00, 0x57, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0xde, 0x00, 0xde, 0x00, 0x1f, 0x01, 0x1f, 0x01, 0x5d, 0x01, 0x5d, 0x01, 0x96, 0x01, 0x96, 0x01, 0xcb, 0x01, 0xcb, 0x01, 0xf9, 0x01, 0xf9, 0x01, 0x1d, 0x02, 0x1d, 0x02, 0x35, 0x02, 0x35, 0x02, 0x41, 0x02, 0x41, 0x02, 0x3f, 0x02, 0x3f, 0x02, 0x30, 0x02, 0x30, 0x02, 0x13, 0x02, 0x13, 0x02, 0xe9, 0x01, 0xe9, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x24, 0x01, 0x24, 0x01, 0xd2, 0x00, 0xd2, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x29, 0x00, 0x29, 0x00, 0xd5, 0xff, 0xd5, 0xff, 0x84, 0xff, 0x84, 0xff, 0x36, 0xff, 0x36, 0xff, 0xec, 0xfe, 0xec, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x4c, 0xfe, 0x4c, 0xfe, 0x2b, 0xfe, 0x2b, 0xfe, 0x12, 0xfe, 0x12, 0xfe, 0x02, 0xfe, 0x02, 0xfe, 0xf9, 0xfd, 0xf9, 0xfd, 0xf6, 0xfd, 0xf6, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0x21, 0xfe, 0x21, 0xfe, 0x40, 0xfe, 0x40, 0xfe, 0x6c, 0xfe, 0x6c, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x20, 0xff, 0x20, 0xff, 0x67, 0xff, 0x67, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x91, 0x00, 0x91, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x0a, 0x01, 0x0a, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x67, 0x01, 0x67, 0x01, 0x84, 0x01, 0x84, 0x01, 0x96, 0x01, 0x96, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x95, 0x01, 0x95, 0x01, 0x85, 0x01, 0x85, 0x01, 0x70, 0x01, 0x70, 0x01, 0x54, 0x01, 0x54, 0x01, 0x31, 0x01, 0x31, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x19, 0x00, 0x19, 0x00, 0xe6, 0xff, 0xe6, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0x85, 0xff, 0x85, 0xff, 0x58, 0xff, 0x58, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x09, 0xff, 0x09, 0xff, 0xed, 0xfe, 0xed, 0xfe, 0xd7, 0xfe, 0xd7, 0xfe, 0xc7, 0xfe, 0xc7, 0xfe, 0xbc, 0xfe, 0xbc, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xb7, 0xfe, 0xb7, 0xfe, 0xbf, 0xfe, 0xbf, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0x10, 0xff, 0x10, 0xff, 0x35, 0xff, 0x35, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x24, 0x00, 0x24, 0x00, 0x55, 0x00, 0x55, 0x00, 0x80, 0x00, 0x80, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x17, 0x01, 0x17, 0x01, 0x19, 0x01, 0x19, 0x01, 0x16, 0x01, 0x16, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xfd, 0x00, 0xfd, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x90, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x42, 0x00, 0x42, 0x00, 0x16, 0x00, 0x16, 0x00, 0xe7, 0xff, 0xe7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x63, 0xff, 0x63, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x01, 0xff, 0x01, 0xff, 0xec, 0xfe, 0xec, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0x01, 0xff, 0x01, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x3e, 0xff, 0x3e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x95, 0xff, 0x95, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x22, 0x00, 0x53, 0x00, 0x53, 0x00, 0x84, 0x00, 0x84, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xde, 0x00, 0xde, 0x00, 0x03, 0x01, 0x03, 0x01, 0x21, 0x01, 0x21, 0x01, 0x36, 0x01, 0x36, 0x01, 0x41, 0x01, 0x41, 0x01, 0x44, 0x01, 0x44, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x11, 0x01, 0x11, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x92, 0x00, 0x92, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0xdd, 0xff, 0xdd, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x65, 0xff, 0x65, 0xff, 0x30, 0xff, 0x30, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xd6, 0xfe, 0xd6, 0xfe, 0xb4, 0xfe, 0xb4, 0xfe, 0x9c, 0xfe, 0x9c, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0xba, 0xff, 0xba, 0xff, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x46, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0x48, 0x01, 0x48, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0xa5, 0x01, 0xa5, 0x01, 0xc7, 0x01, 0xc7, 0x01, 0xdc, 0x01, 0xdc, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xce, 0x01, 0xce, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0x84, 0x01, 0x84, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x0f, 0x01, 0x0f, 0x01, 0xca, 0x00, 0xca, 0x00, 0x80, 0x00, 0x80, 0x00, 0x31, 0x00, 0x31, 0x00, 0xdf, 0xff, 0xdf, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0xf1, 0xfe, 0xf1, 0xfe, 0xb1, 0xfe, 0xb1, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x36, 0xfe, 0x36, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x22, 0xfe, 0x22, 0xfe, 0x30, 0xfe, 0x30, 0xfe, 0x4d, 0xfe, 0x4d, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0xa7, 0xfe, 0xa7, 0xfe, 0xdc, 0xfe, 0xdc, 0xfe, 0x14, 0xff, 0x14, 0xff, 0x51, 0xff, 0x51, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0x07, 0x00, 0x07, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0x11, 0x01, 0x11, 0x01, 0x32, 0x01, 0x32, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x59, 0x01, 0x59, 0x01, 0x62, 0x01, 0x62, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x52, 0x01, 0x52, 0x01, 0x39, 0x01, 0x39, 0x01, 0x18, 0x01, 0x18, 0x01, 0xf1, 0x00, 0xf1, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x97, 0x00, 0x97, 0x00, 0x65, 0x00, 0x65, 0x00, 0x33, 0x00, 0x33, 0x00, 0x05, 0x00, 0x05, 0x00, 0xda, 0xff, 0xda, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0x93, 0xff, 0x93, 0xff, 0x79, 0xff, 0x79, 0xff, 0x63, 0xff, 0x63, 0xff, 0x54, 0xff, 0x54, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x48, 0xff, 0x48, 0xff, 0x46, 0xff, 0x46, 0xff, 0x47, 0xff, 0x47, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x74, 0xff, 0x74, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xea, 0xff, 0xea, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x86, 0x00, 0x86, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xad, 0x00, 0xad, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xab, 0x00, 0xab, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x85, 0x00, 0x85, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xe9, 0xff, 0xe9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x81, 0xff, 0x81, 0xff, 0x61, 0xff, 0x61, 0xff, 0x43, 0xff, 0x43, 0xff, 0x27, 0xff, 0x27, 0xff, 0x11, 0xff, 0x11, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xe9, 0xfe, 0xe9, 0xfe, 0xf9, 0xfe, 0xf9, 0xfe, 0x10, 0xff, 0x10, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x73, 0xff, 0x73, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0x22, 0x00, 0x22, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x77, 0x00, 0x77, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x12, 0x01, 0x12, 0x01, 0x25, 0x01, 0x25, 0x01, 0x34, 0x01, 0x34, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x43, 0x01, 0x43, 0x01, 0x46, 0x01, 0x46, 0x01, 0x45, 0x01, 0x45, 0x01, 0x40, 0x01, 0x40, 0x01, 0x37, 0x01, 0x37, 0x01, 0x28, 0x01, 0x28, 0x01, 0x14, 0x01, 0x14, 0x01, 0xfb, 0x00, 0xfb, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x98, 0x00, 0x98, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x43, 0x00, 0x43, 0x00, 0x18, 0x00, 0x18, 0x00, 0xec, 0xff, 0xec, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x94, 0xff, 0x94, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x45, 0xff, 0x45, 0xff, 0x22, 0xff, 0x22, 0xff, 0x05, 0xff, 0x05, 0xff, 0xec, 0xfe, 0xec, 0xfe, 0xd8, 0xfe, 0xd8, 0xfe, 0xc8, 0xfe, 0xc8, 0xfe, 0xbd, 0xfe, 0xbd, 0xfe, 0xb7, 0xfe, 0xb7, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb9, 0xfe, 0xb9, 0xfe, 0xc1, 0xfe, 0xc1, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xef, 0xfe, 0xef, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x20, 0xff, 0x20, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x64, 0xff, 0x64, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0x16, 0x00, 0x16, 0x00, 0x47, 0x00, 0x47, 0x00, 0x79, 0x00, 0x79, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x1b, 0x01, 0x1b, 0x01, 0x35, 0x01, 0x35, 0x01, 0x48, 0x01, 0x48, 0x01, 0x52, 0x01, 0x52, 0x01, 0x53, 0x01, 0x53, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x40, 0x01, 0x40, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x19, 0x01, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, 0xe8, 0x00, 0xe8, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xae, 0x00, 0xae, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x69, 0x00, 0x69, 0x00, 0x46, 0x00, 0x46, 0x00, 0x20, 0x00, 0x20, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x33, 0xff, 0x33, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0x05, 0xff, 0x05, 0xff, 0x03, 0xff, 0x03, 0xff, 0x09, 0xff, 0x09, 0xff, 0x12, 0xff, 0x12, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x53, 0xff, 0x53, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x37, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x53, 0x00, 0x53, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x56, 0x00, 0x56, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x53, 0x00, 0x53, 0x00, 0x50, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x50, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x46, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xce, 0xff, 0xce, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x81, 0xff, 0x81, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x59, 0xff, 0x59, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x47, 0xff, 0x47, 0xff, 0x45, 0xff, 0x45, 0xff, 0x46, 0xff, 0x46, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x91, 0xff, 0x91, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x14, 0x00, 0x14, 0x00, 0x31, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x68, 0x00, 0x68, 0x00, 0x84, 0x00, 0x84, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xda, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xab, 0x00, 0xab, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xca, 0xff, 0xca, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x42, 0xff, 0x42, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x22, 0xff, 0x22, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x24, 0xff, 0x24, 0xff, 0x34, 0xff, 0x34, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x64, 0xff, 0x64, 0xff, 0x84, 0xff, 0x84, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xce, 0xff, 0xce, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x43, 0x00, 0x43, 0x00, 0x66, 0x00, 0x66, 0x00, 0x86, 0x00, 0x86, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xca, 0x00, 0xca, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x73, 0x00, 0x73, 0x00, 0x56, 0x00, 0x56, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x21, 0x00, 0x21, 0x00, 0x07, 0x00, 0x07, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x96, 0xff, 0x96, 0xff, 0x92, 0xff, 0x92, 0xff, 0x93, 0xff, 0x93, 0xff, 0x99, 0xff, 0x99, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xed, 0xff, 0xed, 0xff, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x29, 0x00, 0x32, 0x00, 0x32, 0x00, 0x36, 0x00, 0x36, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x73, 0xff, 0x73, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x66, 0xff, 0x66, 0xff, 0x69, 0xff, 0x69, 0xff, 0x73, 0xff, 0x73, 0xff, 0x82, 0xff, 0x82, 0xff, 0x95, 0xff, 0x95, 0xff, 0xac, 0xff, 0xac, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0x00, 0x1d, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x54, 0x00, 0x54, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x82, 0x00, 0x82, 0x00, 0x98, 0x00, 0x98, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x70, 0x00, 0x70, 0x00, 0x52, 0x00, 0x52, 0x00, 0x30, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0xde, 0xff, 0xde, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x89, 0xff, 0x89, 0xff, 0x64, 0xff, 0x64, 0xff, 0x46, 0xff, 0x46, 0xff, 0x31, 0xff, 0x31, 0xff, 0x22, 0xff, 0x22, 0xff, 0x1a, 0xff, 0x1a, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x42, 0xff, 0x42, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x34, 0x00, 0x34, 0x00, 0x56, 0x00, 0x56, 0x00, 0x72, 0x00, 0x72, 0x00, 0x87, 0x00, 0x87, 0x00, 0x99, 0x00, 0x99, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xab, 0x00, 0xab, 0x00, 0xab, 0x00, 0xab, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x98, 0x00, 0x98, 0x00, 0x89, 0x00, 0x89, 0x00, 0x77, 0x00, 0x77, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x26, 0x00, 0x26, 0x00, 0x02, 0x00, 0x02, 0x00, 0xde, 0xff, 0xde, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0x95, 0xff, 0x95, 0xff, 0x74, 0xff, 0x74, 0xff, 0x54, 0xff, 0x54, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x29, 0xff, 0x29, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x18, 0xff, 0x18, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x43, 0xff, 0x43, 0xff, 0x60, 0xff, 0x60, 0xff, 0x83, 0xff, 0x83, 0xff, 0xac, 0xff, 0xac, 0xff, 0xda, 0xff, 0xda, 0xff, 0x09, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x68, 0x00, 0x68, 0x00, 0x92, 0x00, 0x92, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x92, 0x00, 0x92, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x42, 0x00, 0x42, 0x00, 0x16, 0x00, 0x16, 0x00, 0xe8, 0xff, 0xe8, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x69, 0xff, 0x69, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x31, 0xff, 0x31, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x07, 0xff, 0x07, 0xff, 0x06, 0xff, 0x06, 0xff, 0x0e, 0xff, 0x0e, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x35, 0xff, 0x35, 0xff, 0x53, 0xff, 0x53, 0xff, 0x73, 0xff, 0x73, 0xff, 0x95, 0xff, 0x95, 0xff, 0xba, 0xff, 0xba, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x81, 0x00, 0x81, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xda, 0x00, 0xda, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x90, 0x00, 0x90, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x48, 0x00, 0x48, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x79, 0xff, 0x79, 0xff, 0x59, 0xff, 0x59, 0xff, 0x40, 0xff, 0x40, 0xff, 0x30, 0xff, 0x30, 0xff, 0x24, 0xff, 0x24, 0xff, 0x21, 0xff, 0x21, 0xff, 0x25, 0xff, 0x25, 0xff, 0x30, 0xff, 0x30, 0xff, 0x42, 0xff, 0x42, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x76, 0xff, 0x76, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0x06, 0x00, 0x06, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x55, 0x00, 0x55, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xeb, 0x00, 0xeb, 0x00, 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x84, 0x00, 0x84, 0x00, 0x57, 0x00, 0x57, 0x00, 0x28, 0x00, 0x28, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x42, 0xff, 0x42, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x23, 0xff, 0x23, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x28, 0xff, 0x28, 0xff, 0x38, 0xff, 0x38, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x83, 0xff, 0x83, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x10, 0x00, 0x10, 0x00, 0x36, 0x00, 0x36, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xca, 0x00, 0xca, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xde, 0x00, 0xde, 0x00, 0xde, 0x00, 0xde, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x95, 0x00, 0x95, 0x00, 0x73, 0x00, 0x73, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x63, 0xff, 0x63, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x36, 0xff, 0x36, 0xff, 0x37, 0xff, 0x37, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x64, 0xff, 0x64, 0xff, 0x81, 0xff, 0x81, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xee, 0xff, 0xee, 0xff, 0x15, 0x00, 0x15, 0x00, 0x38, 0x00, 0x38, 0x00, 0x58, 0x00, 0x58, 0x00, 0x75, 0x00, 0x75, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xae, 0x00, 0xae, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xac, 0x00, 0xac, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x72, 0x00, 0x72, 0x00, 0x51, 0x00, 0x51, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x05, 0x00, 0xdc, 0xff, 0xdc, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x87, 0xff, 0x87, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0xfb, 0xfe, 0xfb, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x13, 0xff, 0x13, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x50, 0xff, 0x50, 0xff, 0x78, 0xff, 0x78, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xda, 0xff, 0xda, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x71, 0x00, 0x71, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x10, 0x01, 0x10, 0x01, 0x29, 0x01, 0x29, 0x01, 0x38, 0x01, 0x38, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x31, 0x01, 0x31, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x01, 0x01, 0x01, 0x01, 0xe3, 0x00, 0xe3, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x75, 0x00, 0x75, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xad, 0xff, 0xad, 0xff, 0x89, 0xff, 0x89, 0xff, 0x69, 0xff, 0x69, 0xff, 0x50, 0xff, 0x50, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x27, 0xff, 0x27, 0xff, 0x27, 0xff, 0x27, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x50, 0xff, 0x50, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x89, 0xff, 0x89, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0x01, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x44, 0x00, 0x44, 0x00, 0x41, 0x00, 0x41, 0x00, 0x39, 0x00, 0x39, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x16, 0x00, 0x16, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x69, 0xff, 0x69, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x53, 0xff, 0x53, 0xff, 0x53, 0xff, 0x53, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x68, 0xff, 0x68, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x95, 0xff, 0x95, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0x07, 0x00, 0x07, 0x00, 0x32, 0x00, 0x32, 0x00, 0x60, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xec, 0x00, 0xec, 0x00, 0x13, 0x01, 0x13, 0x01, 0x35, 0x01, 0x35, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x67, 0x01, 0x67, 0x01, 0x66, 0x01, 0x66, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0x45, 0x01, 0x45, 0x01, 0x25, 0x01, 0x25, 0x01, 0xfe, 0x00, 0xfe, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0xdb, 0xff, 0xdb, 0xff, 0x95, 0xff, 0x95, 0xff, 0x52, 0xff, 0x52, 0xff, 0x12, 0xff, 0x12, 0xff, 0xd7, 0xfe, 0xd7, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x78, 0xfe, 0x78, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x3b, 0xfe, 0x3b, 0xfe, 0x3c, 0xfe, 0x3c, 0xfe, 0x4b, 0xfe, 0x4b, 0xfe, 0x65, 0xfe, 0x65, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xbc, 0xfe, 0xbc, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0x35, 0xff, 0x35, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x13, 0x00, 0x13, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xee, 0x00, 0xee, 0x00, 0x2c, 0x01, 0x2c, 0x01, 0x64, 0x01, 0x64, 0x01, 0x92, 0x01, 0x92, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xce, 0x01, 0xce, 0x01, 0xd9, 0x01, 0xd9, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xc8, 0x01, 0xc8, 0x01, 0xad, 0x01, 0xad, 0x01, 0x86, 0x01, 0x86, 0x01, 0x55, 0x01, 0x55, 0x01, 0x1a, 0x01, 0x1a, 0x01, 0xdb, 0x00, 0xdb, 0x00, 0x98, 0x00, 0x98, 0x00, 0x51, 0x00, 0x51, 0x00, 0x06, 0x00, 0x06, 0x00, 0xbb, 0xff, 0xbb, 0xff, 0x77, 0xff, 0x77, 0xff, 0x39, 0xff, 0x39, 0xff, 0x02, 0xff, 0x02, 0xff, 0xd0, 0xfe, 0xd0, 0xfe, 0xa5, 0xfe, 0xa5, 0xfe, 0x81, 0xfe, 0x81, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x55, 0xfe, 0x55, 0xfe, 0x52, 0xfe, 0x52, 0xfe, 0x59, 0xfe, 0x59, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0xd7, 0xfe, 0xd7, 0xfe, 0x0c, 0xff, 0x0c, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x91, 0xff, 0x91, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0x1b, 0x00, 0x1b, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x34, 0x01, 0x34, 0x01, 0x50, 0x01, 0x50, 0x01, 0x61, 0x01, 0x61, 0x01, 0x69, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x63, 0x01, 0x63, 0x01, 0x53, 0x01, 0x53, 0x01, 0x3c, 0x01, 0x3c, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x36, 0x00, 0x36, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x90, 0xff, 0x90, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x08, 0xff, 0x08, 0xff, 0xe9, 0xfe, 0xe9, 0xfe, 0xd5, 0xfe, 0xd5, 0xfe, 0xcb, 0xfe, 0xcb, 0xfe, 0xc9, 0xfe, 0xc9, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xd9, 0xfe, 0xd9, 0xfe, 0xec, 0xfe, 0xec, 0xfe, 0x05, 0xff, 0x05, 0xff, 0x27, 0xff, 0x27, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0xad, 0xff, 0xad, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0x15, 0x00, 0x15, 0x00, 0x47, 0x00, 0x47, 0x00, 0x76, 0x00, 0x76, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xff, 0x00, 0xff, 0x00, 0x14, 0x01, 0x14, 0x01, 0x20, 0x01, 0x20, 0x01, 0x24, 0x01, 0x24, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0x11, 0x01, 0x11, 0x01, 0xfd, 0x00, 0xfd, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xca, 0x00, 0xca, 0x00, 0xac, 0x00, 0xac, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x66, 0x00, 0x66, 0x00, 0x40, 0x00, 0x40, 0x00, 0x19, 0x00, 0x19, 0x00, 0xf1, 0xff, 0xf1, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x82, 0xff, 0x82, 0xff, 0x63, 0xff, 0x63, 0xff, 0x49, 0xff, 0x49, 0xff, 0x34, 0xff, 0x34, 0xff, 0x24, 0xff, 0x24, 0xff, 0x1a, 0xff, 0x1a, 0xff, 0x17, 0xff, 0x17, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x40, 0xff, 0x40, 0xff, 0x57, 0xff, 0x57, 0xff, 0x70, 0xff, 0x70, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x05, 0x00, 0x05, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x48, 0x00, 0x48, 0x00, 0x57, 0x00, 0x57, 0x00, 0x62, 0x00, 0x62, 0x00, 0x68, 0x00, 0x68, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x66, 0x00, 0x66, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x54, 0x00, 0x54, 0x00, 0x49, 0x00, 0x49, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x07, 0x00, 0x07, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x01, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x24, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x26, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x13, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x23, 0x00, 0x23, 0x00, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xed, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x17, 0x00, 0x25, 0x00, 0x25, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x56, 0x00, 0x56, 0x00, 0x59, 0x00, 0x59, 0x00, 0x58, 0x00, 0x58, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x41, 0x00, 0x31, 0x00, 0x31, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x06, 0x00, 0x06, 0x00, 0xef, 0xff, 0xef, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x79, 0xff, 0x79, 0xff, 0x6d, 0xff, 0x6d, 0xff, 0x67, 0xff, 0x67, 0xff, 0x66, 0xff, 0x66, 0xff, 0x68, 0xff, 0x68, 0xff, 0x70, 0xff, 0x70, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x88, 0xff, 0x88, 0xff, 0x99, 0xff, 0x99, 0xff, 0xae, 0xff, 0xae, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x39, 0x00, 0x54, 0x00, 0x54, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x87, 0x00, 0x87, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xba, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x99, 0x00, 0x99, 0x00, 0x80, 0x00, 0x80, 0x00, 0x64, 0x00, 0x64, 0x00, 0x45, 0x00, 0x45, 0x00, 0x22, 0x00, 0x22, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0x96, 0xff, 0x96, 0xff, 0x79, 0xff, 0x79, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x47, 0xff, 0x47, 0xff, 0x34, 0xff, 0x34, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x26, 0xff, 0x26, 0xff, 0x27, 0xff, 0x27, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x60, 0xff, 0x60, 0xff, 0x79, 0xff, 0x79, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x15, 0x00, 0x27, 0x00, 0x27, 0x00, 0x35, 0x00, 0x35, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x48, 0x00, 0x48, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x28, 0x00, 0x28, 0x00, 0x20, 0x00, 0x20, 0x00, 0x19, 0x00, 0x19, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xed, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x40, 0x00, 0x40, 0x00, 0x52, 0x00, 0x52, 0x00, 0x63, 0x00, 0x63, 0x00, 0x70, 0x00, 0x70, 0x00, 0x79, 0x00, 0x79, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x76, 0x00, 0x76, 0x00, 0x66, 0x00, 0x66, 0x00, 0x51, 0x00, 0x51, 0x00, 0x38, 0x00, 0x38, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x91, 0xff, 0x91, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x68, 0xff, 0x68, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x46, 0xff, 0x46, 0xff, 0x43, 0xff, 0x43, 0xff, 0x44, 0xff, 0x44, 0xff, 0x49, 0xff, 0x49, 0xff, 0x52, 0xff, 0x52, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x81, 0xff, 0x81, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xda, 0xff, 0xda, 0xff, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x27, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x74, 0x00, 0x74, 0x00, 0x98, 0x00, 0x98, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xed, 0x00, 0xed, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x51, 0x00, 0x51, 0x00, 0x24, 0x00, 0x24, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x79, 0xff, 0x79, 0xff, 0x57, 0xff, 0x57, 0xff, 0x38, 0xff, 0x38, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0xfa, 0xfe, 0xfa, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x02, 0xff, 0x02, 0xff, 0x13, 0xff, 0x13, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x47, 0xff, 0x47, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xae, 0xff, 0xae, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x2c, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x84, 0x00, 0x84, 0x00, 0xad, 0x00, 0xad, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x23, 0x01, 0x23, 0x01, 0x34, 0x01, 0x34, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x3b, 0x01, 0x3b, 0x01, 0x30, 0x01, 0x30, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x03, 0x01, 0x03, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x78, 0x00, 0x78, 0x00, 0x50, 0x00, 0x50, 0x00, 0x26, 0x00, 0x26, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xad, 0xff, 0xad, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x50, 0xff, 0x50, 0xff, 0x36, 0xff, 0x36, 0xff, 0x20, 0xff, 0x20, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0x00, 0xff, 0x00, 0xff, 0xf8, 0xfe, 0xf8, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0x05, 0xff, 0x05, 0xff, 0x12, 0xff, 0x12, 0xff, 0x24, 0xff, 0x24, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x59, 0xff, 0x59, 0xff, 0x78, 0xff, 0x78, 0xff, 0x99, 0xff, 0x99, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0x03, 0x00, 0x03, 0x00, 0x26, 0x00, 0x26, 0x00, 0x48, 0x00, 0x48, 0x00, 0x65, 0x00, 0x65, 0x00, 0x80, 0x00, 0x80, 0x00, 0x96, 0x00, 0x96, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x68, 0x00, 0x68, 0x00, 0x54, 0x00, 0x54, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x25, 0x00, 0x25, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xce, 0xff, 0xce, 0xff, 0xba, 0xff, 0xba, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x95, 0xff, 0x95, 0xff, 0x85, 0xff, 0x85, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x75, 0xff, 0x75, 0xff, 0x72, 0xff, 0x72, 0xff, 0x70, 0xff, 0x70, 0xff, 0x72, 0xff, 0x72, 0xff, 0x78, 0xff, 0x78, 0xff, 0x81, 0xff, 0x81, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x97, 0xff, 0x97, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x34, 0x00, 0x34, 0x00, 0x48, 0x00, 0x48, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x99, 0x00, 0x99, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x93, 0x00, 0x93, 0x00, 0x86, 0x00, 0x86, 0x00, 0x77, 0x00, 0x77, 0x00, 0x67, 0x00, 0x67, 0x00, 0x55, 0x00, 0x55, 0x00, 0x41, 0x00, 0x41, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x15, 0x00, 0x15, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x85, 0xff, 0x85, 0xff, 0x72, 0xff, 0x72, 0xff, 0x61, 0xff, 0x61, 0xff, 0x53, 0xff, 0x53, 0xff, 0x48, 0xff, 0x48, 0xff, 0x40, 0xff, 0x40, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x37, 0xff, 0x37, 0xff, 0x38, 0xff, 0x38, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x76, 0xff, 0x76, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xba, 0xff, 0xba, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x67, 0x00, 0x67, 0x00, 0x80, 0x00, 0x80, 0x00, 0x97, 0x00, 0x97, 0x00, 0xae, 0x00, 0xae, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0xea, 0x00, 0xea, 0x00, 0xee, 0x00, 0xee, 0x00, 0xee, 0x00, 0xee, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0xde, 0x00, 0xde, 0x00, 0xce, 0x00, 0xce, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x81, 0x00, 0x81, 0x00, 0x62, 0x00, 0x62, 0x00, 0x40, 0x00, 0x40, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x83, 0xff, 0x83, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x53, 0xff, 0x53, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x23, 0xff, 0x23, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x20, 0xff, 0x20, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x64, 0xff, 0x64, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x26, 0x00, 0x26, 0x00, 0x46, 0x00, 0x46, 0x00, 0x62, 0x00, 0x62, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x92, 0x00, 0x92, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0xba, 0x00, 0xba, 0x00, 0xad, 0x00, 0xad, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x78, 0x00, 0x78, 0x00, 0x63, 0x00, 0x63, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x39, 0x00, 0x39, 0x00, 0x24, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x97, 0xff, 0x97, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x82, 0xff, 0x82, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x80, 0xff, 0x80, 0xff, 0x86, 0xff, 0x86, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x15, 0x00, 0x15, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x15, 0x00, 0x15, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x37, 0x00, 0x37, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x25, 0x00, 0x25, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x11, 0x00, 0x11, 0x00, 0x06, 0x00, 0x06, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x98, 0xff, 0x98, 0xff, 0x95, 0xff, 0x95, 0xff, 0x98, 0xff, 0x98, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x56, 0x00, 0x56, 0x00, 0x60, 0x00, 0x60, 0x00, 0x65, 0x00, 0x65, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x68, 0x00, 0x68, 0x00, 0x66, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x51, 0x00, 0x51, 0x00, 0x46, 0x00, 0x46, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x21, 0x00, 0x21, 0x00, 0x13, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xad, 0xff, 0xad, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x06, 0x00, 0x06, 0x00, 0x14, 0x00, 0x14, 0x00, 0x23, 0x00, 0x23, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x57, 0x00, 0x57, 0x00, 0x61, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x76, 0x00, 0x76, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x83, 0x00, 0x83, 0x00, 0x85, 0x00, 0x85, 0x00, 0x82, 0x00, 0x82, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x75, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x61, 0x00, 0x54, 0x00, 0x54, 0x00, 0x46, 0x00, 0x46, 0x00, 0x36, 0x00, 0x36, 0x00, 0x26, 0x00, 0x26, 0x00, 0x15, 0x00, 0x15, 0x00, 0x05, 0x00, 0x05, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xad, 0xff, 0xad, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xad, 0xff, 0xad, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x18, 0x00, 0x21, 0x00, 0x21, 0x00, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x16, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x07, 0x00, 0x07, 0x00, 0x19, 0x00, 0x19, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x66, 0x00, 0x72, 0x00, 0x72, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x82, 0x00, 0x82, 0x00, 0x86, 0x00, 0x86, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x87, 0x00, 0x87, 0x00, 0x83, 0x00, 0x83, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x77, 0x00, 0x77, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x20, 0x00, 0x20, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0x98, 0xff, 0x98, 0xff, 0x81, 0xff, 0x81, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x52, 0xff, 0x52, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x17, 0xff, 0x17, 0xff, 0x16, 0xff, 0x16, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x27, 0xff, 0x27, 0xff, 0x37, 0xff, 0x37, 0xff, 0x48, 0xff, 0x48, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x78, 0xff, 0x78, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x10, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x73, 0x00, 0x73, 0x00, 0x85, 0x00, 0x85, 0x00, 0x93, 0x00, 0x93, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xab, 0x00, 0xab, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xba, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x77, 0x00, 0x77, 0x00, 0x61, 0x00, 0x61, 0x00, 0x49, 0x00, 0x49, 0x00, 0x30, 0x00, 0x30, 0x00, 0x14, 0x00, 0x14, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xde, 0xff, 0xde, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x92, 0xff, 0x92, 0xff, 0x87, 0xff, 0x87, 0xff, 0x80, 0xff, 0x80, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x85, 0xff, 0x85, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x98, 0xff, 0x98, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x06, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16, 0x00, 0x24, 0x00, 0x24, 0x00, 0x32, 0x00, 0x32, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x57, 0x00, 0x57, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x22, 0x00, 0x22, 0x00, 0x15, 0x00, 0x15, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xed, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x97, 0xff, 0x97, 0xff, 0x96, 0xff, 0x96, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xad, 0xff, 0xad, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x83, 0x00, 0x83, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xae, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xca, 0x00, 0xca, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xda, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x71, 0x00, 0x71, 0x00, 0x52, 0x00, 0x52, 0x00, 0x32, 0x00, 0x32, 0x00, 0x11, 0x00, 0x11, 0x00, 0xef, 0xff, 0xef, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x84, 0xff, 0x84, 0xff, 0x63, 0xff, 0x63, 0xff, 0x43, 0xff, 0x43, 0xff, 0x26, 0xff, 0x26, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0xf6, 0xfe, 0xf6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0xd4, 0xfe, 0xd4, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xda, 0xfe, 0xda, 0xfe, 0xe9, 0xfe, 0xe9, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0x17, 0xff, 0x17, 0xff, 0x34, 0xff, 0x34, 0xff, 0x56, 0xff, 0x56, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xce, 0xff, 0xce, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x25, 0x00, 0x25, 0x00, 0x50, 0x00, 0x50, 0x00, 0x78, 0x00, 0x78, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf9, 0x00, 0xf9, 0x00, 0x0a, 0x01, 0x0a, 0x01, 0x16, 0x01, 0x16, 0x01, 0x1a, 0x01, 0x1a, 0x01, 0x18, 0x01, 0x18, 0x01, 0x13, 0x01, 0x13, 0x01, 0x07, 0x01, 0x07, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0xab, 0x00, 0xab, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x62, 0x00, 0x62, 0x00, 0x37, 0x00, 0x37, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xe1, 0xff, 0xe1, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0x98, 0xff, 0x98, 0xff, 0x78, 0xff, 0x78, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x29, 0xff, 0x29, 0xff, 0x18, 0xff, 0x18, 0xff, 0x0c, 0xff, 0x0c, 0xff, 0x04, 0xff, 0x04, 0xff, 0x02, 0xff, 0x02, 0xff, 0x08, 0xff, 0x08, 0xff, 0x17, 0xff, 0x17, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x40, 0xff, 0x40, 0xff, 0x58, 0xff, 0x58, 0xff, 0x73, 0xff, 0x73, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xab, 0xff, 0xab, 0xff, 0xca, 0xff, 0xca, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x08, 0x00, 0x08, 0x00, 0x25, 0x00, 0x25, 0x00, 0x43, 0x00, 0x43, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x75, 0x00, 0x75, 0x00, 0x89, 0x00, 0x89, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0xca, 0x00, 0xca, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x94, 0x00, 0x94, 0x00, 0x82, 0x00, 0x82, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x54, 0x00, 0x54, 0x00, 0x39, 0x00, 0x39, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x00, 0xe2, 0xff, 0xe2, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x85, 0xff, 0x85, 0xff, 0x68, 0xff, 0x68, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x34, 0xff, 0x34, 0xff, 0x21, 0xff, 0x21, 0xff, 0x13, 0xff, 0x13, 0xff, 0x08, 0xff, 0x08, 0xff, 0x03, 0xff, 0x03, 0xff, 0x01, 0xff, 0x01, 0xff, 0x00, 0xff, 0x00, 0xff, 0x03, 0xff, 0x03, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0x15, 0xff, 0x15, 0xff, 0x23, 0xff, 0x23, 0xff, 0x36, 0xff, 0x36, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x68, 0xff, 0x68, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x85, 0x00, 0x85, 0x00, 0xac, 0x00, 0xac, 0x00, 0xce, 0x00, 0xce, 0x00, 0xed, 0x00, 0xed, 0x00, 0x0b, 0x01, 0x0b, 0x01, 0x27, 0x01, 0x27, 0x01, 0x41, 0x01, 0x41, 0x01, 0x57, 0x01, 0x57, 0x01, 0x66, 0x01, 0x66, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x66, 0x01, 0x66, 0x01, 0x59, 0x01, 0x59, 0x01, 0x48, 0x01, 0x48, 0x01, 0x31, 0x01, 0x31, 0x01, 0x16, 0x01, 0x16, 0x01, 0xf5, 0x00, 0xf5, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x74, 0x00, 0x74, 0x00, 0x43, 0x00, 0x43, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xda, 0xff, 0xda, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0x74, 0xff, 0x74, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xdd, 0xfe, 0xdd, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x5f, 0xfe, 0x5f, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x3d, 0xfe, 0x3d, 0xfe, 0x41, 0xfe, 0x41, 0xfe, 0x4c, 0xfe, 0x4c, 0xfe, 0x5f, 0xfe, 0x5f, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xcb, 0xfe, 0xcb, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe, 0x31, 0xff, 0x31, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0x27, 0x00, 0x27, 0x00, 0x65, 0x00, 0x65, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x12, 0x01, 0x12, 0x01, 0x43, 0x01, 0x43, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0xa9, 0x01, 0xa9, 0x01, 0xbe, 0x01, 0xbe, 0x01, 0xcb, 0x01, 0xcb, 0x01, 0xd0, 0x01, 0xd0, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xc1, 0x01, 0xc1, 0x01, 0xad, 0x01, 0xad, 0x01, 0x91, 0x01, 0x91, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x42, 0x01, 0x42, 0x01, 0x11, 0x01, 0x11, 0x01, 0xda, 0x00, 0xda, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x66, 0x00, 0x66, 0x00, 0x29, 0x00, 0x29, 0x00, 0xee, 0xff, 0xee, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x45, 0xff, 0x45, 0xff, 0x14, 0xff, 0x14, 0xff, 0xea, 0xfe, 0xea, 0xfe, 0xc8, 0xfe, 0xc8, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x9d, 0xfe, 0x9d, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0x8f, 0xfe, 0x8f, 0xfe, 0x91, 0xfe, 0x91, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xb4, 0xfe, 0xb4, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0xeb, 0xfe, 0xeb, 0xfe, 0x0c, 0xff, 0x0c, 0xff, 0x30, 0xff, 0x30, 0xff, 0x55, 0xff, 0x55, 0xff, 0x79, 0xff, 0x79, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xba, 0x00, 0xba, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x95, 0x00, 0x95, 0x00, 0x80, 0x00, 0x80, 0x00, 0x69, 0x00, 0x69, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x37, 0x00, 0x37, 0x00, 0x22, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x02, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x23, 0x00, 0x23, 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x09, 0x00, 0x09, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x00, 0x19, 0x00, 0x19, 0x00, 0x21, 0x00, 0x21, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x76, 0x00, 0x76, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x81, 0x00, 0x81, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x63, 0x00, 0x63, 0x00, 0x57, 0x00, 0x57, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x39, 0x00, 0x39, 0x00, 0x28, 0x00, 0x28, 0x00, 0x14, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xef, 0xff, 0xef, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x97, 0xff, 0x97, 0xff, 0x92, 0xff, 0x92, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x88, 0xff, 0x88, 0xff, 0x84, 0xff, 0x84, 0xff, 0x83, 0xff, 0x83, 0xff, 0x84, 0xff, 0x84, 0xff, 0x89, 0xff, 0x89, 0xff, 0x92, 0xff, 0x92, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xab, 0xff, 0xab, 0xff, 0xba, 0xff, 0xba, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x33, 0x00, 0x33, 0x00, 0x42, 0x00, 0x42, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x60, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x52, 0x00, 0x52, 0x00, 0x47, 0x00, 0x47, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x30, 0x00, 0x30, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xae, 0xff, 0xae, 0xff, 0xad, 0xff, 0xad, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x28, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x14, 0x00, 0x14, 0x00, 0x06, 0x00, 0x06, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xda, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x03, 0x00, 0x03, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x29, 0x00, 0x29, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x49, 0x00, 0x49, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x32, 0x00, 0x32, 0x00, 0x23, 0x00, 0x23, 0x00, 0x10, 0x00, 0x10, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xad, 0xff, 0xad, 0xff, 0xac, 0xff, 0xac, 0xff, 0xab, 0xff, 0xab, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x06, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x46, 0x00, 0x46, 0x00, 0x54, 0x00, 0x54, 0x00, 0x62, 0x00, 0x62, 0x00, 0x73, 0x00, 0x73, 0x00, 0x81, 0x00, 0x81, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x92, 0x00, 0x92, 0x00, 0x91, 0x00, 0x91, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x85, 0x00, 0x85, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x71, 0x00, 0x71, 0x00, 0x62, 0x00, 0x62, 0x00, 0x51, 0x00, 0x51, 0x00, 0x41, 0x00, 0x41, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x07, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x91, 0xff, 0x91, 0xff, 0x83, 0xff, 0x83, 0xff, 0x77, 0xff, 0x77, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x62, 0xff, 0x62, 0xff, 0x63, 0xff, 0x63, 0xff, 0x69, 0xff, 0x69, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x76, 0xff, 0x76, 0xff, 0x80, 0xff, 0x80, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xed, 0xff, 0xed, 0xff, 0x06, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x44, 0x00, 0x44, 0x00, 0x55, 0x00, 0x55, 0x00, 0x67, 0x00, 0x67, 0x00, 0x78, 0x00, 0x78, 0x00, 0x86, 0x00, 0x86, 0x00, 0x91, 0x00, 0x91, 0x00, 0x98, 0x00, 0x98, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x93, 0x00, 0x93, 0x00, 0x85, 0x00, 0x85, 0x00, 0x76, 0x00, 0x76, 0x00, 0x65, 0x00, 0x65, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x38, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x07, 0x00, 0x07, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x99, 0xff, 0x99, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x89, 0xff, 0x89, 0xff, 0x85, 0xff, 0x85, 0xff, 0x81, 0xff, 0x81, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x80, 0xff, 0x80, 0xff, 0x85, 0xff, 0x85, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x95, 0xff, 0x95, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0xad, 0xff, 0xad, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xde, 0xff, 0xde, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x05, 0x00, 0x05, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x36, 0x00, 0x36, 0x00, 0x43, 0x00, 0x43, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x66, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x57, 0x00, 0x57, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x22, 0x00, 0x22, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x33, 0x00, 0x33, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x44, 0x00, 0x44, 0x00, 0x46, 0x00, 0x46, 0x00, 0x44, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x22, 0x00, 0x22, 0x00, 0x16, 0x00, 0x16, 0x00, 0x09, 0x00, 0x09, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xad, 0xff, 0xad, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x66, 0xff, 0x66, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x65, 0xff, 0x65, 0xff, 0x70, 0xff, 0x70, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xba, 0xff, 0xba, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xee, 0xff, 0xee, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x68, 0x00, 0x68, 0x00, 0x83, 0x00, 0x83, 0x00, 0x99, 0x00, 0x99, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x75, 0x00, 0x75, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x40, 0x00, 0x40, 0x00, 0x23, 0x00, 0x23, 0x00, 0x06, 0x00, 0x06, 0x00, 0xe6, 0xff, 0xe6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x74, 0xff, 0x74, 0xff, 0x60, 0xff, 0x60, 0xff, 0x51, 0xff, 0x51, 0xff, 0x48, 0xff, 0x48, 0xff, 0x44, 0xff, 0x44, 0xff, 0x43, 0xff, 0x43, 0xff, 0x48, 0xff, 0x48, 0xff, 0x53, 0xff, 0x53, 0xff, 0x65, 0xff, 0x65, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x95, 0xff, 0x95, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x30, 0x00, 0x30, 0x00, 0x45, 0x00, 0x45, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x72, 0x00, 0x72, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x60, 0x00, 0x60, 0x00, 0x55, 0x00, 0x55, 0x00, 0x48, 0x00, 0x48, 0x00, 0x38, 0x00, 0x38, 0x00, 0x27, 0x00, 0x27, 0x00, 0x16, 0x00, 0x16, 0x00, 0x03, 0x00, 0x03, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x97, 0xff, 0x97, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x84, 0xff, 0x84, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x86, 0xff, 0x86, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0x01, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x51, 0x00, 0x51, 0x00, 0x67, 0x00, 0x67, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xae, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x98, 0x00, 0x98, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x57, 0x00, 0x57, 0x00, 0x41, 0x00, 0x41, 0x00, 0x26, 0x00, 0x26, 0x00, 0x09, 0x00, 0x09, 0x00, 0xee, 0xff, 0xee, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x93, 0xff, 0x93, 0xff, 0x81, 0xff, 0x81, 0xff, 0x73, 0xff, 0x73, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x64, 0xff, 0x64, 0xff, 0x62, 0xff, 0x62, 0xff, 0x66, 0xff, 0x66, 0xff, 0x73, 0xff, 0x73, 0xff, 0x85, 0xff, 0x85, 0xff, 0x99, 0xff, 0x99, 0xff, 0xae, 0xff, 0xae, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x12, 0x00, 0x12, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x64, 0x00, 0x64, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x52, 0x00, 0x52, 0x00, 0x44, 0x00, 0x44, 0x00, 0x33, 0x00, 0x33, 0x00, 0x20, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x99, 0xff, 0x99, 0xff, 0x86, 0xff, 0x86, 0xff, 0x75, 0xff, 0x75, 0xff, 0x68, 0xff, 0x68, 0xff, 0x60, 0xff, 0x60, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x62, 0xff, 0x62, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x74, 0xff, 0x74, 0xff, 0x82, 0xff, 0x82, 0xff, 0x92, 0xff, 0x92, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x02, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x41, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x64, 0x00, 0x64, 0x00, 0x77, 0x00, 0x77, 0x00, 0x88, 0x00, 0x88, 0x00, 0x97, 0x00, 0x97, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x76, 0x00, 0x76, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x29, 0x00, 0x29, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf2, 0xff, 0xf2, 0xff, 0xda, 0xff, 0xda, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x77, 0xff, 0x77, 0xff, 0x62, 0xff, 0x62, 0xff, 0x50, 0xff, 0x50, 0xff, 0x41, 0xff, 0x41, 0xff, 0x34, 0xff, 0x34, 0xff, 0x29, 0xff, 0x29, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x19, 0xff, 0x19, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x23, 0xff, 0x23, 0xff, 0x30, 0xff, 0x30, 0xff, 0x43, 0xff, 0x43, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x75, 0xff, 0x75, 0xff, 0x91, 0xff, 0x91, 0xff, 0xad, 0xff, 0xad, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x97, 0x00, 0x97, 0x00, 0xab, 0x00, 0xab, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xca, 0x00, 0xca, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xda, 0x00, 0xda, 0x00, 0xde, 0x00, 0xde, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x97, 0x00, 0x97, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x64, 0x00, 0x64, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x12, 0x00, 0x12, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x79, 0xff, 0x79, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x61, 0xff, 0x61, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x59, 0xff, 0x59, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x60, 0xff, 0x60, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x75, 0xff, 0x75, 0xff, 0x84, 0xff, 0x84, 0xff, 0x96, 0xff, 0x96, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xec, 0xff, 0xec, 0xff, 0x04, 0x00, 0x04, 0x00, 0x19, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x48, 0x00, 0x48, 0x00, 0x52, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x61, 0x00, 0x61, 0x00, 0x68, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x72, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x67, 0x00, 0x67, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x52, 0x00, 0x52, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0xef, 0xff, 0xef, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x99, 0xff, 0x99, 0xff, 0x92, 0xff, 0x92, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x88, 0xff, 0x88, 0xff, 0x87, 0xff, 0x87, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x91, 0xff, 0x91, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x06, 0x00, 0x06, 0x00, 0x14, 0x00, 0x14, 0x00, 0x23, 0x00, 0x23, 0x00, 0x32, 0x00, 0x32, 0x00, 0x41, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x62, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x70, 0x00, 0x70, 0x00, 0x74, 0x00, 0x74, 0x00, 0x76, 0x00, 0x76, 0x00, 0x72, 0x00, 0x72, 0x00, 0x69, 0x00, 0x69, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x15, 0x00, 0x15, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x18, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x38, 0x00, 0x38, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x52, 0x00, 0x54, 0x00, 0x54, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x42, 0x00, 0x42, 0x00, 0x37, 0x00, 0x37, 0x00, 0x27, 0x00, 0x27, 0x00, 0x14, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xce, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x11, 0x00, 0x24, 0x00, 0x24, 0x00, 0x36, 0x00, 0x36, 0x00, 0x46, 0x00, 0x46, 0x00, 0x54, 0x00, 0x54, 0x00, 0x60, 0x00, 0x60, 0x00, 0x69, 0x00, 0x69, 0x00, 0x72, 0x00, 0x72, 0x00, 0x78, 0x00, 0x78, 0x00, 0x79, 0x00, 0x79, 0x00, 0x77, 0x00, 0x77, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x28, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xad, 0xff, 0xad, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x91, 0xff, 0x91, 0xff, 0x85, 0xff, 0x85, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x76, 0xff, 0x76, 0xff, 0x75, 0xff, 0x75, 0xff, 0x79, 0xff, 0x79, 0xff, 0x80, 0xff, 0x80, 0xff, 0x88, 0xff, 0x88, 0xff, 0x92, 0xff, 0x92, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xad, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xef, 0xff, 0xef, 0xff, 0x03, 0x00, 0x03, 0x00, 0x14, 0x00, 0x14, 0x00, 0x25, 0x00, 0x25, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x50, 0x00, 0x50, 0x00, 0x56, 0x00, 0x56, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x64, 0x00, 0x64, 0x00, 0x67, 0x00, 0x67, 0x00, 0x65, 0x00, 0x65, 0x00, 0x61, 0x00, 0x61, 0x00, 0x59, 0x00, 0x59, 0x00, 0x50, 0x00, 0x50, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x09, 0x00, 0x09, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x07, 0x00, 0x07, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x30, 0x00, 0x34, 0x00, 0x34, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x11, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x02, 0x00, 0x02, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x24, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, 0x51, 0x00, 0x55, 0x00, 0x55, 0x00, 0x57, 0x00, 0x57, 0x00, 0x54, 0x00, 0x54, 0x00, 0x50, 0x00, 0x50, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x30, 0x00, 0x30, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xac, 0xff, 0xac, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x91, 0xff, 0x91, 0xff, 0x86, 0xff, 0x86, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x79, 0xff, 0x79, 0xff, 0x79, 0xff, 0x79, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x84, 0xff, 0x84, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xde, 0xff, 0xde, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x21, 0x00, 0x34, 0x00, 0x34, 0x00, 0x46, 0x00, 0x46, 0x00, 0x59, 0x00, 0x59, 0x00, 0x67, 0x00, 0x67, 0x00, 0x73, 0x00, 0x73, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x85, 0x00, 0x85, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x85, 0x00, 0x85, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x54, 0x00, 0x54, 0x00, 0x45, 0x00, 0x45, 0x00, 0x36, 0x00, 0x36, 0x00, 0x26, 0x00, 0x26, 0x00, 0x13, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 0xef, 0xff, 0xef, 0xff, 0xde, 0xff, 0xde, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xae, 0xff, 0xae, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x97, 0xff, 0x97, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x88, 0xff, 0x88, 0xff, 0x83, 0xff, 0x83, 0xff, 0x84, 0xff, 0x84, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x95, 0xff, 0x95, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xad, 0xff, 0xad, 0xff, 0xba, 0xff, 0xba, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x09, 0x00, 0x09, 0x00, 0x18, 0x00, 0x18, 0x00, 0x26, 0x00, 0x26, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x46, 0x00, 0x47, 0x00, 0x47, 0x00, 0x47, 0x00, 0x47, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x48, 0x00, 0x48, 0x00, 0x46, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x00, 0x16, 0x00, 0x16, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x09, 0x00, 0x03, 0x00, 0x03, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x12, 0x00, 0x13, 0x00, 0x13, 0x00, 0x14, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x31, 0x00, 0x31, 0x00, 0x28, 0x00, 0x28, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xef, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x08, 0x00, 0x08, 0x00, 0x19, 0x00, 0x19, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x86, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x92, 0x00, 0x92, 0x00, 0x94, 0x00, 0x94, 0x00, 0x91, 0x00, 0x91, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x80, 0x00, 0x80, 0x00, 0x73, 0x00, 0x73, 0x00, 0x64, 0x00, 0x64, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x18, 0x00, 0x18, 0x00, 0x02, 0x00, 0x02, 0x00, 0xeb, 0xff, 0xeb, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xba, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0x95, 0xff, 0x95, 0xff, 0x87, 0xff, 0x87, 0xff, 0x79, 0xff, 0x79, 0xff, 0x6d, 0xff, 0x6d, 0xff, 0x68, 0xff, 0x68, 0xff, 0x69, 0xff, 0x69, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x75, 0xff, 0x75, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xea, 0xff, 0x02, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x35, 0x00, 0x35, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xab, 0x00, 0xab, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x98, 0x00, 0x98, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x81, 0x00, 0x81, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x43, 0x00, 0x43, 0x00, 0x28, 0x00, 0x28, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x60, 0xff, 0x60, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x57, 0xff, 0x57, 0xff, 0x59, 0xff, 0x59, 0xff, 0x62, 0xff, 0x62, 0xff, 0x71, 0xff, 0x71, 0xff, 0x83, 0xff, 0x83, 0xff, 0x95, 0xff, 0x95, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x27, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x55, 0x00, 0x55, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x88, 0x00, 0x88, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x35, 0x00, 0x35, 0x00, 0x19, 0x00, 0x19, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x50, 0xff, 0x50, 0xff, 0x48, 0xff, 0x48, 0xff, 0x49, 0xff, 0x49, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x69, 0xff, 0x69, 0xff, 0x78, 0xff, 0x78, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x1d, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x58, 0x00, 0x58, 0x00, 0x72, 0x00, 0x72, 0x00, 0x88, 0x00, 0x88, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xae, 0x00, 0xae, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x67, 0x00, 0x67, 0x00, 0x51, 0x00, 0x51, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x26, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf1, 0xff, 0xf1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xba, 0xff, 0xba, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x77, 0xff, 0x77, 0xff, 0x68, 0xff, 0x68, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x52, 0xff, 0x52, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x48, 0xff, 0x48, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x51, 0xff, 0x51, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x69, 0xff, 0x69, 0xff, 0x79, 0xff, 0x79, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xba, 0xff, 0xba, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x28, 0x00, 0x41, 0x00, 0x41, 0x00, 0x59, 0x00, 0x59, 0x00, 0x71, 0x00, 0x71, 0x00, 0x85, 0x00, 0x85, 0x00, 0x95, 0x00, 0x95, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xac, 0x00, 0xac, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x98, 0x00, 0x98, 0x00, 0x88, 0x00, 0x88, 0x00, 0x77, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x23, 0x00, 0x23, 0x00, 0x09, 0x00, 0x09, 0x00, 0xee, 0xff, 0xee, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x91, 0xff, 0x91, 0xff, 0x89, 0xff, 0x89, 0xff, 0x87, 0xff, 0x87, 0xff, 0x86, 0xff, 0x86, 0xff, 0x84, 0xff, 0x84, 0xff, 0x83, 0xff, 0x83, 0xff, 0x86, 0xff, 0x86, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x98, 0xff, 0x98, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xed, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x29, 0x00, 0x33, 0x00, 0x33, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x16, 0x00, 0x16, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x09, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x37, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x25, 0x00, 0x25, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x03, 0x00, 0x03, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x28, 0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x43, 0x00, 0x43, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x53, 0x00, 0x53, 0x00, 0x59, 0x00, 0x59, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x43, 0x00, 0x43, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x30, 0x00, 0x30, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xec, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x31, 0x00, 0x31, 0x00, 0x41, 0x00, 0x41, 0x00, 0x51, 0x00, 0x51, 0x00, 0x60, 0x00, 0x60, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x85, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x88, 0x00, 0x88, 0x00, 0x80, 0x00, 0x80, 0x00, 0x75, 0x00, 0x75, 0x00, 0x65, 0x00, 0x65, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x21, 0x00, 0x21, 0x00, 0x07, 0x00, 0x07, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x70, 0xff, 0x70, 0xff, 0x68, 0xff, 0x68, 0xff, 0x64, 0xff, 0x64, 0xff, 0x62, 0xff, 0x62, 0xff, 0x65, 0xff, 0x65, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x79, 0xff, 0x79, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xef, 0xff, 0xef, 0xff, 0x07, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x49, 0x00, 0x49, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x70, 0x00, 0x70, 0x00, 0x81, 0x00, 0x81, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x96, 0x00, 0x96, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0x98, 0x00, 0x98, 0x00, 0x92, 0x00, 0x92, 0x00, 0x89, 0x00, 0x89, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x02, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x90, 0xff, 0x90, 0xff, 0x83, 0xff, 0x83, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x76, 0xff, 0x76, 0xff, 0x76, 0xff, 0x76, 0xff, 0x77, 0xff, 0x77, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x99, 0xff, 0x99, 0xff, 0xab, 0xff, 0xab, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x18, 0x00, 0x25, 0x00, 0x25, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x47, 0x00, 0x47, 0x00, 0x50, 0x00, 0x50, 0x00, 0x55, 0x00, 0x55, 0x00, 0x57, 0x00, 0x57, 0x00, 0x59, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x59, 0x00, 0x59, 0x00, 0x57, 0x00, 0x57, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x35, 0x00, 0x35, 0x00, 0x29, 0x00, 0x29, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xea, 0xff, 0xea, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x17, 0x00, 0x23, 0x00, 0x23, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x45, 0x00, 0x45, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x48, 0x00, 0x48, 0x00, 0x43, 0x00, 0x43, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x39, 0x00, 0x39, 0x00, 0x36, 0x00, 0x36, 0x00, 0x32, 0x00, 0x32, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x17, 0x00, 0x17, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xed, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xba, 0xff, 0xba, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x93, 0xff, 0x93, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x91, 0xff, 0x91, 0xff, 0x90, 0xff, 0x90, 0xff, 0x90, 0xff, 0x90, 0xff, 0x91, 0xff, 0x91, 0xff, 0x96, 0xff, 0x96, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0xae, 0xff, 0xae, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xea, 0xff, 0xea, 0xff, 0x01, 0x00, 0x01, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x73, 0x00, 0x73, 0x00, 0x76, 0x00, 0x76, 0x00, 0x75, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x62, 0x00, 0x62, 0x00, 0x58, 0x00, 0x58, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xde, 0xff, 0xde, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x91, 0xff, 0x91, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x93, 0xff, 0x93, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x03, 0x00, 0x03, 0x00, 0x13, 0x00, 0x13, 0x00, 0x22, 0x00, 0x22, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x46, 0x00, 0x46, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xee, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x68, 0x00, 0x68, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x47, 0x00, 0x47, 0x00, 0x34, 0x00, 0x34, 0x00, 0x24, 0x00, 0x24, 0x00, 0x14, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xed, 0xff, 0xed, 0xff, 0xda, 0xff, 0xda, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xba, 0xff, 0xba, 0xff, 0xae, 0xff, 0xae, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x95, 0xff, 0x95, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x89, 0xff, 0x89, 0xff, 0x89, 0xff, 0x89, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x93, 0xff, 0x93, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x13, 0x00, 0x13, 0x00, 0x26, 0x00, 0x26, 0x00, 0x37, 0x00, 0x37, 0x00, 0x47, 0x00, 0x47, 0x00, 0x58, 0x00, 0x58, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x77, 0x00, 0x77, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x75, 0x00, 0x75, 0x00, 0x71, 0x00, 0x71, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x25, 0x00, 0x25, 0x00, 0x16, 0x00, 0x16, 0x00, 0x07, 0x00, 0x07, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x99, 0xff, 0x99, 0xff, 0x99, 0xff, 0x99, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x37, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x37, 0x00, 0x37, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x35, 0x00, 0x35, 0x00, 0x30, 0x00, 0x30, 0x00, 0x27, 0x00, 0x27, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13, 0x00, 0x13, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x09, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xda, 0xff, 0xda, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x05, 0x00, 0x05, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x39, 0x00, 0x39, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x26, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x15, 0x00, 0x15, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xee, 0xff, 0xee, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x23, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x35, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x33, 0x00, 0x33, 0x00, 0x26, 0x00, 0x26, 0x00, 0x18, 0x00, 0x18, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0x05, 0x00, 0x05, 0x00, 0x15, 0x00, 0x15, 0x00, 0x22, 0x00, 0x22, 0x00, 0x30, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x67, 0x00, 0x67, 0x00, 0x60, 0x00, 0x60, 0x00, 0x59, 0x00, 0x59, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x44, 0x00, 0x39, 0x00, 0x39, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x09, 0x00, 0x09, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xed, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0x97, 0xff, 0x97, 0xff, 0x85, 0xff, 0x85, 0xff, 0x74, 0xff, 0x74, 0xff, 0x69, 0xff, 0x69, 0xff, 0x63, 0xff, 0x63, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x62, 0xff, 0x62, 0xff, 0x69, 0xff, 0x69, 0xff, 0x73, 0xff, 0x73, 0xff, 0x81, 0xff, 0x81, 0xff, 0x93, 0xff, 0x93, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xee, 0xff, 0xee, 0xff, 0x07, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x42, 0x00, 0x42, 0x00, 0x55, 0x00, 0x55, 0x00, 0x67, 0x00, 0x67, 0x00, 0x76, 0x00, 0x76, 0x00, 0x84, 0x00, 0x84, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x95, 0x00, 0x95, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x96, 0x00, 0x96, 0x00, 0x88, 0x00, 0x88, 0x00, 0x75, 0x00, 0x75, 0x00, 0x61, 0x00, 0x61, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x25, 0x00, 0x25, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x97, 0xff, 0x97, 0xff, 0x89, 0xff, 0x89, 0xff, 0x80, 0xff, 0x80, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x79, 0xff, 0x79, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x82, 0xff, 0x82, 0xff, 0x89, 0xff, 0x89, 0xff, 0x91, 0xff, 0x91, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x31, 0x00, 0x31, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x60, 0x00, 0x60, 0x00, 0x65, 0x00, 0x65, 0x00, 0x67, 0x00, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x62, 0x00, 0x62, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x30, 0x00, 0x30, 0x00, 0x24, 0x00, 0x24, 0x00, 0x16, 0x00, 0x16, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xac, 0xff, 0xac, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x02, 0x00, 0x02, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x56, 0x00, 0x56, 0x00, 0x58, 0x00, 0x58, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x08, 0x00, 0x08, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x25, 0x00, 0x25, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x26, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x21, 0x00, 0x26, 0x00, 0x26, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x29, 0x00, 0x29, 0x00, 0x27, 0x00, 0x27, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xed, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x23, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x31, 0x00, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x33, 0x00, 0x33, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x27, 0x00, 0x27, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xec, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x11, 0x00, 0x14, 0x00, 0x14, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x24, 0x00, 0x24, 0x00, 0x26, 0x00, 0x26, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x28, 0x00, 0x28, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x25, 0x00, 0x25, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x08, 0x00, 0x08, 0x00, 0x17, 0x00, 0x17, 0x00, 0x28, 0x00, 0x28, 0x00, 0x39, 0x00, 0x39, 0x00, 0x49, 0x00, 0x49, 0x00, 0x57, 0x00, 0x57, 0x00, 0x62, 0x00, 0x62, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x75, 0x00, 0x75, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x78, 0x00, 0x78, 0x00, 0x71, 0x00, 0x71, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x60, 0x00, 0x60, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xed, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x99, 0xff, 0x99, 0xff, 0x98, 0xff, 0x98, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x04, 0x00, 0x04, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x24, 0x00, 0x32, 0x00, 0x32, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x62, 0x00, 0x62, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x43, 0x00, 0x43, 0x00, 0x38, 0x00, 0x38, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x09, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x11, 0x00, 0x12, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xed, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x06, 0x00, 0x06, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x64, 0x00, 0x64, 0x00, 0x67, 0x00, 0x67, 0x00, 0x68, 0x00, 0x68, 0x00, 0x65, 0x00, 0x65, 0x00, 0x61, 0x00, 0x61, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xac, 0xff, 0xac, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x06, 0x00, 0x06, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x42, 0x00, 0x49, 0x00, 0x49, 0x00, 0x50, 0x00, 0x50, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x58, 0x00, 0x58, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x39, 0x00, 0x39, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xec, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xba, 0xff, 0xba, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x98, 0xff, 0x98, 0xff, 0x93, 0xff, 0x93, 0xff, 0x92, 0xff, 0x92, 0xff, 0x97, 0xff, 0x97, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x06, 0x00, 0x06, 0x00, 0x17, 0x00, 0x17, 0x00, 0x27, 0x00, 0x27, 0x00, 0x39, 0x00, 0x39, 0x00, 0x48, 0x00, 0x48, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x64, 0x00, 0x64, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x71, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x69, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x50, 0x00, 0x50, 0x00, 0x41, 0x00, 0x41, 0x00, 0x32, 0x00, 0x32, 0x00, 0x21, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xab, 0xff, 0xab, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x91, 0xff, 0x91, 0xff, 0x88, 0xff, 0x88, 0xff, 0x83, 0xff, 0x83, 0xff, 0x82, 0xff, 0x82, 0xff, 0x86, 0xff, 0x86, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x92, 0xff, 0x92, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x08, 0x00, 0x08, 0x00, 0x15, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x50, 0x00, 0x50, 0x00, 0x56, 0x00, 0x56, 0x00, 0x58, 0x00, 0x58, 0x00, 0x57, 0x00, 0x57, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x43, 0x00, 0x34, 0x00, 0x34, 0x00, 0x24, 0x00, 0x24, 0x00, 0x15, 0x00, 0x15, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf2, 0xff, 0xf2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x98, 0xff, 0x98, 0xff, 0x95, 0xff, 0x95, 0xff, 0x96, 0xff, 0x96, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x09, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x54, 0x00, 0x54, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x31, 0x00, 0x31, 0x00, 0x24, 0x00, 0x24, 0x00, 0x17, 0x00, 0x17, 0x00, 0x08, 0x00, 0x08, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xec, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xce, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x08, 0x00, 0x08, 0x00, 0x15, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x54, 0x00, 0x54, 0x00, 0x53, 0x00, 0x53, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x43, 0x00, 0x43, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x21, 0x00, 0x21, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xed, 0xff, 0xec, 0xff, 0xec, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xef, 0xff, 0xec, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24, 0x00, 0x24, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x28, 0x00, 0x28, 0x00, 0x27, 0x00, 0x27, 0x00, 0x26, 0x00, 0x26, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x21, 0x00, 0x21, 0x00, 0x26, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, 0x00, 0x27, 0x00, 0x27, 0x00, 0x26, 0x00, 0x26, 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x19, 0x00, 0x19, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xda, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x10, 0x00, 0x10, 0x00, 0x16, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x37, 0x00, 0x37, 0x00, 0x36, 0x00, 0x36, 0x00, 0x31, 0x00, 0x31, 0x00, 0x29, 0x00, 0x29, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x17, 0x00, 0x17, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x02, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x31, 0x00, 0x32, 0x00, 0x32, 0x00, 0x33, 0x00, 0x33, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x27, 0x00, 0x27, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x19, 0x00, 0x22, 0x00, 0x22, 0x00, 0x29, 0x00, 0x29, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x35, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x43, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x44, 0x00, 0x44, 0x00, 0x43, 0x00, 0x43, 0x00, 0x43, 0x00, 0x43, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x19, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xed, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x21, 0x00, 0x24, 0x00, 0x24, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x28, 0x00, 0x28, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xec, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x09, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x15, 0x00, 0x18, 0x00, 0x18, 0x00, 0x19, 0x00, 0x19, 0x00, 0x18, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x16, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x13, 0x00, 0x13, 0x00, 0x13, 0x00, 0x13, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xef, 0xff, 0xed, 0xff, 0xed, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x14, 0x00, 0x14, 0x00, 0x23, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x25, 0x00, 0x25, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x13, 0x00, 0x13, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xef, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x07, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x16, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xed, 0xff, 0xed, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xde, 0xff, 0xde, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x55, 0x00, 0x55, 0x00, 0x59, 0x00, 0x59, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x58, 0x00, 0x58, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x49, 0x00, 0x49, 0x00, 0x42, 0x00, 0x42, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x59, 0x00, 0x59, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x75, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x66, 0x00, 0x74, 0x00, 0x74, 0x00, 0x87, 0x00, 0x87, 0x00, 0x81, 0x00, 0x81, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x65, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x50, 0x00, 0x45, 0x00, 0x45, 0x00, 0x37, 0x00, 0x37, 0x00, 0x21, 0x00, 0x21, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x15, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xee, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x05, 0x00, 0x05, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0x0b, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x24, 0x00, 0x25, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x57, 0x00, 0x39, 0x00, 0x39, 0x00, 0x35, 0x00, 0x35, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x84, 0x00, 0x84, 0x00, 0xde, 0x00, 0xde, 0x00, 0xab, 0x00, 0xab, 0x00, 0x89, 0xff, 0x89, 0xff, 0x52, 0xfd, 0x52, 0xfd, 0xba, 0xfa, 0xba, 0xfa, 0x11, 0xfa, 0x11, 0xfa, 0x79, 0xfc, 0x79, 0xfc, 0x96, 0xff, 0x96, 0xff, 0xee, 0x00, 0xee, 0x00, 0x69, 0x00, 0x69, 0x00, 0x63, 0xfe, 0x63, 0xfe, 0xa0, 0xfb, 0xa0, 0xfb, 0xdd, 0xf9, 0xdd, 0xf9, 0x58, 0xf9, 0x58, 0xf9, 0xec, 0xf8, 0xed, 0xf8, 0x22, 0xf9, 0x22, 0xf9, 0x2b, 0xfb, 0x2b, 0xfb, 0x4b, 0xfe, 0x4b, 0xfe, 0xaa, 0x00, 0xaa, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x5a, 0xff, 0x5a, 0xff, 0xcc, 0xfc, 0xcc, 0xfc, 0x43, 0xfb, 0x44, 0xfb, 0x0b, 0xfc, 0x0b, 0xfc, 0xb1, 0xfe, 0xb2, 0xfe, 0x15, 0x01, 0x15, 0x01, 0x81, 0x01, 0x81, 0x01, 0x2d, 0x00, 0x2d, 0x00, 0x02, 0xfe, 0x02, 0xfe, 0xdd, 0xfb, 0xdd, 0xfb, 0xed, 0xfa, 0xed, 0xfa, 0x80, 0xfb, 0x81, 0xfb, 0x7f, 0xfc, 0x7f, 0xfc, 0x1a, 0xfd, 0x1a, 0xfd, 0x75, 0xfd, 0x75, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0x22, 0xfd, 0x22, 0xfd, 0xa2, 0xfc, 0xa2, 0xfc, 0xf1, 0xfc, 0xf1, 0xfc, 0x38, 0xfe, 0x38, 0xfe, 0xcb, 0xff, 0xcb, 0xff, 0x06, 0x01, 0x07, 0x01, 0x92, 0x01, 0x92, 0x01, 0x93, 0x01, 0x93, 0x01, 0x11, 0x02, 0x11, 0x02, 0xc7, 0x03, 0xc7, 0x03, 0xdb, 0x05, 0xdb, 0x05, 0x16, 0x07, 0x16, 0x07, 0x51, 0x07, 0x51, 0x07, 0x18, 0x07, 0x18, 0x07, 0xfa, 0x06, 0xfa, 0x06, 0x08, 0x07, 0x08, 0x07, 0xf5, 0x06, 0xf5, 0x06, 0xd8, 0x06, 0xd8, 0x06, 0x09, 0x07, 0x09, 0x07, 0x4c, 0x07, 0x4c, 0x07, 0xff, 0x06, 0xff, 0x06, 0x8c, 0x05, 0x8b, 0x05, 0xfa, 0x02, 0xfa, 0x02, 0xa8, 0x00, 0xa8, 0x00, 0x29, 0x00, 0x28, 0x00, 0x52, 0x01, 0x51, 0x01, 0xa4, 0x02, 0xa3, 0x02, 0x03, 0x03, 0x02, 0x03, 0x4e, 0x02, 0x4d, 0x02, 0x10, 0x01, 0x10, 0x01, 0xe1, 0xff, 0xe1, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x64, 0xff, 0x64, 0xff, 0x9d, 0x00, 0x9d, 0x00, 0x6c, 0x02, 0x6c, 0x02, 0x44, 0x04, 0x43, 0x04, 0x7c, 0x05, 0x7c, 0x05, 0xb4, 0x05, 0xb3, 0x05, 0x75, 0x05, 0x74, 0x05, 0x84, 0x05, 0x83, 0x05, 0x16, 0x06, 0x16, 0x06, 0x35, 0x07, 0x35, 0x07, 0xcb, 0x08, 0xcb, 0x08, 0x6a, 0x0a, 0x6a, 0x0a, 0xaa, 0x0b, 0xa9, 0x0b, 0x4b, 0x0c, 0x4b, 0x0c, 0x50, 0x0c, 0x4f, 0x0c, 0x34, 0x0c, 0x34, 0x0c, 0x6c, 0x0c, 0x6b, 0x0c, 0xfc, 0x0c, 0xfc, 0x0c, 0x99, 0x0d, 0x99, 0x0d, 0x9b, 0x0d, 0x9a, 0x0d, 0x7c, 0x0c, 0x7b, 0x0c, 0x8e, 0x0a, 0x8e, 0x0a, 0x64, 0x08, 0x64, 0x08, 0x4f, 0x06, 0x4e, 0x06, 0xe7, 0x04, 0xe6, 0x04, 0x8f, 0x04, 0x8f, 0x04, 0x8b, 0x04, 0x8a, 0x04, 0xb7, 0x03, 0xb6, 0x03, 0xa6, 0x01, 0xa6, 0x01, 0xb9, 0xfe, 0xb9, 0xfe, 0xe5, 0xfb, 0xe5, 0xfb, 0x3f, 0xfa, 0x3e, 0xfa, 0x23, 0xfa, 0x23, 0xfa, 0x03, 0xfb, 0x02, 0xfb, 0xf5, 0xfb, 0xf4, 0xfb, 0x3b, 0xfc, 0x3a, 0xfc, 0x7b, 0xfb, 0x7a, 0xfb, 0xc9, 0xf9, 0xc8, 0xf9, 0xaf, 0xf7, 0xaf, 0xf7, 0x22, 0xf6, 0x21, 0xf6, 0xe7, 0xf5, 0xe6, 0xf5, 0xfc, 0xf6, 0xfb, 0xf6, 0x97, 0xf8, 0x97, 0xf8, 0xc5, 0xf9, 0xc5, 0xf9, 0xf9, 0xf9, 0xf8, 0xf9, 0x40, 0xf9, 0x40, 0xf9, 0x35, 0xf8, 0x35, 0xf8, 0x8b, 0xf7, 0x8b, 0xf7, 0x9b, 0xf7, 0x9b, 0xf7, 0x33, 0xf8, 0x33, 0xf8, 0xd7, 0xf8, 0xd7, 0xf8, 0xf0, 0xf8, 0xf1, 0xf8, 0x09, 0xf8, 0x0a, 0xf8, 0x77, 0xf6, 0x78, 0xf6, 0x48, 0xf5, 0x49, 0xf5, 0x5a, 0xf5, 0x5b, 0xf5, 0xb5, 0xf6, 0xb6, 0xf6, 0x89, 0xf8, 0x8a, 0xf8, 0xa0, 0xf9, 0xa1, 0xf9, 0x5a, 0xf9, 0x5b, 0xf9, 0x24, 0xf8, 0x25, 0xf8, 0xe7, 0xf6, 0xe8, 0xf6, 0x6f, 0xf6, 0x70, 0xf6, 0x1c, 0xf7, 0x1d, 0xf7, 0xa8, 0xf8, 0xa9, 0xf8, 0x5a, 0xfa, 0x5a, 0xfa, 0x8d, 0xfb, 0x8d, 0xfb, 0xeb, 0xfb, 0xeb, 0xfb, 0x7b, 0xfb, 0x7b, 0xfb, 0xb2, 0xfa, 0xb2, 0xfa, 0x2c, 0xfa, 0x2c, 0xfa, 0x48, 0xfa, 0x48, 0xfa, 0x1a, 0xfb, 0x19, 0xfb, 0x7e, 0xfc, 0x7d, 0xfc, 0x12, 0xfe, 0x11, 0xfe, 0x50, 0xff, 0x4f, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe9, 0xff, 0x55, 0x00, 0x54, 0x00, 0x3a, 0x01, 0x39, 0x01, 0x2f, 0x02, 0x2d, 0x02, 0x9d, 0x02, 0x9b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0xaf, 0x01, 0xb6, 0x01, 0x7d, 0x01, 0x8b, 0x01, 0x0a, 0x02, 0x1e, 0x02, 0x2a, 0x03, 0x3f, 0x03, 0x6b, 0x04, 0x7d, 0x04, 0x3f, 0x05, 0x4b, 0x05, 0x34, 0x05, 0x3a, 0x05, 0x4e, 0x04, 0x4f, 0x04, 0x0d, 0x03, 0x0e, 0x03, 0xfe, 0x01, 0x05, 0x02, 0x7e, 0x01, 0x8e, 0x01, 0xb3, 0x01, 0xcb, 0x01, 0x63, 0x02, 0x7e, 0x02, 0x00, 0x03, 0x18, 0x03, 0x13, 0x03, 0x21, 0x03, 0x86, 0x02, 0x87, 0x02, 0x78, 0x01, 0x6f, 0x01, 0x22, 0x00, 0x13, 0x00, 0xeb, 0xfe, 0xdb, 0xfe, 0x3e, 0xfe, 0x32, 0xfe, 0x1c, 0xfe, 0x14, 0xfe, 0x26, 0xfe, 0x20, 0xfe, 0x08, 0xfe, 0x00, 0xfe, 0x9a, 0xfd, 0x90, 0xfd, 0xe8, 0xfc, 0xdb, 0xfc, 0x36, 0xfc, 0x29, 0xfc, 0xc0, 0xfb, 0xb7, 0xfb, 0x75, 0xfb, 0x74, 0xfb, 0x18, 0xfb, 0x1e, 0xfb, 0x8c, 0xfa, 0x97, 0xfa, 0xd2, 0xf9, 0xde, 0xf9, 0x07, 0xf9, 0x11, 0xf9, 0x76, 0xf8, 0x7d, 0xf8, 0x62, 0xf8, 0x66, 0xf8, 0xc7, 0xf8, 0xc9, 0xf8, 0x64, 0xf9, 0x65, 0xf9, 0xe0, 0xf9, 0xde, 0xf9, 0xed, 0xf9, 0xe9, 0xf9, 0x75, 0xf9, 0x6c, 0xf9, 0xaa, 0xf8, 0x9b, 0xf8, 0xfb, 0xf7, 0xe8, 0xf7, 0xd5, 0xf7, 0xbe, 0xf7, 0x56, 0xf8, 0x3a, 0xf8, 0x55, 0xf9, 0x35, 0xf9, 0x8a, 0xfa, 0x66, 0xfa, 0x92, 0xfb, 0x6b, 0xfb, 0x20, 0xfc, 0xf7, 0xfb, 0x40, 0xfc, 0x17, 0xfc, 0x47, 0xfc, 0x20, 0xfc, 0x6b, 0xfc, 0x48, 0xfc, 0xc4, 0xfc, 0xa6, 0xfc, 0x60, 0xfd, 0x48, 0xfd, 0x21, 0xfe, 0x12, 0xfe, 0xe4, 0xfe, 0xe0, 0xfe, 0xaa, 0xff, 0xb0, 0xff, 0x78, 0x00, 0x86, 0x00, 0x42, 0x01, 0x56, 0x01, 0x06, 0x02, 0x1f, 0x02, 0xc5, 0x02, 0xe1, 0x02, 0x66, 0x03, 0x87, 0x03, 0xd0, 0x03, 0xf6, 0x03, 0x03, 0x04, 0x2c, 0x04, 0x1d, 0x04, 0x49, 0x04, 0x56, 0x04, 0x86, 0x04, 0xdd, 0x04, 0x13, 0x05, 0xbd, 0x05, 0xf3, 0x05, 0xcd, 0x06, 0xfd, 0x06, 0xbc, 0x07, 0xe1, 0x07, 0x3f, 0x08, 0x59, 0x08, 0x57, 0x08, 0x6c, 0x08, 0x2f, 0x08, 0x47, 0x08, 0xff, 0x07, 0x1e, 0x08, 0x02, 0x08, 0x24, 0x08, 0x5a, 0x08, 0x78, 0x08, 0xf5, 0x08, 0x0a, 0x09, 0xa0, 0x09, 0xa9, 0x09, 0x29, 0x0a, 0x27, 0x0a, 0x69, 0x0a, 0x61, 0x0a, 0x4d, 0x0a, 0x48, 0x0a, 0xe5, 0x09, 0xeb, 0x09, 0x4f, 0x09, 0x61, 0x09, 0xa2, 0x08, 0xbd, 0x08, 0xf5, 0x07, 0x10, 0x08, 0x65, 0x07, 0x75, 0x07, 0x09, 0x07, 0x0a, 0x07, 0xda, 0x06, 0xd1, 0x06, 0xb4, 0x06, 0xac, 0x06, 0x6e, 0x06, 0x6d, 0x06, 0xf4, 0x05, 0xfd, 0x05, 0x43, 0x05, 0x54, 0x05, 0x67, 0x04, 0x7a, 0x04, 0x76, 0x03, 0x83, 0x03, 0x7e, 0x02, 0x81, 0x02, 0x99, 0x01, 0x8f, 0x01, 0xe5, 0x00, 0xd2, 0x00, 0x71, 0x00, 0x5e, 0x00, 0x2c, 0x00, 0x24, 0x00, 0xe8, 0xff, 0xf0, 0xff, 0x83, 0xff, 0x93, 0xff, 0xfd, 0xfe, 0x0a, 0xff, 0x5c, 0xfe, 0x5c, 0xfe, 0xad, 0xfd, 0x9c, 0xfd, 0xff, 0xfc, 0xe2, 0xfc, 0x5e, 0xfc, 0x3f, 0xfc, 0xd9, 0xfb, 0xbe, 0xfb, 0x91, 0xfb, 0x7b, 0xfb, 0x93, 0xfb, 0x7c, 0xfb, 0xc1, 0xfb, 0xa2, 0xfb, 0xf8, 0xfb, 0xcb, 0xfb, 0x0d, 0xfc, 0xd1, 0xfb, 0xe4, 0xfb, 0x9a, 0xfb, 0x93, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0xe3, 0xfa, 0xf9, 0xfa, 0x98, 0xfa, 0xda, 0xfa, 0x76, 0xfa, 0xf9, 0xfa, 0x92, 0xfa, 0x4b, 0xfb, 0xe2, 0xfa, 0xc6, 0xfb, 0x5e, 0xfb, 0x55, 0xfc, 0xf3, 0xfb, 0xc9, 0xfc, 0x70, 0xfc, 0x01, 0xfd, 0xb0, 0xfc, 0x0d, 0xfd, 0xc1, 0xfc, 0x13, 0xfd, 0xc8, 0xfc, 0x33, 0xfd, 0xeb, 0xfc, 0x76, 0xfd, 0x36, 0xfd, 0xc5, 0xfd, 0x95, 0xfd, 0x1b, 0xfe, 0xfc, 0xfd, 0x8c, 0xfe, 0x7c, 0xfe, 0x23, 0xff, 0x1a, 0xff, 0xcd, 0xff, 0xc6, 0xff, 0x62, 0x00, 0x55, 0x00, 0xbb, 0x00, 0xa6, 0x00, 0xde, 0x00, 0xc0, 0x00, 0xfb, 0x00, 0xd8, 0x00, 0x35, 0x01, 0x13, 0x01, 0x90, 0x01, 0x6e, 0x01, 0xfe, 0x01, 0xd7, 0x01, 0x8b, 0x02, 0x58, 0x02, 0x46, 0x03, 0x02, 0x03, 0x21, 0x04, 0xcc, 0x03, 0xf1, 0x04, 0x90, 0x04, 0x7a, 0x05, 0x12, 0x05, 0xa2, 0x05, 0x35, 0x05, 0x9a, 0x05, 0x2a, 0x05, 0xac, 0x05, 0x3b, 0x05, 0xf3, 0x05, 0x84, 0x05, 0x5f, 0x06, 0xf9, 0x05, 0xd8, 0x06, 0x80, 0x06, 0x42, 0x07, 0xfd, 0x06, 0x97, 0x07, 0x62, 0x07, 0xd6, 0x07, 0xaf, 0x07, 0xe7, 0x07, 0xca, 0x07, 0xbb, 0x07, 0xa8, 0x07, 0x67, 0x07, 0x62, 0x07, 0x00, 0x07, 0x0f, 0x07, 0x93, 0x06, 0xc0, 0x06, 0x2c, 0x06, 0x7f, 0x06, 0xca, 0x05, 0x49, 0x06, 0x6d, 0x05, 0x17, 0x06, 0x1a, 0x05, 0xe6, 0x05, 0xbc, 0x04, 0x9c, 0x05, 0x35, 0x04, 0x1e, 0x05, 0x83, 0x03, 0x71, 0x04, 0xad, 0x02, 0xa8, 0x03, 0xc9, 0x01, 0xdb, 0x02, 0xf9, 0x00, 0x27, 0x02, 0x47, 0x00, 0x8b, 0x01, 0xa7, 0xff, 0xf6, 0x00, 0x1a, 0xff, 0x65, 0x00, 0x9f, 0xfe, 0xdd, 0xff, 0x21, 0xfe, 0x50, 0xff, 0x94, 0xfd, 0xb7, 0xfe, 0xf3, 0xfc, 0x11, 0xfe, 0x3b, 0xfc, 0x5c, 0xfd, 0x78, 0xfb, 0xa1, 0xfc, 0xc2, 0xfa, 0xf3, 0xfb, 0x2e, 0xfa, 0x62, 0xfb, 0xd0, 0xf9, 0xf9, 0xfa, 0xa7, 0xf9, 0xba, 0xfa, 0x9b, 0xf9, 0x95, 0xfa, 0x8b, 0xf9, 0x70, 0xfa, 0x5f, 0xf9, 0x38, 0xfa, 0x16, 0xf9, 0xe5, 0xf9, 0xc8, 0xf8, 0x88, 0xf9, 0x90, 0xf8, 0x39, 0xf9, 0x72, 0xf8, 0x01, 0xf9, 0x71, 0xf8, 0xeb, 0xf8, 0x98, 0xf8, 0x01, 0xf9, 0xeb, 0xf8, 0x43, 0xf9, 0x5b, 0xf9, 0x9b, 0xf9, 0xd1, 0xf9, 0xee, 0xf9, 0x3a, 0xfa, 0x2b, 0xfa, 0x8c, 0xfa, 0x4c, 0xfa, 0xcd, 0xfa, 0x5c, 0xfa, 0x11, 0xfb, 0x74, 0xfa, 0x5f, 0xfb, 0xa5, 0xfa, 0xc1, 0xfb, 0xf5, 0xfa, 0x3b, 0xfc, 0x65, 0xfb, 0xcf, 0xfc, 0xf1, 0xfb, 0x73, 0xfd, 0x8a, 0xfc, 0x19, 0xfe, 0x20, 0xfd, 0xae, 0xfe, 0xa6, 0xfd, 0x26, 0xff, 0x14, 0xfe, 0x84, 0xff, 0x71, 0xfe, 0xd3, 0xff, 0xc8, 0xfe, 0x28, 0x00, 0x2b, 0xff, 0x99, 0x00, 0xac, 0xff, 0x26, 0x01, 0x47, 0x00, 0xca, 0x01, 0xf2, 0x00, 0x76, 0x02, 0x9c, 0x01, 0x12, 0x03, 0x33, 0x02, 0x98, 0x03, 0xb3, 0x02, 0x02, 0x04, 0x1c, 0x03, 0x51, 0x04, 0x6b, 0x03, 0x8d, 0x04, 0xa6, 0x03, 0xc9, 0x04, 0xd8, 0x03, 0x18, 0x05, 0x10, 0x04, 0x83, 0x05, 0x5c, 0x04, 0xfe, 0x05, 0xb6, 0x04, 0x72, 0x06, 0x0f, 0x05, 0xc8, 0x06, 0x57, 0x05, 0xfa, 0x06, 0x84, 0x05, 0x0e, 0x07, 0x95, 0x05, 0x05, 0x07, 0x86, 0x05, 0xe8, 0x06, 0x5f, 0x05, 0xbe, 0x06, 0x2e, 0x05, 0x92, 0x06, 0xfd, 0x04, 0x6f, 0x06, 0xe1, 0x04, 0x5c, 0x06, 0xdd, 0x04, 0x46, 0x06, 0xe1, 0x04, 0x1a, 0x06, 0xd8, 0x04, 0xd1, 0x05, 0xb9, 0x04, 0x65, 0x05, 0x79, 0x04, 0xd1, 0x04, 0x15, 0x04, 0x26, 0x04, 0x9e, 0x03, 0x74, 0x03, 0x25, 0x03, 0xcb, 0x02, 0xb7, 0x02, 0x3c, 0x02, 0x5f, 0x02, 0xc0, 0x01, 0x16, 0x02, 0x44, 0x01, 0xc7, 0x01, 0xbd, 0x00, 0x6a, 0x01, 0x28, 0x00, 0xfe, 0x00, 0x84, 0xff, 0x7f, 0x00, 0xd7, 0xfe, 0xf0, 0xff, 0x26, 0xfe, 0x54, 0xff, 0x79, 0xfd, 0xb1, 0xfe, 0xe1, 0xfc, 0x17, 0xfe, 0x63, 0xfc, 0x8e, 0xfd, 0xf3, 0xfb, 0x0f, 0xfd, 0x87, 0xfb, 0x95, 0xfc, 0x1e, 0xfb, 0x21, 0xfc, 0xb8, 0xfa, 0xb2, 0xfb, 0x57, 0xfa, 0x46, 0xfb, 0xfa, 0xf9, 0xda, 0xfa, 0x9c, 0xf9, 0x68, 0xfa, 0x43, 0xf9, 0xf3, 0xf9, 0xfb, 0xf8, 0x8d, 0xf9, 0xd1, 0xf8, 0x47, 0xf9, 0xc6, 0xf8, 0x2c, 0xf9, 0xd5, 0xf8, 0x3b, 0xf9, 0xea, 0xf8, 0x60, 0xf9, 0xf5, 0xf8, 0x83, 0xf9, 0xf4, 0xf8, 0x9d, 0xf9, 0xef, 0xf8, 0xb0, 0xf9, 0xeb, 0xf8, 0xc1, 0xf9, 0xf2, 0xf8, 0xdb, 0xf9, 0x13, 0xf9, 0x0e, 0xfa, 0x50, 0xf9, 0x5d, 0xfa, 0xa3, 0xf9, 0xc5, 0xfa, 0x0c, 0xfa, 0x45, 0xfb, 0x81, 0xfa, 0xd0, 0xfb, 0xf8, 0xfa, 0x57, 0xfc, 0x6e, 0xfb, 0xd1, 0xfc, 0xe3, 0xfb, 0x40, 0xfd, 0x58, 0xfc, 0xaa, 0xfd, 0xd2, 0xfc, 0x16, 0xfe, 0x54, 0xfd, 0x88, 0xfe, 0xe0, 0xfd, 0xfe, 0xfe, 0x76, 0xfe, 0x76, 0xff, 0x14, 0xff, 0xf2, 0xff, 0xb5, 0xff, 0x70, 0x00, 0x52, 0x00, 0xed, 0x00, 0xe2, 0x00, 0x63, 0x01, 0x5e, 0x01, 0xc8, 0x01, 0xc6, 0x01, 0x1a, 0x02, 0x1c, 0x02, 0x5c, 0x02, 0x6d, 0x02, 0x96, 0x02, 0xc8, 0x02, 0xd5, 0x02, 0x33, 0x03, 0x21, 0x03, 0xa3, 0x03, 0x79, 0x03, 0x0c, 0x04, 0xd5, 0x03, 0x61, 0x04, 0x2b, 0x04, 0x95, 0x04, 0x6a, 0x04, 0xa4, 0x04, 0x89, 0x04, 0x9d, 0x04, 0x8f, 0x04, 0x93, 0x04, 0x8e, 0x04, 0x86, 0x04, 0x8a, 0x04, 0x77, 0x04, 0x84, 0x04, 0x6f, 0x04, 0x84, 0x04, 0x6c, 0x04, 0x86, 0x04, 0x67, 0x04, 0x85, 0x04, 0x5d, 0x04, 0x7c, 0x04, 0x40, 0x04, 0x63, 0x04, 0x08, 0x04, 0x32, 0x04, 0xbc, 0x03, 0xed, 0x03, 0x6b, 0x03, 0xa1, 0x03, 0x1f, 0x03, 0x56, 0x03, 0xdd, 0x02, 0x0f, 0x03, 0xa4, 0x02, 0xcc, 0x02, 0x6d, 0x02, 0x87, 0x02, 0x34, 0x02, 0x3d, 0x02, 0xef, 0x01, 0xe8, 0x01, 0x95, 0x01, 0x81, 0x01, 0x27, 0x01, 0x0c, 0x01, 0xaf, 0x00, 0x92, 0x00, 0x34, 0x00, 0x19, 0x00, 0xc1, 0xff, 0xa2, 0xff, 0x5f, 0xff, 0x35, 0xff, 0x08, 0xff, 0xca, 0xfe, 0xb4, 0xfe, 0x5e, 0xfe, 0x64, 0xfe, 0xf8, 0xfd, 0x18, 0xfe, 0x9a, 0xfd, 0xc8, 0xfd, 0x3b, 0xfd, 0x74, 0xfd, 0xd9, 0xfc, 0x1e, 0xfd, 0x76, 0xfc, 0xc3, 0xfc, 0x0e, 0xfc, 0x69, 0xfc, 0xa9, 0xfb, 0x1d, 0xfc, 0x50, 0xfb, 0xe7, 0xfb, 0x0a, 0xfb, 0xcc, 0xfb, 0xdc, 0xfa, 0xc9, 0xfb, 0xc5, 0xfa, 0xd2, 0xfb, 0xbd, 0xfa, 0xdd, 0xfb, 0xbb, 0xfa, 0xdd, 0xfb, 0xb2, 0xfa, 0xcd, 0xfb, 0x9b, 0xfa, 0xbc, 0xfb, 0x85, 0xfa, 0xb7, 0xfb, 0x80, 0xfa, 0xbe, 0xfb, 0x8c, 0xfa, 0xcf, 0xfb, 0xa4, 0xfa, 0xeb, 0xfb, 0xc7, 0xfa, 0x10, 0xfc, 0xee, 0xfa, 0x39, 0xfc, 0x14, 0xfb, 0x65, 0xfc, 0x42, 0xfb, 0x96, 0xfc, 0x80, 0xfb, 0xc0, 0xfc, 0xc5, 0xfb, 0xe8, 0xfc, 0x0e, 0xfc, 0x1a, 0xfd, 0x5f, 0xfc, 0x5f, 0xfd, 0xb8, 0xfc, 0xb1, 0xfd, 0x12, 0xfd, 0x0e, 0xfe, 0x6a, 0xfd, 0x79, 0xfe, 0xc9, 0xfd, 0xea, 0xfe, 0x2e, 0xfe, 0x5a, 0xff, 0x97, 0xfe, 0xcb, 0xff, 0x0d, 0xff, 0x39, 0x00, 0x8d, 0xff, 0x9f, 0x00, 0x08, 0x00, 0x06, 0x01, 0x7d, 0x00, 0x75, 0x01, 0xec, 0x00, 0xee, 0x01, 0x59, 0x01, 0x71, 0x02, 0xc8, 0x01, 0xf7, 0x02, 0x3d, 0x02, 0x7b, 0x03, 0xb6, 0x02, 0xf3, 0x03, 0x27, 0x03, 0x56, 0x04, 0x85, 0x03, 0xa9, 0x04, 0xd2, 0x03, 0xf1, 0x04, 0x0c, 0x04, 0x2b, 0x05, 0x31, 0x04, 0x5f, 0x05, 0x49, 0x04, 0x9b, 0x05, 0x6c, 0x04, 0xdf, 0x05, 0xa0, 0x04, 0x1d, 0x06, 0xda, 0x04, 0x51, 0x06, 0x14, 0x05, 0x78, 0x06, 0x44, 0x05, 0x88, 0x06, 0x5d, 0x05, 0x85, 0x06, 0x62, 0x05, 0x76, 0x06, 0x5f, 0x05, 0x5c, 0x06, 0x58, 0x05, 0x39, 0x06, 0x4e, 0x05, 0x14, 0x06, 0x46, 0x05, 0xe8, 0x05, 0x3e, 0x05, 0xab, 0x05, 0x2c, 0x05, 0x63, 0x05, 0x14, 0x05, 0x19, 0x05, 0xfc, 0x04, 0xca, 0x04, 0xdd, 0x04, 0x75, 0x04, 0xb4, 0x04, 0x19, 0x04, 0x82, 0x04, 0xb2, 0x03, 0x46, 0x04, 0x3d, 0x03, 0xfd, 0x03, 0xbb, 0x02, 0xa9, 0x03, 0x3a, 0x02, 0x56, 0x03, 0xc2, 0x01, 0x0b, 0x03, 0x5d, 0x01, 0xcb, 0x02, 0x03, 0x01, 0x8a, 0x02, 0xaa, 0x00, 0x38, 0x02, 0x42, 0x00, 0xc9, 0x01, 0xbe, 0xff, 0x3f, 0x01, 0x26, 0xff, 0xac, 0x00, 0x90, 0xfe, 0x27, 0x00, 0x08, 0xfe, 0xb6, 0xff, 0x97, 0xfd, 0x58, 0xff, 0x44, 0xfd, 0x0e, 0xff, 0x02, 0xfd, 0xcc, 0xfe, 0xc0, 0xfc, 0x84, 0xfe, 0x73, 0xfc, 0x2c, 0xfe, 0x1c, 0xfc, 0xc8, 0xfd, 0xb9, 0xfb, 0x5d, 0xfd, 0x53, 0xfb, 0xfe, 0xfc, 0xfd, 0xfa, 0xc0, 0xfc, 0xbc, 0xfa, 0x9e, 0xfc, 0x92, 0xfa, 0x8d, 0xfc, 0x85, 0xfa, 0x86, 0xfc, 0x8f, 0xfa, 0x84, 0xfc, 0x97, 0xfa, 0x7c, 0xfc, 0x96, 0xfa, 0x72, 0xfc, 0x8e, 0xfa, 0x70, 0xfc, 0x88, 0xfa, 0x77, 0xfc, 0x8d, 0xfa, 0x86, 0xfc, 0xaa, 0xfa, 0xa3, 0xfc, 0xe0, 0xfa, 0xcb, 0xfc, 0x24, 0xfb, 0xf9, 0xfc, 0x6f, 0xfb, 0x2c, 0xfd, 0xb7, 0xfb, 0x61, 0xfd, 0xf8, 0xfb, 0x98, 0xfd, 0x33, 0xfc, 0xcd, 0xfd, 0x6c, 0xfc, 0xfb, 0xfd, 0xa9, 0xfc, 0x1c, 0xfe, 0xec, 0xfc, 0x31, 0xfe, 0x2f, 0xfd, 0x3c, 0xfe, 0x70, 0xfd, 0x46, 0xfe, 0xb4, 0xfd, 0x60, 0xfe, 0xff, 0xfd, 0x90, 0xfe, 0x56, 0xfe, 0xd5, 0xfe, 0xb0, 0xfe, 0x21, 0xff, 0x04, 0xff, 0x64, 0xff, 0x49, 0xff, 0x91, 0xff, 0x80, 0xff, 0xa7, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xf1, 0xff, 0xc8, 0xff, 0x38, 0x00, 0xf1, 0xff, 0x86, 0x00, 0x31, 0x00, 0xd1, 0x00, 0x7d, 0x00, 0x13, 0x01, 0xc0, 0x00, 0x4d, 0x01, 0xf0, 0x00, 0x7e, 0x01, 0x0a, 0x01, 0xa5, 0x01, 0x17, 0x01, 0xc7, 0x01, 0x28, 0x01, 0xe9, 0x01, 0x44, 0x01, 0x12, 0x02, 0x6a, 0x01, 0x41, 0x02, 0x96, 0x01, 0x76, 0x02, 0xc3, 0x01, 0xa1, 0x02, 0xea, 0x01, 0xbe, 0x02, 0x0c, 0x02, 0xcd, 0x02, 0x27, 0x02, 0xd6, 0x02, 0x3b, 0x02, 0xde, 0x02, 0x49, 0x02, 0xe7, 0x02, 0x52, 0x02, 0xef, 0x02, 0x58, 0x02, 0xef, 0x02, 0x50, 0x02, 0xe1, 0x02, 0x37, 0x02, 0xc4, 0x02, 0x11, 0x02, 0xa8, 0x02, 0xf2, 0x01, 0x93, 0x02, 0xe6, 0x01, 0x85, 0x02, 0xeb, 0x01, 0x79, 0x02, 0xf5, 0x01, 0x60, 0x02, 0xec, 0x01, 0x2a, 0x02, 0xc0, 0x01, 0xd5, 0x01, 0x72, 0x01, 0x6d, 0x01, 0x15, 0x01, 0xff, 0x00, 0xb8, 0x00, 0x98, 0x00, 0x65, 0x00, 0x46, 0x00, 0x28, 0x00, 0x0a, 0x00, 0xff, 0xff, 0xd3, 0xff, 0xd9, 0xff, 0x92, 0xff, 0xa9, 0xff, 0x3a, 0xff, 0x66, 0xff, 0xca, 0xfe, 0x10, 0xff, 0x50, 0xfe, 0xb6, 0xfe, 0xe3, 0xfd, 0x6d, 0xfe, 0x94, 0xfd, 0x3a, 0xfe, 0x5e, 0xfd, 0x0f, 0xfe, 0x3e, 0xfd, 0xe6, 0xfd, 0x29, 0xfd, 0xbb, 0xfd, 0x16, 0xfd, 0x8e, 0xfd, 0x02, 0xfd, 0x66, 0xfd, 0xea, 0xfc, 0x41, 0xfd, 0xd2, 0xfc, 0x1d, 0xfd, 0xbf, 0xfc, 0xf3, 0xfc, 0xb5, 0xfc, 0xc4, 0xfc, 0xb7, 0xfc, 0x94, 0xfc, 0xcf, 0xfc, 0x70, 0xfc, 0xf9, 0xfc, 0x5d, 0xfc, 0x30, 0xfd, 0x5c, 0xfc, 0x6a, 0xfd, 0x68, 0xfc, 0xa0, 0xfd, 0x77, 0xfc, 0xcf, 0xfd, 0x81, 0xfc, 0xfa, 0xfd, 0x80, 0xfc, 0x23, 0xfe, 0x73, 0xfc, 0x49, 0xfe, 0x5d, 0xfc, 0x6c, 0xfe, 0x4a, 0xfc, 0x91, 0xfe, 0x4b, 0xfc, 0xc2, 0xfe, 0x68, 0xfc, 0x06, 0xff, 0x9d, 0xfc, 0x5c, 0xff, 0xde, 0xfc, 0xba, 0xff, 0x1b, 0xfd, 0x0d, 0x00, 0x49, 0xfd, 0x54, 0x00, 0x74, 0xfd, 0x91, 0x00, 0xa9, 0xfd, 0xd0, 0x00, 0xf2, 0xfd, 0x19, 0x01, 0x50, 0xfe, 0x75, 0x01, 0xc1, 0xfe, 0xe4, 0x01, 0x3c, 0xff, 0x57, 0x02, 0xb1, 0xff, 0xc2, 0x02, 0x16, 0x00, 0x1b, 0x03, 0x69, 0x00, 0x5f, 0x03, 0xb1, 0x00, 0x95, 0x03, 0xfa, 0x00, 0xbf, 0x03, 0x4c, 0x01, 0xe5, 0x03, 0xa7, 0x01, 0x17, 0x04, 0x0b, 0x02, 0x57, 0x04, 0x6f, 0x02, 0x9b, 0x04, 0xc8, 0x02, 0xd8, 0x04, 0x13, 0x03, 0x00, 0x05, 0x4d, 0x03, 0x0e, 0x05, 0x78, 0x03, 0x0b, 0x05, 0x9e, 0x03, 0x09, 0x05, 0xcf, 0x03, 0x0d, 0x05, 0x0a, 0x04, 0x11, 0x05, 0x47, 0x04, 0x0c, 0x05, 0x78, 0x04, 0xf5, 0x04, 0x90, 0x04, 0xcc, 0x04, 0x90, 0x04, 0x99, 0x04, 0x80, 0x04, 0x67, 0x04, 0x71, 0x04, 0x3f, 0x04, 0x6f, 0x04, 0x20, 0x04, 0x78, 0x04, 0xfd, 0x03, 0x82, 0x04, 0xcb, 0x03, 0x7e, 0x04, 0x87, 0x03, 0x66, 0x04, 0x37, 0x03, 0x41, 0x04, 0xe8, 0x02, 0x19, 0x04, 0xa5, 0x02, 0xf5, 0x03, 0x69, 0x02, 0xd3, 0x03, 0x28, 0x02, 0xa6, 0x03, 0xe5, 0x01, 0x70, 0x03, 0xa4, 0x01, 0x3b, 0x03, 0x5a, 0x01, 0x01, 0x03, 0x05, 0x01, 0xc4, 0x02, 0xaa, 0x00, 0x87, 0x02, 0x4f, 0x00, 0x4c, 0x02, 0xfa, 0xff, 0x15, 0x02, 0xab, 0xff, 0xde, 0x01, 0x5a, 0xff, 0xa0, 0x01, 0xf9, 0xfe, 0x52, 0x01, 0x8d, 0xfe, 0xfa, 0x00, 0x27, 0xfe, 0xa6, 0x00, 0xcf, 0xfd, 0x61, 0x00, 0x89, 0xfd, 0x2b, 0x00, 0x4c, 0xfd, 0xfb, 0xff, 0x0b, 0xfd, 0xc4, 0xff, 0xc1, 0xfc, 0x83, 0xff, 0x79, 0xfc, 0x3f, 0xff, 0x3b, 0xfc, 0x00, 0xff, 0x0e, 0xfc, 0xcc, 0xfe, 0xf7, 0xfb, 0xa9, 0xfe, 0xe9, 0xfb, 0x8d, 0xfe, 0xd4, 0xfb, 0x68, 0xfe, 0xb3, 0xfb, 0x34, 0xfe, 0x8a, 0xfb, 0xf3, 0xfd, 0x68, 0xfb, 0xb4, 0xfd, 0x5f, 0xfb, 0x88, 0xfd, 0x75, 0xfb, 0x78, 0xfd, 0x9f, 0xfb, 0x78, 0xfd, 0xcf, 0xfb, 0x76, 0xfd, 0x01, 0xfc, 0x6c, 0xfd, 0x2c, 0xfc, 0x55, 0xfd, 0x50, 0xfc, 0x30, 0xfd, 0x75, 0xfc, 0x08, 0xfd, 0xa5, 0xfc, 0xe3, 0xfc, 0xe8, 0xfc, 0xcd, 0xfc, 0x41, 0xfd, 0xcc, 0xfc, 0xb0, 0xfd, 0xe7, 0xfc, 0x28, 0xfe, 0x16, 0xfd, 0x9b, 0xfe, 0x4a, 0xfd, 0xfd, 0xfe, 0x70, 0xfd, 0x4f, 0xff, 0x81, 0xfd, 0x97, 0xff, 0x88, 0xfd, 0xe6, 0xff, 0x97, 0xfd, 0x47, 0x00, 0xc0, 0xfd, 0xb8, 0x00, 0x0c, 0xfe, 0x2a, 0x01, 0x72, 0xfe, 0x85, 0x01, 0xd6, 0xfe, 0xbd, 0x01, 0x28, 0xff, 0xdb, 0x01, 0x6b, 0xff, 0xed, 0x01, 0xa7, 0xff, 0x00, 0x02, 0xe5, 0xff, 0x1d, 0x02, 0x2c, 0x00, 0x40, 0x02, 0x7d, 0x00, 0x61, 0x02, 0xd3, 0x00, 0x81, 0x02, 0x2e, 0x01, 0xa0, 0x02, 0x90, 0x01, 0xb7, 0x02, 0xec, 0x01, 0xc2, 0x02, 0x33, 0x02, 0xc9, 0x02, 0x67, 0x02, 0xd5, 0x02, 0x94, 0x02, 0xe7, 0x02, 0xbd, 0x02, 0xfc, 0x02, 0xe1, 0x02, 0x0f, 0x03, 0x01, 0x03, 0x1b, 0x03, 0x1d, 0x03, 0x21, 0x03, 0x33, 0x03, 0x1f, 0x03, 0x41, 0x03, 0x1c, 0x03, 0x4d, 0x03, 0x1b, 0x03, 0x5a, 0x03, 0x19, 0x03, 0x63, 0x03, 0x0f, 0x03, 0x69, 0x03, 0xf6, 0x02, 0x68, 0x03, 0xc7, 0x02, 0x56, 0x03, 0x84, 0x02, 0x31, 0x03, 0x36, 0x02, 0x01, 0x03, 0xec, 0x01, 0xd6, 0x02, 0xb3, 0x01, 0xbb, 0x02, 0x81, 0x01, 0xa9, 0x02, 0x48, 0x01, 0x93, 0x02, 0xff, 0x00, 0x6d, 0x02, 0xa5, 0x00, 0x33, 0x02, 0x3b, 0x00, 0xe7, 0x01, 0xcd, 0xff, 0x94, 0x01, 0x63, 0xff, 0x42, 0x01, 0xfe, 0xfe, 0xef, 0x00, 0x9e, 0xfe, 0x9b, 0x00, 0x47, 0xfe, 0x4a, 0x00, 0xf9, 0xfd, 0xfa, 0xff, 0xaf, 0xfd, 0xa8, 0xff, 0x6a, 0xfd, 0x54, 0xff, 0x2d, 0xfd, 0xfe, 0xfe, 0xf4, 0xfc, 0x9f, 0xfe, 0xbe, 0xfc, 0x3c, 0xfe, 0x92, 0xfc, 0xe0, 0xfd, 0x71, 0xfc, 0x8e, 0xfd, 0x53, 0xfc, 0x40, 0xfd, 0x3d, 0xfc, 0xf3, 0xfc, 0x36, 0xfc, 0xae, 0xfc, 0x40, 0xfc, 0x74, 0xfc, 0x53, 0xfc, 0x47, 0xfc, 0x68, 0xfc, 0x26, 0xfc, 0x7c, 0xfc, 0x08, 0xfc, 0x88, 0xfc, 0xe6, 0xfb, 0x8f, 0xfc, 0xc0, 0xfb, 0x9f, 0xfc, 0xa5, 0xfb, 0xbf, 0xfc, 0x9e, 0xfb, 0xe7, 0xfc, 0xa9, 0xfb, 0x14, 0xfd, 0xc2, 0xfb, 0x48, 0xfd, 0xee, 0xfb, 0x7a, 0xfd, 0x2a, 0xfc, 0xa3, 0xfd, 0x6e, 0xfc, 0xc3, 0xfd, 0xb2, 0xfc, 0xe3, 0xfd, 0xf4, 0xfc, 0x03, 0xfe, 0x31, 0xfd, 0x22, 0xfe, 0x6b, 0xfd, 0x47, 0xfe, 0xb1, 0xfd, 0x71, 0xfe, 0x0b, 0xfe, 0x95, 0xfe, 0x6b, 0xfe, 0xb8, 0xfe, 0xcb, 0xfe, 0xe8, 0xfe, 0x2d, 0xff, 0x27, 0xff, 0x8c, 0xff, 0x6d, 0xff, 0xde, 0xff, 0xb6, 0xff, 0x26, 0x00, 0xfe, 0xff, 0x64, 0x00, 0x3d, 0x00, 0x9a, 0x00, 0x77, 0x00, 0xcf, 0x00, 0xb7, 0x00, 0x0e, 0x01, 0xff, 0x00, 0x57, 0x01, 0x4c, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0xde, 0x01, 0xf3, 0x01, 0x0e, 0x02, 0x3f, 0x02, 0x2f, 0x02, 0x7e, 0x02, 0x4b, 0x02, 0xa9, 0x02, 0x6b, 0x02, 0xc5, 0x02, 0x92, 0x02, 0xdb, 0x02, 0xc1, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0x1a, 0x03, 0x31, 0x03, 0x44, 0x03, 0x70, 0x03, 0x68, 0x03, 0xad, 0x03, 0x7c, 0x03, 0xe1, 0x03, 0x80, 0x03, 0x03, 0x04, 0x73, 0x03, 0x11, 0x04, 0x54, 0x03, 0x0e, 0x04, 0x24, 0x03, 0x02, 0x04, 0xe8, 0x02, 0xf5, 0x03, 0xa4, 0x02, 0xe8, 0x03, 0x60, 0x02, 0xd8, 0x03, 0x20, 0x02, 0xbf, 0x03, 0xe1, 0x01, 0x94, 0x03, 0x9f, 0x01, 0x53, 0x03, 0x5a, 0x01, 0x04, 0x03, 0x17, 0x01, 0xb3, 0x02, 0xd7, 0x00, 0x6a, 0x02, 0x94, 0x00, 0x28, 0x02, 0x48, 0x00, 0xe4, 0x01, 0xf3, 0xff, 0x97, 0x01, 0x9b, 0xff, 0x3d, 0x01, 0x46, 0xff, 0xd5, 0x00, 0xfd, 0xfe, 0x64, 0x00, 0xc3, 0xfe, 0xf2, 0xff, 0x93, 0xfe, 0x85, 0xff, 0x62, 0xfe, 0x1d, 0xff, 0x2b, 0xfe, 0xbd, 0xfe, 0xf0, 0xfd, 0x63, 0xfe, 0xb6, 0xfd, 0x0e, 0xfe, 0x83, 0xfd, 0xb7, 0xfd, 0x61, 0xfd, 0x62, 0xfd, 0x4f, 0xfd, 0x12, 0xfd, 0x47, 0xfd, 0xc7, 0xfc, 0x44, 0xfd, 0x83, 0xfc, 0x44, 0xfd, 0x47, 0xfc, 0x41, 0xfd, 0x12, 0xfc, 0x3c, 0xfd, 0xe2, 0xfb, 0x3a, 0xfd, 0xb8, 0xfb, 0x39, 0xfd, 0x98, 0xfb, 0x35, 0xfd, 0x7e, 0xfb, 0x2e, 0xfd, 0x67, 0xfb, 0x2b, 0xfd, 0x56, 0xfb, 0x32, 0xfd, 0x50, 0xfb, 0x42, 0xfd, 0x53, 0xfb, 0x5f, 0xfd, 0x63, 0xfb, 0x87, 0xfd, 0x83, 0xfb, 0xb1, 0xfd, 0xaa, 0xfb, 0xd8, 0xfd, 0xcf, 0xfb, 0xfe, 0xfd, 0xf2, 0xfb, 0x24, 0xfe, 0x16, 0xfc, 0x47, 0xfe, 0x39, 0xfc, 0x6c, 0xfe, 0x5e, 0xfc, 0x9b, 0xfe, 0x8e, 0xfc, 0xd4, 0xfe, 0xc5, 0xfc, 0x0d, 0xff, 0xfa, 0xfc, 0x45, 0xff, 0x2c, 0xfd, 0x7f, 0xff, 0x61, 0xfd, 0xbc, 0xff, 0x9a, 0xfd, 0x01, 0x00, 0xdb, 0xfd, 0x4e, 0x00, 0x24, 0xfe, 0x98, 0x00, 0x6d, 0xfe, 0xd6, 0x00, 0xad, 0xfe, 0x08, 0x01, 0xe5, 0xfe, 0x31, 0x01, 0x1e, 0xff, 0x58, 0x01, 0x5d, 0xff, 0x89, 0x01, 0xa6, 0xff, 0xc7, 0x01, 0xf8, 0xff, 0x0e, 0x02, 0x4b, 0x00, 0x55, 0x02, 0x99, 0x00, 0x91, 0x02, 0xe0, 0x00, 0xbf, 0x02, 0x21, 0x01, 0xd9, 0x02, 0x5c, 0x01, 0xe7, 0x02, 0x8f, 0x01, 0xed, 0x02, 0xb8, 0x01, 0xf8, 0x02, 0xd9, 0x01, 0x0e, 0x03, 0xf9, 0x01, 0x2c, 0x03, 0x18, 0x02, 0x49, 0x03, 0x38, 0x02, 0x5a, 0x03, 0x56, 0x02, 0x56, 0x03, 0x69, 0x02, 0x3d, 0x03, 0x6f, 0x02, 0x1c, 0x03, 0x72, 0x02, 0x02, 0x03, 0x79, 0x02, 0xed, 0x02, 0x82, 0x02, 0xdb, 0x02, 0x86, 0x02, 0xcc, 0x02, 0x84, 0x02, 0xbb, 0x02, 0x7e, 0x02, 0xa5, 0x02, 0x73, 0x02, 0x89, 0x02, 0x67, 0x02, 0x66, 0x02, 0x58, 0x02, 0x3c, 0x02, 0x43, 0x02, 0x0d, 0x02, 0x27, 0x02, 0xda, 0x01, 0x05, 0x02, 0xa2, 0x01, 0xdf, 0x01, 0x64, 0x01, 0xb4, 0x01, 0x24, 0x01, 0x81, 0x01, 0xe3, 0x00, 0x44, 0x01, 0xa4, 0x00, 0x02, 0x01, 0x68, 0x00, 0xc2, 0x00, 0x2c, 0x00, 0x88, 0x00, 0xeb, 0xff, 0x50, 0x00, 0xa6, 0xff, 0x1a, 0x00, 0x5d, 0xff, 0xe3, 0xff, 0x0e, 0xff, 0xa3, 0xff, 0xba, 0xfe, 0x5d, 0xff, 0x64, 0xfe, 0x11, 0xff, 0x15, 0xfe, 0xcc, 0xfe, 0xd3, 0xfd, 0x98, 0xfe, 0x9d, 0xfd, 0x79, 0xfe, 0x6e, 0xfd, 0x69, 0xfe, 0x3f, 0xfd, 0x5c, 0xfe, 0x11, 0xfd, 0x48, 0xfe, 0xe5, 0xfc, 0x2a, 0xfe, 0xc5, 0xfc, 0x0a, 0xfe, 0xb8, 0xfc, 0xf5, 0xfd, 0xbe, 0xfc, 0xf0, 0xfd, 0xcb, 0xfc, 0xf9, 0xfd, 0xe1, 0xfc, 0x13, 0xfe, 0x01, 0xfd, 0x39, 0xfe, 0x29, 0xfd, 0x63, 0xfe, 0x5d, 0xfd, 0x89, 0xfe, 0x9f, 0xfd, 0xb0, 0xfe, 0xe7, 0xfd, 0xd5, 0xfe, 0x27, 0xfe, 0xf8, 0xfe, 0x5f, 0xfe, 0x1c, 0xff, 0x8e, 0xfe, 0x43, 0xff, 0xb9, 0xfe, 0x6c, 0xff, 0xe5, 0xfe, 0x97, 0xff, 0x1a, 0xff, 0xc6, 0xff, 0x5c, 0xff, 0xfc, 0xff, 0xa8, 0xff, 0x36, 0x00, 0xf6, 0xff, 0x72, 0x00, 0x3a, 0x00, 0xaf, 0x00, 0x70, 0x00, 0xed, 0x00, 0x99, 0x00, 0x28, 0x01, 0xbd, 0x00, 0x5e, 0x01, 0xe4, 0x00, 0x8c, 0x01, 0x14, 0x01, 0xb5, 0x01, 0x4f, 0x01, 0xe0, 0x01, 0x8e, 0x01, 0x12, 0x02, 0xcf, 0x01, 0x4c, 0x02, 0x09, 0x02, 0x85, 0x02, 0x32, 0x02, 0xb2, 0x02, 0x4f, 0x02, 0xd0, 0x02, 0x67, 0x02, 0xe5, 0x02, 0x83, 0x02, 0xf8, 0x02, 0xa5, 0x02, 0x0e, 0x03, 0xca, 0x02, 0x25, 0x03, 0xe8, 0x02, 0x34, 0x03, 0xfe, 0x02, 0x38, 0x03, 0x0e, 0x03, 0x37, 0x03, 0x19, 0x03, 0x34, 0x03, 0x1c, 0x03, 0x2e, 0x03, 0x14, 0x03, 0x21, 0x03, 0xfe, 0x02, 0x07, 0x03, 0xdd, 0x02, 0xe0, 0x02, 0xb6, 0x02, 0xb2, 0x02, 0x92, 0x02, 0x8a, 0x02, 0x71, 0x02, 0x67, 0x02, 0x56, 0x02, 0x46, 0x02, 0x44, 0x02, 0x27, 0x02, 0x32, 0x02, 0x09, 0x02, 0x16, 0x02, 0xed, 0x01, 0xee, 0x01, 0xd3, 0x01, 0xb7, 0x01, 0xb3, 0x01, 0x74, 0x01, 0x87, 0x01, 0x30, 0x01, 0x50, 0x01, 0xf1, 0x00, 0x18, 0x01, 0xbd, 0x00, 0xe9, 0x00, 0x90, 0x00, 0xc2, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x39, 0x00, 0x7f, 0x00, 0x08, 0x00, 0x59, 0x00, 0xd2, 0xff, 0x2c, 0x00, 0x99, 0xff, 0xf8, 0xff, 0x62, 0xff, 0xbf, 0xff, 0x30, 0xff, 0x83, 0xff, 0x0a, 0xff, 0x4b, 0xff, 0xf1, 0xfe, 0x1d, 0xff, 0xe1, 0xfe, 0xf8, 0xfe, 0xd4, 0xfe, 0xd9, 0xfe, 0xc5, 0xfe, 0xbc, 0xfe, 0xb3, 0xfe, 0x9e, 0xfe, 0x9a, 0xfe, 0x80, 0xfe, 0x7c, 0xfe, 0x60, 0xfe, 0x5d, 0xfe, 0x43, 0xfe, 0x3d, 0xfe, 0x28, 0xfe, 0x1c, 0xfe, 0x0c, 0xfe, 0xfb, 0xfd, 0xf2, 0xfd, 0xdb, 0xfd, 0xdb, 0xfd, 0xb7, 0xfd, 0xc4, 0xfd, 0x8e, 0xfd, 0xad, 0xfd, 0x69, 0xfd, 0x9f, 0xfd, 0x4e, 0xfd, 0x9f, 0xfd, 0x39, 0xfd, 0xaa, 0xfd, 0x23, 0xfd, 0xbf, 0xfd, 0x08, 0xfd, 0xd6, 0xfd, 0xed, 0xfc, 0xe9, 0xfd, 0xe0, 0xfc, 0xfc, 0xfd, 0xeb, 0xfc, 0x18, 0xfe, 0x09, 0xfd, 0x40, 0xfe, 0x2f, 0xfd, 0x74, 0xfe, 0x50, 0xfd, 0xa9, 0xfe, 0x6c, 0xfd, 0xdb, 0xfe, 0x91, 0xfd, 0x08, 0xff, 0xc3, 0xfd, 0x37, 0xff, 0x03, 0xfe, 0x6d, 0xff, 0x49, 0xfe, 0xad, 0xff, 0x8e, 0xfe, 0xef, 0xff, 0xcd, 0xfe, 0x29, 0x00, 0x05, 0xff, 0x58, 0x00, 0x40, 0xff, 0x81, 0x00, 0x7f, 0xff, 0xab, 0x00, 0xc3, 0xff, 0xd7, 0x00, 0x09, 0x00, 0x00, 0x01, 0x4b, 0x00, 0x19, 0x01, 0x7f, 0x00, 0x1c, 0x01, 0xa2, 0x00, 0x14, 0x01, 0xc0, 0x00, 0x10, 0x01, 0xdd, 0x00, 0x14, 0x01, 0xf9, 0x00, 0x17, 0x01, 0x17, 0x01, 0x15, 0x01, 0x3a, 0x01, 0x10, 0x01, 0x5e, 0x01, 0x06, 0x01, 0x7c, 0x01, 0x00, 0x01, 0x96, 0x01, 0x01, 0x01, 0xa7, 0x01, 0x05, 0x01, 0xaf, 0x01, 0x07, 0x01, 0xad, 0x01, 0x08, 0x01, 0xaa, 0x01, 0x08, 0x01, 0xa7, 0x01, 0x04, 0x01, 0x9e, 0x01, 0xf7, 0x00, 0x90, 0x01, 0xe4, 0x00, 0x7f, 0x01, 0xd1, 0x00, 0x6a, 0x01, 0xc1, 0x00, 0x52, 0x01, 0xb6, 0x00, 0x39, 0x01, 0xa9, 0x00, 0x1e, 0x01, 0x95, 0x00, 0xff, 0x00, 0x73, 0x00, 0xd9, 0x00, 0x44, 0x00, 0xb1, 0x00, 0x0f, 0x00, 0x89, 0x00, 0xd7, 0xff, 0x62, 0x00, 0xa1, 0xff, 0x41, 0x00, 0x70, 0xff, 0x27, 0x00, 0x46, 0xff, 0x0f, 0x00, 0x21, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xe0, 0xff, 0xde, 0xfe, 0xc6, 0xff, 0xb8, 0xfe, 0xa9, 0xff, 0x8e, 0xfe, 0x8e, 0xff, 0x6b, 0xfe, 0x75, 0xff, 0x51, 0xfe, 0x5d, 0xff, 0x3a, 0xfe, 0x40, 0xff, 0x1e, 0xfe, 0x22, 0xff, 0x01, 0xfe, 0x02, 0xff, 0xe5, 0xfd, 0xd9, 0xfe, 0xcd, 0xfd, 0xa9, 0xfe, 0xbf, 0xfd, 0x77, 0xfe, 0xb6, 0xfd, 0x47, 0xfe, 0xab, 0xfd, 0x1a, 0xfe, 0x96, 0xfd, 0xf5, 0xfd, 0x80, 0xfd, 0xdc, 0xfd, 0x70, 0xfd, 0xc9, 0xfd, 0x69, 0xfd, 0xc0, 0xfd, 0x73, 0xfd, 0xc5, 0xfd, 0x8f, 0xfd, 0xd2, 0xfd, 0xb9, 0xfd, 0xdd, 0xfd, 0xe1, 0xfd, 0xe0, 0xfd, 0xff, 0xfd, 0xda, 0xfd, 0x0f, 0xfe, 0xca, 0xfd, 0x13, 0xfe, 0xb7, 0xfd, 0x15, 0xfe, 0xa7, 0xfd, 0x22, 0xfe, 0xa4, 0xfd, 0x43, 0xfe, 0xae, 0xfd, 0x77, 0xfe, 0xbd, 0xfd, 0xb1, 0xfe, 0xcf, 0xfd, 0xef, 0xfe, 0xe9, 0xfd, 0x2e, 0xff, 0x06, 0xfe, 0x68, 0xff, 0x20, 0xfe, 0x96, 0xff, 0x3b, 0xfe, 0xc0, 0xff, 0x5d, 0xfe, 0xf0, 0xff, 0x83, 0xfe, 0x29, 0x00, 0xb2, 0xfe, 0x6d, 0x00, 0xec, 0xfe, 0xb6, 0x00, 0x2b, 0xff, 0xf9, 0x00, 0x66, 0xff, 0x2f, 0x01, 0x9e, 0xff, 0x5f, 0x01, 0xd6, 0xff, 0x8e, 0x01, 0x11, 0x00, 0xbf, 0x01, 0x4f, 0x00, 0xf1, 0x01, 0x8c, 0x00, 0x1d, 0x02, 0xc3, 0x00, 0x3d, 0x02, 0xf1, 0x00, 0x52, 0x02, 0x1b, 0x01, 0x63, 0x02, 0x4c, 0x01, 0x7a, 0x02, 0x8c, 0x01, 0x9d, 0x02, 0xd3, 0x01, 0xc4, 0x02, 0x11, 0x02, 0xe2, 0x02, 0x3e, 0x02, 0xef, 0x02, 0x58, 0x02, 0xe9, 0x02, 0x68, 0x02, 0xd8, 0x02, 0x7a, 0x02, 0xc3, 0x02, 0x96, 0x02, 0xb5, 0x02, 0xb1, 0x02, 0xa7, 0x02, 0xc3, 0x02, 0x96, 0x02, 0xd0, 0x02, 0x86, 0x02, 0xda, 0x02, 0x74, 0x02, 0xe4, 0x02, 0x5f, 0x02, 0xf4, 0x02, 0x4a, 0x02, 0x05, 0x03, 0x33, 0x02, 0x09, 0x03, 0x16, 0x02, 0xfc, 0x02, 0xf1, 0x01, 0xe4, 0x02, 0xcb, 0x01, 0xbf, 0x02, 0x9f, 0x01, 0x93, 0x02, 0x6f, 0x01, 0x67, 0x02, 0x3f, 0x01, 0x3c, 0x02, 0x0e, 0x01, 0x0e, 0x02, 0xd6, 0x00, 0xd6, 0x01, 0x96, 0x00, 0x96, 0x01, 0x57, 0x00, 0x4f, 0x01, 0x1e, 0x00, 0x01, 0x01, 0xeb, 0xff, 0xb2, 0x00, 0xbc, 0xff, 0x64, 0x00, 0x87, 0xff, 0x1e, 0x00, 0x4f, 0xff, 0xe2, 0xff, 0x17, 0xff, 0xac, 0xff, 0xe2, 0xfe, 0x77, 0xff, 0xb0, 0xfe, 0x3d, 0xff, 0x83, 0xfe, 0xfa, 0xfe, 0x56, 0xfe, 0xaf, 0xfe, 0x27, 0xfe, 0x68, 0xfe, 0xff, 0xfd, 0x2d, 0xfe, 0xde, 0xfd, 0x00, 0xfe, 0xc4, 0xfd, 0xde, 0xfd, 0xb0, 0xfd, 0xbf, 0xfd, 0xa0, 0xfd, 0x9b, 0xfd, 0x90, 0xfd, 0x79, 0xfd, 0x85, 0xfd, 0x5f, 0xfd, 0x82, 0xfd, 0x50, 0xfd, 0x83, 0xfd, 0x4d, 0xfd, 0x86, 0xfd, 0x53, 0xfd, 0x8f, 0xfd, 0x61, 0xfd, 0xa5, 0xfd, 0x6e, 0xfd, 0xc4, 0xfd, 0x7c, 0xfd, 0xed, 0xfd, 0x8b, 0xfd, 0x17, 0xfe, 0x97, 0xfd, 0x3a, 0xfe, 0xaa, 0xfd, 0x58, 0xfe, 0xc7, 0xfd, 0x76, 0xfe, 0xe9, 0xfd, 0x97, 0xfe, 0x12, 0xfe, 0xc1, 0xfe, 0x3a, 0xfe, 0xf1, 0xfe, 0x5b, 0xfe, 0x1e, 0xff, 0x73, 0xfe, 0x43, 0xff, 0x8b, 0xfe, 0x62, 0xff, 0xa9, 0xfe, 0x7e, 0xff, 0xd2, 0xfe, 0x98, 0xff, 0x0b, 0xff, 0xba, 0xff, 0x4e, 0xff, 0xe6, 0xff, 0x97, 0xff, 0x1a, 0x00, 0xdd, 0xff, 0x51, 0x00, 0x18, 0x00, 0x7e, 0x00, 0x47, 0x00, 0x97, 0x00, 0x72, 0x00, 0xa1, 0x00, 0xa9, 0x00, 0xab, 0x00, 0xf0, 0x00, 0xbe, 0x00, 0x48, 0x01, 0xdf, 0x00, 0xa5, 0x01, 0x08, 0x01, 0xf9, 0x01, 0x2f, 0x01, 0x43, 0x02, 0x4d, 0x01, 0x85, 0x02, 0x65, 0x01, 0xc4, 0x02, 0x78, 0x01, 0x03, 0x03, 0x8a, 0x01, 0x3d, 0x03, 0x95, 0x01, 0x6d, 0x03, 0x98, 0x01, 0x92, 0x03, 0x98, 0x01, 0xb1, 0x03, 0x96, 0x01, 0xd0, 0x03, 0x92, 0x01, 0xed, 0x03, 0x8b, 0x01, 0x09, 0x04, 0x7e, 0x01, 0x1d, 0x04, 0x66, 0x01, 0x25, 0x04, 0x44, 0x01, 0x23, 0x04, 0x1d, 0x01, 0x1a, 0x04, 0xf6, 0x00, 0x0a, 0x04, 0xce, 0x00, 0xf2, 0x03, 0xa2, 0x00, 0xd1, 0x03, 0x70, 0x00, 0xac, 0x03, 0x39, 0x00, 0x89, 0x03, 0x05, 0x00, 0x66, 0x03, 0xd4, 0xff, 0x3d, 0x03, 0xa4, 0xff, 0x08, 0x03, 0x73, 0xff, 0xc0, 0x02, 0x3d, 0xff, 0x6b, 0x02, 0xff, 0xfe, 0x13, 0x02, 0xbf, 0xfe, 0xc0, 0x01, 0x7e, 0xfe, 0x6f, 0x01, 0x41, 0xfe, 0x19, 0x01, 0x09, 0xfe, 0xbf, 0x00, 0xdb, 0xfd, 0x60, 0x00, 0xb9, 0xfd, 0xfe, 0xff, 0x9e, 0xfd, 0x9a, 0xff, 0x82, 0xfd, 0x38, 0xff, 0x61, 0xfd, 0xda, 0xfe, 0x3d, 0xfd, 0x81, 0xfe, 0x1a, 0xfd, 0x31, 0xfe, 0x00, 0xfd, 0xe9, 0xfd, 0xf3, 0xfc, 0xa3, 0xfd, 0xf3, 0xfc, 0x5e, 0xfd, 0xfa, 0xfc, 0x1b, 0xfd, 0x05, 0xfd, 0xdf, 0xfc, 0x10, 0xfd, 0xaf, 0xfc, 0x1a, 0xfd, 0x8b, 0xfc, 0x26, 0xfd, 0x74, 0xfc, 0x37, 0xfd, 0x64, 0xfc, 0x52, 0xfd, 0x52, 0xfc, 0x71, 0xfd, 0x3c, 0xfc, 0x95, 0xfd, 0x29, 0xfc, 0xbe, 0xfd, 0x1e, 0xfc, 0xeb, 0xfd, 0x22, 0xfc, 0x1d, 0xfe, 0x37, 0xfc, 0x57, 0xfe, 0x5d, 0xfc, 0x9c, 0xfe, 0x8a, 0xfc, 0xe7, 0xfe, 0xb1, 0xfc, 0x31, 0xff, 0xce, 0xfc, 0x73, 0xff, 0xe4, 0xfc, 0xaf, 0xff, 0xfe, 0xfc, 0xe9, 0xff, 0x25, 0xfd, 0x27, 0x00, 0x5c, 0xfd, 0x6c, 0x00, 0x9f, 0xfd, 0xbb, 0x00, 0xe9, 0xfd, 0x13, 0x01, 0x36, 0xfe, 0x72, 0x01, 0x86, 0xfe, 0xd2, 0x01, 0xd8, 0xfe, 0x29, 0x02, 0x2a, 0xff, 0x70, 0x02, 0x7e, 0xff, 0xab, 0x02, 0xd6, 0xff, 0xe4, 0x02, 0x34, 0x00, 0x20, 0x03, 0x93, 0x00, 0x5b, 0x03, 0xea, 0x00, 0x91, 0x03, 0x35, 0x01, 0xbd, 0x03, 0x77, 0x01, 0xdd, 0x03, 0xb7, 0x01, 0xf1, 0x03, 0xf9, 0x01, 0xf6, 0x03, 0x3a, 0x02, 0xee, 0x03, 0x74, 0x02, 0xda, 0x03, 0xa3, 0x02, 0xc1, 0x03, 0xc8, 0x02, 0xa7, 0x03, 0xea, 0x02, 0x8d, 0x03, 0x0e, 0x03, 0x73, 0x03, 0x2e, 0x03, 0x4f, 0x03, 0x43, 0x03, 0x20, 0x03, 0x50, 0x03, 0xed, 0x02, 0x56, 0x03, 0xba, 0x02, 0x55, 0x03, 0x86, 0x02, 0x4c, 0x03, 0x51, 0x02, 0x3b, 0x03, 0x18, 0x02, 0x21, 0x03, 0xda, 0x01, 0x02, 0x03, 0x99, 0x01, 0xe3, 0x02, 0x5b, 0x01, 0xc2, 0x02, 0x1f, 0x01, 0x9b, 0x02, 0xe4, 0x00, 0x6d, 0x02, 0xa8, 0x00, 0x37, 0x02, 0x68, 0x00, 0x01, 0x02, 0x2a, 0x00, 0xd1, 0x01, 0xf0, 0xff, 0xa9, 0x01, 0xbc, 0xff, 0x85, 0x01, 0x8e, 0xff, 0x5c, 0x01, 0x64, 0xff, 0x24, 0x01, 0x37, 0xff, 0xdf, 0x00, 0x05, 0xff, 0x97, 0x00, 0xd3, 0xfe, 0x58, 0x00, 0xa8, 0xfe, 0x20, 0x00, 0x81, 0xfe, 0xf5, 0xff, 0x66, 0xfe, 0xd3, 0xff, 0x59, 0xfe, 0xac, 0xff, 0x4f, 0xfe, 0x78, 0xff, 0x43, 0xfe, 0x37, 0xff, 0x3b, 0xfe, 0xed, 0xfe, 0x38, 0xfe, 0x9f, 0xfe, 0x37, 0xfe, 0x5c, 0xfe, 0x3b, 0xfe, 0x2a, 0xfe, 0x43, 0xfe, 0x03, 0xfe, 0x4b, 0xfe, 0xdf, 0xfd, 0x56, 0xfe, 0xb8, 0xfd, 0x6a, 0xfe, 0x86, 0xfd, 0x83, 0xfe, 0x4d, 0xfd, 0x9c, 0xfe, 0x16, 0xfd, 0xb6, 0xfe, 0xe9, 0xfc, 0xd2, 0xfe, 0xcf, 0xfc, 0xf6, 0xfe, 0xc6, 0xfc, 0x1c, 0xff, 0xc7, 0xfc, 0x3f, 0xff, 0xcd, 0xfc, 0x5f, 0xff, 0xd3, 0xfc, 0x7c, 0xff, 0xd4, 0xfc, 0x99, 0xff, 0xd5, 0xfc, 0xba, 0xff, 0xe1, 0xfc, 0xe2, 0xff, 0xfe, 0xfc, 0x14, 0x00, 0x2a, 0xfd, 0x4e, 0x00, 0x60, 0xfd, 0x8b, 0x00, 0x98, 0xfd, 0xc8, 0x00, 0xc7, 0xfd, 0xfc, 0x00, 0xef, 0xfd, 0x2a, 0x01, 0x19, 0xfe, 0x5a, 0x01, 0x41, 0xfe, 0x89, 0x01, 0x6a, 0xfe, 0xb7, 0x01, 0x97, 0xfe, 0xe8, 0x01, 0xc5, 0xfe, 0x17, 0x02, 0xf4, 0xfe, 0x42, 0x02, 0x22, 0xff, 0x66, 0x02, 0x54, 0xff, 0x86, 0x02, 0x86, 0xff, 0x9e, 0x02, 0xb5, 0xff, 0xac, 0x02, 0xe1, 0xff, 0xb3, 0x02, 0x0b, 0x00, 0xb6, 0x02, 0x38, 0x00, 0xbc, 0x02, 0x68, 0x00, 0xc0, 0x02, 0x9b, 0x00, 0xbf, 0x02, 0xd2, 0x00, 0xb3, 0x02, 0x0a, 0x01, 0x9a, 0x02, 0x3f, 0x01, 0x77, 0x02, 0x6c, 0x01, 0x4e, 0x02, 0x94, 0x01, 0x29, 0x02, 0xba, 0x01, 0x08, 0x02, 0xe2, 0x01, 0xe9, 0x01, 0x10, 0x02, 0xc8, 0x01, 0x40, 0x02, 0xa3, 0x01, 0x69, 0x02, 0x76, 0x01, 0x86, 0x02, 0x40, 0x01, 0x97, 0x02, 0x0a, 0x01, 0x9a, 0x02, 0xd2, 0x00, 0x93, 0x02, 0x9d, 0x00, 0x87, 0x02, 0x6a, 0x00, 0x7b, 0x02, 0x38, 0x00, 0x72, 0x02, 0x03, 0x00, 0x6c, 0x02, 0xcf, 0xff, 0x62, 0x02, 0x9b, 0xff, 0x4e, 0x02, 0x66, 0xff, 0x2d, 0x02, 0x31, 0xff, 0x00, 0x02, 0xfa, 0xfe, 0xcb, 0x01, 0xbf, 0xfe, 0x92, 0x01, 0x82, 0xfe, 0x5b, 0x01, 0x45, 0xfe, 0x29, 0x01, 0x09, 0xfe, 0xfb, 0x00, 0xcf, 0xfd, 0xd1, 0x00, 0x9d, 0xfd, 0xaa, 0x00, 0x78, 0xfd, 0x81, 0x00, 0x61, 0xfd, 0x51, 0x00, 0x4e, 0xfd, 0x15, 0x00, 0x33, 0xfd, 0xd3, 0xff, 0x11, 0xfd, 0x8f, 0xff, 0xec, 0xfc, 0x52, 0xff, 0xcc, 0xfc, 0x23, 0xff, 0xc0, 0xfc, 0xfe, 0xfe, 0xc1, 0xfc, 0xda, 0xfe, 0xc5, 0xfc, 0xac, 0xfe, 0xc3, 0xfc, 0x71, 0xfe, 0xbb, 0xfc, 0x31, 0xfe, 0xb5, 0xfc, 0xf6, 0xfd, 0xb9, 0xfc, 0xc7, 0xfd, 0xcd, 0xfc, 0xa9, 0xfd, 0xf4, 0xfc, 0x9b, 0xfd, 0x28, 0xfd, 0x93, 0xfd, 0x61, 0xfd, 0x88, 0xfd, 0x96, 0xfd, 0x7b, 0xfd, 0xc8, 0xfd, 0x71, 0xfd, 0xfb, 0xfd, 0x6e, 0xfd, 0x2f, 0xfe, 0x76, 0xfd, 0x67, 0xfe, 0x8c, 0xfd, 0xa9, 0xfe, 0xae, 0xfd, 0xf4, 0xfe, 0xd2, 0xfd, 0x41, 0xff, 0xf8, 0xfd, 0x8d, 0xff, 0x20, 0xfe, 0xd1, 0xff, 0x4b, 0xfe, 0x0d, 0x00, 0x79, 0xfe, 0x42, 0x00, 0xaa, 0xfe, 0x75, 0x00, 0xdd, 0xfe, 0xae, 0x00, 0x18, 0xff, 0xf1, 0x00, 0x59, 0xff, 0x3c, 0x01, 0x9a, 0xff, 0x83, 0x01, 0xd3, 0xff, 0xbd, 0x01, 0x09, 0x00, 0xeb, 0x01, 0x3e, 0x00, 0x0f, 0x02, 0x73, 0x00, 0x30, 0x02, 0xa9, 0x00, 0x53, 0x02, 0xdf, 0x00, 0x7a, 0x02, 0x17, 0x01, 0xa3, 0x02, 0x4b, 0x01, 0xc7, 0x02, 0x7a, 0x01, 0xe2, 0x02, 0xa3, 0x01, 0xf6, 0x02, 0xc3, 0x01, 0x01, 0x03, 0xde, 0x01, 0x07, 0x03, 0xf9, 0x01, 0x0b, 0x03, 0x17, 0x02, 0x0b, 0x03, 0x34, 0x02, 0x01, 0x03, 0x4d, 0x02, 0xe9, 0x02, 0x62, 0x02, 0xc5, 0x02, 0x75, 0x02, 0x9c, 0x02, 0x7f, 0x02, 0x6e, 0x02, 0x81, 0x02, 0x3d, 0x02, 0x7f, 0x02, 0x0e, 0x02, 0x7e, 0x02, 0xe0, 0x01, 0x81, 0x02, 0xb1, 0x01, 0x8d, 0x02, 0x82, 0x01, 0x9f, 0x02, 0x53, 0x01, 0xad, 0x02, 0x20, 0x01, 0xb4, 0x02, 0xed, 0x00, 0xb5, 0x02, 0xbd, 0x00, 0xae, 0x02, 0x91, 0x00, 0xa4, 0x02, 0x67, 0x00, 0x9e, 0x02, 0x44, 0x00, 0x9b, 0x02, 0x23, 0x00, 0x91, 0x02, 0xfe, 0xff, 0x7d, 0x02, 0xd6, 0xff, 0x5d, 0x02, 0xaf, 0xff, 0x31, 0x02, 0x8b, 0xff, 0xfd, 0x01, 0x68, 0xff, 0xc5, 0x01, 0x45, 0xff, 0x87, 0x01, 0x1c, 0xff, 0x45, 0x01, 0xf0, 0xfe, 0x00, 0x01, 0xc8, 0xfe, 0xbb, 0x00, 0xa9, 0xfe, 0x77, 0x00, 0x96, 0xfe, 0x2f, 0x00, 0x86, 0xfe, 0xe1, 0xff, 0x71, 0xfe, 0x8f, 0xff, 0x56, 0xfe, 0x41, 0xff, 0x3b, 0xfe, 0xfe, 0xfe, 0x23, 0xfe, 0xc6, 0xfe, 0x11, 0xfe, 0x94, 0xfe, 0x03, 0xfe, 0x63, 0xfe, 0xfb, 0xfd, 0x33, 0xfe, 0xf7, 0xfd, 0x05, 0xfe, 0xf6, 0xfd, 0xdd, 0xfd, 0xf6, 0xfd, 0xb9, 0xfd, 0xf2, 0xfd, 0x9c, 0xfd, 0xeb, 0xfd, 0x83, 0xfd, 0xe4, 0xfd, 0x6b, 0xfd, 0xe1, 0xfd, 0x56, 0xfd, 0xe5, 0xfd, 0x4a, 0xfd, 0xf8, 0xfd, 0x4a, 0xfd, 0x1a, 0xfe, 0x55, 0xfd, 0x48, 0xfe, 0x62, 0xfd, 0x75, 0xfe, 0x65, 0xfd, 0x99, 0xfe, 0x60, 0xfd, 0xb5, 0xfe, 0x5b, 0xfd, 0xd3, 0xfe, 0x5f, 0xfd, 0xfb, 0xfe, 0x72, 0xfd, 0x30, 0xff, 0x8e, 0xfd, 0x70, 0xff, 0xaa, 0xfd, 0xb2, 0xff, 0xc0, 0xfd, 0xef, 0xff, 0xd0, 0xfd, 0x23, 0x00, 0xdf, 0xfd, 0x54, 0x00, 0xf3, 0xfd, 0x85, 0x00, 0x09, 0xfe, 0xb7, 0x00, 0x26, 0xfe, 0xea, 0x00, 0x4a, 0xfe, 0x1e, 0x01, 0x75, 0xfe, 0x4d, 0x01, 0xa0, 0xfe, 0x73, 0x01, 0xce, 0xfe, 0x91, 0x01, 0xf9, 0xfe, 0xa4, 0x01, 0x23, 0xff, 0xaf, 0x01, 0x4f, 0xff, 0xb8, 0x01, 0x7d, 0xff, 0xc0, 0x01, 0xae, 0xff, 0xc9, 0x01, 0xe0, 0xff, 0xcd, 0x01, 0x14, 0x00, 0xc8, 0x01, 0x4a, 0x00, 0xbb, 0x01, 0x80, 0x00, 0xa4, 0x01, 0xb5, 0x00, 0x89, 0x01, 0xe7, 0x00, 0x6c, 0x01, 0x14, 0x01, 0x4e, 0x01, 0x3b, 0x01, 0x2d, 0x01, 0x5b, 0x01, 0x0a, 0x01, 0x75, 0x01, 0xe5, 0x00, 0x87, 0x01, 0xbc, 0x00, 0x94, 0x01, 0x90, 0x00, 0x9c, 0x01, 0x61, 0x00, 0xa2, 0x01, 0x2e, 0x00, 0xa3, 0x01, 0xf8, 0xff, 0xa1, 0x01, 0xc6, 0xff, 0x96, 0x01, 0x94, 0xff, 0x80, 0x01, 0x64, 0xff, 0x60, 0x01, 0x34, 0xff, 0x3d, 0x01, 0x07, 0xff, 0x1b, 0x01, 0xdb, 0xfe, 0xfc, 0x00, 0xac, 0xfe, 0xe1, 0x00, 0x7a, 0xfe, 0xc9, 0x00, 0x46, 0xfe, 0xad, 0x00, 0x12, 0xfe, 0x8b, 0x00, 0xde, 0xfd, 0x65, 0x00, 0xae, 0xfd, 0x3b, 0x00, 0x83, 0xfd, 0x11, 0x00, 0x60, 0xfd, 0xe9, 0xff, 0x44, 0xfd, 0xc1, 0xff, 0x2c, 0xfd, 0x94, 0xff, 0x13, 0xfd, 0x66, 0xff, 0xf9, 0xfc, 0x3d, 0xff, 0xe0, 0xfc, 0x15, 0xff, 0xc6, 0xfc, 0xef, 0xfe, 0xb3, 0xfc, 0xcd, 0xfe, 0xaa, 0xfc, 0xac, 0xfe, 0xb2, 0xfc, 0x8b, 0xfe, 0xc8, 0xfc, 0x6a, 0xfe, 0xe9, 0xfc, 0x4b, 0xfe, 0x0e, 0xfd, 0x26, 0xfe, 0x2e, 0xfd, 0xfe, 0xfd, 0x49, 0xfd, 0xda, 0xfd, 0x65, 0xfd, 0xc1, 0xfd, 0x89, 0xfd, 0xb2, 0xfd, 0xb3, 0xfd, 0xa7, 0xfd, 0xe1, 0xfd, 0x9a, 0xfd, 0x10, 0xfe, 0x88, 0xfd, 0x41, 0xfe, 0x76, 0xfd, 0x78, 0xfe, 0x6f, 0xfd, 0xb6, 0xfe, 0x78, 0xfd, 0xf8, 0xfe, 0x8f, 0xfd, 0x38, 0xff, 0xae, 0xfd, 0x72, 0xff, 0xca, 0xfd, 0xa1, 0xff, 0xde, 0xfd, 0xc7, 0xff, 0xf0, 0xfd, 0xed, 0xff, 0x07, 0xfe, 0x1b, 0x00, 0x2b, 0xfe, 0x54, 0x00, 0x60, 0xfe, 0x99, 0x00, 0xa3, 0xfe, 0xe0, 0x00, 0xe9, 0xfe, 0x1f, 0x01, 0x2c, 0xff, 0x53, 0x01, 0x65, 0xff, 0x7d, 0x01, 0x98, 0xff, 0xa4, 0x01, 0xc8, 0xff, 0xca, 0x01, 0xfe, 0xff, 0xf2, 0x01, 0x3e, 0x00, 0x1d, 0x02, 0x81, 0x00, 0x46, 0x02, 0xc5, 0x00, 0x6e, 0x02, 0x06, 0x01, 0x96, 0x02, 0x3e, 0x01, 0xb9, 0x02, 0x6c, 0x01, 0xd5, 0x02, 0x92, 0x01, 0xea, 0x02, 0xb3, 0x01, 0xf8, 0x02, 0xd4, 0x01, 0x03, 0x03, 0xf4, 0x01, 0x0c, 0x03, 0x12, 0x02, 0x12, 0x03, 0x2c, 0x02, 0x11, 0x03, 0x3f, 0x02, 0x09, 0x03, 0x4a, 0x02, 0xfa, 0x02, 0x51, 0x02, 0xe8, 0x02, 0x59, 0x02, 0xd3, 0x02, 0x65, 0x02, 0xbb, 0x02, 0x72, 0x02, 0x9d, 0x02, 0x7f, 0x02, 0x7a, 0x02, 0x88, 0x02, 0x55, 0x02, 0x8c, 0x02, 0x2f, 0x02, 0x8d, 0x02, 0x09, 0x02, 0x8b, 0x02, 0xde, 0x01, 0x89, 0x02, 0xad, 0x01, 0x84, 0x02, 0x78, 0x01, 0x81, 0x02, 0x44, 0x01, 0x7a, 0x02, 0x13, 0x01, 0x6f, 0x02, 0xe3, 0x00, 0x61, 0x02, 0xb7, 0x00, 0x52, 0x02, 0x8b, 0x00, 0x40, 0x02, 0x5b, 0x00, 0x2b, 0x02, 0x28, 0x00, 0x15, 0x02, 0xf3, 0xff, 0xf8, 0x01, 0xbd, 0xff, 0xd7, 0x01, 0x8c, 0xff, 0xb4, 0x01, 0x63, 0xff, 0x8f, 0x01, 0x42, 0xff, 0x6a, 0x01, 0x29, 0xff, 0x47, 0x01, 0x18, 0xff, 0x25, 0x01, 0x09, 0xff, 0x01, 0x01, 0xf5, 0xfe, 0xda, 0x00, 0xdf, 0xfe, 0xac, 0x00, 0xc8, 0xfe, 0x7d, 0x00, 0xb9, 0xfe, 0x4d, 0x00, 0xb5, 0xfe, 0x23, 0x00, 0xc0, 0xfe, 0xfd, 0xff, 0xcf, 0xfe, 0xd8, 0xff, 0xd9, 0xfe, 0xb4, 0xff, 0xdf, 0xfe, 0x8f, 0xff, 0xe6, 0xfe, 0x69, 0xff, 0xf0, 0xfe, 0x42, 0xff, 0x01, 0xff, 0x1b, 0xff, 0x17, 0xff, 0xf7, 0xfe, 0x2e, 0xff, 0xdf, 0xfe, 0x4a, 0xff, 0xd1, 0xfe, 0x67, 0xff, 0xc5, 0xfe, 0x7f, 0xff, 0xb5, 0xfe, 0x90, 0xff, 0x9f, 0xfe, 0x9b, 0xff, 0x87, 0xfe, 0xa5, 0xff, 0x74, 0xfe, 0xb3, 0xff, 0x6d, 0xfe, 0xc6, 0xff, 0x6f, 0xfe, 0xd9, 0xff, 0x76, 0xfe, 0xea, 0xff, 0x80, 0xfe, 0xf7, 0xff, 0x8c, 0xfe, 0x05, 0x00, 0x97, 0xfe, 0x17, 0x00, 0xa5, 0xfe, 0x31, 0x00, 0xb6, 0xfe, 0x51, 0x00, 0xcc, 0xfe, 0x73, 0x00, 0xe5, 0xfe, 0x91, 0x00, 0x02, 0xff, 0xa7, 0x00, 0x23, 0xff, 0xb6, 0x00, 0x49, 0xff, 0xc9, 0x00, 0x70, 0xff, 0xe4, 0x00, 0x93, 0xff, 0x03, 0x01, 0xb0, 0xff, 0x23, 0x01, 0xce, 0xff, 0x41, 0x01, 0xf6, 0xff, 0x60, 0x01, 0x2b, 0x00, 0x7e, 0x01, 0x65, 0x00, 0x99, 0x01, 0x96, 0x00, 0xaa, 0x01, 0xb8, 0x00, 0xb3, 0x01, 0xd2, 0x00, 0xbc, 0x01, 0xeb, 0x00, 0xc8, 0x01, 0x0b, 0x01, 0xd8, 0x01, 0x2e, 0x01, 0xe4, 0x01, 0x4e, 0x01, 0xe5, 0x01, 0x64, 0x01, 0xd6, 0x01, 0x6d, 0x01, 0xb8, 0x01, 0x6c, 0x01, 0x94, 0x01, 0x67, 0x01, 0x71, 0x01, 0x62, 0x01, 0x51, 0x01, 0x62, 0x01, 0x33, 0x01, 0x63, 0x01, 0x0f, 0x01, 0x64, 0x01, 0xe3, 0x00, 0x5a, 0x01, 0xae, 0x00, 0x47, 0x01, 0x76, 0x00, 0x2d, 0x01, 0x3f, 0x00, 0x10, 0x01, 0x0e, 0x00, 0xf9, 0x00, 0xe6, 0xff, 0xe8, 0x00, 0xc5, 0xff, 0xdd, 0x00, 0xa9, 0xff, 0xd5, 0x00, 0x8b, 0xff, 0xcb, 0x00, 0x69, 0xff, 0xbc, 0x00, 0x45, 0xff, 0xa5, 0x00, 0x21, 0xff, 0x89, 0x00, 0x03, 0xff, 0x6b, 0x00, 0xea, 0xfe, 0x50, 0x00, 0xd9, 0xfe, 0x3a, 0x00, 0xcd, 0xfe, 0x23, 0x00, 0xbf, 0xfe, 0x08, 0x00, 0xb1, 0xfe, 0xe6, 0xff, 0xa1, 0xfe, 0xbf, 0xff, 0x8f, 0xfe, 0x97, 0xff, 0x7b, 0xfe, 0x77, 0xff, 0x6b, 0xfe, 0x5f, 0xff, 0x5f, 0xfe, 0x48, 0xff, 0x53, 0xfe, 0x2d, 0xff, 0x46, 0xfe, 0x0d, 0xff, 0x39, 0xfe, 0xe5, 0xfe, 0x2a, 0xfe, 0xba, 0xfe, 0x19, 0xfe, 0x97, 0xfe, 0x0f, 0xfe, 0x83, 0xfe, 0x0e, 0xfe, 0x79, 0xfe, 0x0f, 0xfe, 0x73, 0xfe, 0x11, 0xfe, 0x6e, 0xfe, 0x13, 0xfe, 0x63, 0xfe, 0x16, 0xfe, 0x51, 0xfe, 0x1b, 0xfe, 0x3e, 0xfe, 0x27, 0xfe, 0x2b, 0xfe, 0x36, 0xfe, 0x20, 0xfe, 0x47, 0xfe, 0x20, 0xfe, 0x5a, 0xfe, 0x2c, 0xfe, 0x72, 0xfe, 0x3f, 0xfe, 0x8f, 0xfe, 0x55, 0xfe, 0xb0, 0xfe, 0x6a, 0xfe, 0xd3, 0xfe, 0x7b, 0xfe, 0xf9, 0xfe, 0x8a, 0xfe, 0x1e, 0xff, 0x99, 0xfe, 0x43, 0xff, 0xb0, 0xfe, 0x6a, 0xff, 0xd2, 0xfe, 0x93, 0xff, 0xfa, 0xfe, 0xbc, 0xff, 0x1e, 0xff, 0xe2, 0xff, 0x3d, 0xff, 0x08, 0x00, 0x54, 0xff, 0x2a, 0x00, 0x66, 0xff, 0x48, 0x00, 0x7d, 0xff, 0x65, 0x00, 0x9a, 0xff, 0x82, 0x00, 0xbb, 0xff, 0xa1, 0x00, 0xda, 0xff, 0xbc, 0x00, 0xf6, 0xff, 0xd6, 0x00, 0x0d, 0x00, 0xea, 0x00, 0x21, 0x00, 0xfa, 0x00, 0x38, 0x00, 0x0b, 0x01, 0x54, 0x00, 0x21, 0x01, 0x76, 0x00, 0x39, 0x01, 0x9d, 0x00, 0x55, 0x01, 0xc7, 0x00, 0x70, 0x01, 0xec, 0x00, 0x85, 0x01, 0x07, 0x01, 0x92, 0x01, 0x15, 0x01, 0x98, 0x01, 0x1d, 0x01, 0x99, 0x01, 0x25, 0x01, 0x99, 0x01, 0x35, 0x01, 0x9c, 0x01, 0x52, 0x01, 0xa4, 0x01, 0x77, 0x01, 0xae, 0x01, 0x97, 0x01, 0xb4, 0x01, 0xa8, 0x01, 0xb0, 0x01, 0xa6, 0x01, 0xa0, 0x01, 0x97, 0x01, 0x85, 0x01, 0x82, 0x01, 0x64, 0x01, 0x6f, 0x01, 0x40, 0x01, 0x61, 0x01, 0x20, 0x01, 0x5a, 0x01, 0x06, 0x01, 0x51, 0x01, 0xee, 0x00, 0x44, 0x01, 0xd5, 0x00, 0x32, 0x01, 0xbb, 0x00, 0x17, 0x01, 0x9e, 0x00, 0xf9, 0x00, 0x7f, 0x00, 0xdb, 0x00, 0x61, 0x00, 0xc0, 0x00, 0x43, 0x00, 0xaa, 0x00, 0x29, 0x00, 0x98, 0x00, 0x14, 0x00, 0x8c, 0x00, 0x05, 0x00, 0x7b, 0x00, 0xf4, 0xff, 0x5e, 0x00, 0xdc, 0xff, 0x3b, 0x00, 0xc1, 0xff, 0x1a, 0x00, 0xa9, 0xff, 0xfe, 0xff, 0x95, 0xff, 0xea, 0xff, 0x87, 0xff, 0xdc, 0xff, 0x7d, 0xff, 0xca, 0xff, 0x70, 0xff, 0xb2, 0xff, 0x62, 0xff, 0x97, 0xff, 0x54, 0xff, 0x7e, 0xff, 0x47, 0xff, 0x69, 0xff, 0x3a, 0xff, 0x56, 0xff, 0x2d, 0xff, 0x46, 0xff, 0x21, 0xff, 0x3a, 0xff, 0x19, 0xff, 0x30, 0xff, 0x15, 0xff, 0x28, 0xff, 0x12, 0xff, 0x22, 0xff, 0x0e, 0xff, 0x1f, 0xff, 0x0b, 0xff, 0x1d, 0xff, 0x09, 0xff, 0x17, 0xff, 0x04, 0xff, 0x0a, 0xff, 0xfc, 0xfe, 0xf9, 0xfe, 0xf2, 0xfe, 0xeb, 0xfe, 0xed, 0xfe, 0xe5, 0xfe, 0xef, 0xfe, 0xe8, 0xfe, 0xf9, 0xfe, 0xee, 0xfe, 0x06, 0xff, 0xf0, 0xfe, 0x11, 0xff, 0xeb, 0xfe, 0x19, 0xff, 0xde, 0xfe, 0x1b, 0xff, 0xcf, 0xfe, 0x1c, 0xff, 0xc3, 0xfe, 0x23, 0xff, 0xc2, 0xfe, 0x34, 0xff, 0xce, 0xfe, 0x52, 0xff, 0xe7, 0xfe, 0x7d, 0xff, 0x0a, 0xff, 0xb0, 0xff, 0x2f, 0xff, 0xe4, 0xff, 0x51, 0xff, 0x15, 0x00, 0x70, 0xff, 0x43, 0x00, 0x8a, 0xff, 0x6c, 0x00, 0xa4, 0xff, 0x94, 0x00, 0xc3, 0xff, 0xc2, 0x00, 0xed, 0xff, 0xfa, 0x00, 0x1f, 0x00, 0x37, 0x01, 0x53, 0x00, 0x73, 0x01, 0x82, 0x00, 0xa9, 0x01, 0xa4, 0x00, 0xd3, 0x01, 0xb7, 0x00, 0xed, 0x01, 0xc0, 0x00, 0xfb, 0x01, 0xca, 0x00, 0x03, 0x02, 0xd8, 0x00, 0x08, 0x02, 0xed, 0x00, 0x0f, 0x02, 0x07, 0x01, 0x19, 0x02, 0x1c, 0x01, 0x21, 0x02, 0x25, 0x01, 0x20, 0x02, 0x22, 0x01, 0x15, 0x02, 0x15, 0x01, 0x01, 0x02, 0x03, 0x01, 0xe5, 0x01, 0xf3, 0x00, 0xc3, 0x01, 0xe9, 0x00, 0x9c, 0x01, 0xe7, 0x00, 0x75, 0x01, 0xe6, 0x00, 0x4e, 0x01, 0xe2, 0x00, 0x27, 0x01, 0xd9, 0x00, 0x05, 0x01, 0xcc, 0x00, 0xe6, 0x00, 0xbd, 0x00, 0xc7, 0x00, 0xb0, 0x00, 0xa5, 0x00, 0xa8, 0x00, 0x81, 0x00, 0xa7, 0x00, 0x62, 0x00, 0xaa, 0x00, 0x4c, 0x00, 0xaa, 0x00, 0x3b, 0x00, 0x9d, 0x00, 0x28, 0x00, 0x84, 0x00, 0x0f, 0x00, 0x6a, 0x00, 0xf6, 0xff, 0x59, 0x00, 0xe1, 0xff, 0x54, 0x00, 0xd5, 0xff, 0x56, 0x00, 0xcf, 0xff, 0x51, 0x00, 0xc6, 0xff, 0x44, 0x00, 0xb7, 0xff, 0x2e, 0x00, 0xa2, 0xff, 0x15, 0x00, 0x8a, 0xff, 0xfb, 0xff, 0x6e, 0xff, 0xe3, 0xff, 0x51, 0xff, 0xcc, 0xff, 0x34, 0xff, 0xb4, 0xff, 0x14, 0xff, 0x99, 0xff, 0xf4, 0xfe, 0x7c, 0xff, 0xd4, 0xfe, 0x60, 0xff, 0xb7, 0xfe, 0x44, 0xff, 0x9e, 0xfe, 0x2d, 0xff, 0x87, 0xfe, 0x1c, 0xff, 0x73, 0xfe, 0x0c, 0xff, 0x5b, 0xfe, 0xfb, 0xfe, 0x3c, 0xfe, 0xe6, 0xfe, 0x1a, 0xfe, 0xcc, 0xfe, 0xf7, 0xfd, 0xb0, 0xfe, 0xd8, 0xfd, 0x9b, 0xfe, 0xc7, 0xfd, 0x94, 0xfe, 0xc4, 0xfd, 0x9a, 0xfe, 0xcc, 0xfd, 0xab, 0xfe, 0xdb, 0xfd, 0xc1, 0xfe, 0xec, 0xfd, 0xd1, 0xfe, 0xf9, 0xfd, 0xd3, 0xfe, 0xf9, 0xfd, 0xcb, 0xfe, 0xf4, 0xfd, 0xc5, 0xfe, 0xf6, 0xfd, 0xca, 0xfe, 0x07, 0xfe, 0xe0, 0xfe, 0x2d, 0xfe, 0x06, 0xff, 0x61, 0xfe, 0x32, 0xff, 0x97, 0xfe, 0x58, 0xff, 0xc4, 0xfe, 0x72, 0xff, 0xe4, 0xfe, 0x85, 0xff, 0xfd, 0xfe, 0x97, 0xff, 0x17, 0xff, 0xb1, 0xff, 0x39, 0xff, 0xd4, 0xff, 0x65, 0xff, 0xf9, 0xff, 0x97, 0xff, 0x19, 0x00, 0xc7, 0xff, 0x32, 0x00, 0xf3, 0xff, 0x47, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x3c, 0x00, 0x76, 0x00, 0x61, 0x00, 0x95, 0x00, 0x87, 0x00, 0xb6, 0x00, 0xae, 0x00, 0xd5, 0x00, 0xcf, 0x00, 0xe6, 0x00, 0xe3, 0x00, 0xe7, 0x00, 0xe6, 0x00, 0xe2, 0x00, 0xe5, 0x00, 0xdd, 0x00, 0xe6, 0x00, 0xe0, 0x00, 0xed, 0x00, 0xf2, 0x00, 0x00, 0x01, 0x0f, 0x01, 0x1b, 0x01, 0x29, 0x01, 0x32, 0x01, 0x36, 0x01, 0x3a, 0x01, 0x32, 0x01, 0x34, 0x01, 0x24, 0x01, 0x25, 0x01, 0x12, 0x01, 0x12, 0x01, 0x04, 0x01, 0x01, 0x01, 0x05, 0x01, 0xfa, 0x00, 0x0f, 0x01, 0xfa, 0x00, 0x1c, 0x01, 0xfa, 0x00, 0x22, 0x01, 0xf4, 0x00, 0x1f, 0x01, 0xe7, 0x00, 0x14, 0x01, 0xd3, 0x00, 0x08, 0x01, 0xbb, 0x00, 0x02, 0x01, 0xa6, 0x00, 0x02, 0x01, 0x95, 0x00, 0x02, 0x01, 0x85, 0x00, 0xfa, 0x00, 0x73, 0x00, 0xeb, 0x00, 0x5f, 0x00, 0xd3, 0x00, 0x49, 0x00, 0xb9, 0x00, 0x35, 0x00, 0xa4, 0x00, 0x28, 0x00, 0x96, 0x00, 0x20, 0x00, 0x87, 0x00, 0x16, 0x00, 0x73, 0x00, 0x04, 0x00, 0x56, 0x00, 0xeb, 0xff, 0x32, 0x00, 0xce, 0xff, 0x06, 0x00, 0xb0, 0xff, 0xd6, 0xff, 0x93, 0xff, 0xaf, 0xff, 0x82, 0xff, 0x93, 0xff, 0x79, 0xff, 0x7f, 0xff, 0x73, 0xff, 0x6b, 0xff, 0x68, 0xff, 0x51, 0xff, 0x56, 0xff, 0x2e, 0xff, 0x3c, 0xff, 0x03, 0xff, 0x1c, 0xff, 0xda, 0xfe, 0xfd, 0xfe, 0xb7, 0xfe, 0xe4, 0xfe, 0x9f, 0xfe, 0xd3, 0xfe, 0x93, 0xfe, 0xcc, 0xfe, 0x90, 0xfe, 0xce, 0xfe, 0x8d, 0xfe, 0xce, 0xfe, 0x86, 0xfe, 0xcc, 0xfe, 0x7f, 0xfe, 0xca, 0xfe, 0x79, 0xfe, 0xca, 0xfe, 0x73, 0xfe, 0xcc, 0xfe, 0x71, 0xfe, 0xd3, 0xfe, 0x78, 0xfe, 0xe4, 0xfe, 0x84, 0xfe, 0xfa, 0xfe, 0x8f, 0xfe, 0x12, 0xff, 0x98, 0xfe, 0x29, 0xff, 0xa3, 0xfe, 0x41, 0xff, 0xb0, 0xfe, 0x5a, 0xff, 0xbe, 0xfe, 0x73, 0xff, 0xcf, 0xfe, 0x8d, 0xff, 0xe1, 0xfe, 0xa7, 0xff, 0xf3, 0xfe, 0xc0, 0xff, 0x05, 0xff, 0xdb, 0xff, 0x16, 0xff, 0xf6, 0xff, 0x26, 0xff, 0x10, 0x00, 0x37, 0xff, 0x2c, 0x00, 0x4c, 0xff, 0x4a, 0x00, 0x65, 0xff, 0x68, 0x00, 0x7c, 0xff, 0x83, 0x00, 0x91, 0xff, 0x9e, 0x00, 0xa1, 0xff, 0xb5, 0x00, 0xa7, 0xff, 0xc6, 0x00, 0xa8, 0xff, 0xcf, 0x00, 0xa7, 0xff, 0xd2, 0x00, 0xa9, 0xff, 0xd4, 0x00, 0xb2, 0xff, 0xdb, 0x00, 0xc5, 0xff, 0xea, 0x00, 0xdd, 0xff, 0xfc, 0x00, 0xf2, 0xff, 0x0a, 0x01, 0x04, 0x00, 0x12, 0x01, 0x10, 0x00, 0x11, 0x01, 0x19, 0x00, 0x0b, 0x01, 0x22, 0x00, 0x02, 0x01, 0x28, 0x00, 0xf5, 0x00, 0x2f, 0x00, 0xe8, 0x00, 0x37, 0x00, 0xdd, 0x00, 0x3e, 0x00, 0xd4, 0x00, 0x47, 0x00, 0xcd, 0x00, 0x54, 0x00, 0xc6, 0x00, 0x63, 0x00, 0xbd, 0x00, 0x73, 0x00, 0xb1, 0x00, 0x7e, 0x00, 0xa1, 0x00, 0x80, 0x00, 0x8c, 0x00, 0x76, 0x00, 0x71, 0x00, 0x66, 0x00, 0x55, 0x00, 0x58, 0x00, 0x3e, 0x00, 0x4f, 0x00, 0x2d, 0x00, 0x4d, 0x00, 0x24, 0x00, 0x4e, 0x00, 0x1d, 0x00, 0x4c, 0x00, 0x13, 0x00, 0x41, 0x00, 0x01, 0x00, 0x2d, 0x00, 0xe6, 0xff, 0x17, 0x00, 0xcb, 0xff, 0xff, 0xff, 0xb1, 0xff, 0xe5, 0xff, 0x95, 0xff, 0xcd, 0xff, 0x79, 0xff, 0xb6, 0xff, 0x5f, 0xff, 0xa3, 0xff, 0x49, 0xff, 0x93, 0xff, 0x36, 0xff, 0x89, 0xff, 0x28, 0xff, 0x82, 0xff, 0x1d, 0xff, 0x7e, 0xff, 0x10, 0xff, 0x7b, 0xff, 0x04, 0xff, 0x79, 0xff, 0xf9, 0xfe, 0x79, 0xff, 0xf2, 0xfe, 0x77, 0xff, 0xeb, 0xfe, 0x73, 0xff, 0xe2, 0xfe, 0x6f, 0xff, 0xda, 0xfe, 0x6c, 0xff, 0xd6, 0xfe, 0x6f, 0xff, 0xd7, 0xfe, 0x77, 0xff, 0xde, 0xfe, 0x82, 0xff, 0xe7, 0xfe, 0x8a, 0xff, 0xee, 0xfe, 0x8d, 0xff, 0xee, 0xfe, 0x8c, 0xff, 0xec, 0xfe, 0x8b, 0xff, 0xee, 0xfe, 0x92, 0xff, 0xfa, 0xfe, 0xa2, 0xff, 0x12, 0xff, 0xb9, 0xff, 0x2f, 0xff, 0xd3, 0xff, 0x4f, 0xff, 0xeb, 0xff, 0x6c, 0xff, 0x03, 0x00, 0x8a, 0xff, 0x1a, 0x00, 0xa6, 0xff, 0x2f, 0x00, 0xc2, 0xff, 0x43, 0x00, 0xde, 0xff, 0x56, 0x00, 0xfa, 0xff, 0x6a, 0x00, 0x17, 0x00, 0x80, 0x00, 0x35, 0x00, 0x9a, 0x00, 0x56, 0x00, 0xb6, 0x00, 0x7a, 0x00, 0xd2, 0x00, 0xa0, 0x00, 0xec, 0x00, 0xc6, 0x00, 0x04, 0x01, 0xea, 0x00, 0x18, 0x01, 0x08, 0x01, 0x28, 0x01, 0x1e, 0x01, 0x31, 0x01, 0x2c, 0x01, 0x31, 0x01, 0x33, 0x01, 0x30, 0x01, 0x3b, 0x01, 0x32, 0x01, 0x4a, 0x01, 0x39, 0x01, 0x5e, 0x01, 0x44, 0x01, 0x74, 0x01, 0x53, 0x01, 0x88, 0x01, 0x60, 0x01, 0x93, 0x01, 0x63, 0x01, 0x91, 0x01, 0x5c, 0x01, 0x85, 0x01, 0x51, 0x01, 0x76, 0x01, 0x44, 0x01, 0x6a, 0x01, 0x38, 0x01, 0x62, 0x01, 0x33, 0x01, 0x61, 0x01, 0x32, 0x01, 0x63, 0x01, 0x32, 0x01, 0x60, 0x01, 0x31, 0x01, 0x54, 0x01, 0x2e, 0x01, 0x43, 0x01, 0x29, 0x01, 0x30, 0x01, 0x20, 0x01, 0x1a, 0x01, 0x15, 0x01, 0x04, 0x01, 0x08, 0x01, 0xee, 0x00, 0xff, 0x00, 0xd9, 0x00, 0xf9, 0x00, 0xc4, 0x00, 0xf3, 0x00, 0xac, 0x00, 0xeb, 0x00, 0x91, 0x00, 0xe2, 0x00, 0x76, 0x00, 0xdb, 0x00, 0x5d, 0x00, 0xcf, 0x00, 0x42, 0x00, 0xc2, 0x00, 0x28, 0x00, 0xb7, 0x00, 0x14, 0x00, 0xae, 0x00, 0x04, 0x00, 0xa5, 0x00, 0xf7, 0xff, 0x9f, 0x00, 0xee, 0xff, 0x99, 0x00, 0xe9, 0xff, 0x91, 0x00, 0xe4, 0xff, 0x85, 0x00, 0xe0, 0xff, 0x76, 0x00, 0xdc, 0xff, 0x66, 0x00, 0xd6, 0xff, 0x55, 0x00, 0xd0, 0xff, 0x46, 0x00, 0xcd, 0xff, 0x38, 0x00, 0xcc, 0xff, 0x28, 0x00, 0xcf, 0xff, 0x14, 0x00, 0xcf, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xe7, 0xff, 0xc6, 0xff, 0xd2, 0xff, 0xbe, 0xff, 0xc1, 0xff, 0xb5, 0xff, 0xb4, 0xff, 0xae, 0xff, 0xac, 0xff, 0xa8, 0xff, 0xa9, 0xff, 0xa5, 0xff, 0xa8, 0xff, 0xa5, 0xff, 0xa9, 0xff, 0xa8, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0x9b, 0xff, 0x90, 0xff, 0x92, 0xff, 0x8a, 0xff, 0x8b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x92, 0xff, 0x91, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa6, 0xff, 0xa7, 0xff, 0xae, 0xff, 0xb1, 0xff, 0xba, 0xff, 0xbb, 0xff, 0xc6, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xd4, 0xff, 0xd3, 0xff, 0xe1, 0xff, 0xd7, 0xff, 0xf1, 0xff, 0xd9, 0xff, 0x00, 0x00, 0xda, 0xff, 0x0f, 0x00, 0xdf, 0xff, 0x1e, 0x00, 0xeb, 0xff, 0x31, 0x00, 0xf8, 0xff, 0x42, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x07, 0x00, 0x59, 0x00, 0x08, 0x00, 0x65, 0x00, 0x09, 0x00, 0x77, 0x00, 0x08, 0x00, 0x89, 0x00, 0x08, 0x00, 0x99, 0x00, 0x06, 0x00, 0xa3, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x01, 0x00, 0xac, 0x00, 0xfd, 0xff, 0xae, 0x00, 0xf5, 0xff, 0xaf, 0x00, 0xec, 0xff, 0xb1, 0x00, 0xe4, 0xff, 0xb5, 0x00, 0xe1, 0xff, 0xbd, 0x00, 0xde, 0xff, 0xc0, 0x00, 0xd8, 0xff, 0xbc, 0x00, 0xcc, 0xff, 0xad, 0x00, 0xbb, 0xff, 0x98, 0x00, 0xa9, 0xff, 0x81, 0x00, 0x9a, 0xff, 0x6c, 0x00, 0x90, 0xff, 0x5b, 0x00, 0x88, 0xff, 0x49, 0x00, 0x7f, 0xff, 0x34, 0x00, 0x70, 0xff, 0x1b, 0x00, 0x5e, 0xff, 0xfd, 0xff, 0x4a, 0xff, 0xdf, 0xff, 0x39, 0xff, 0xc3, 0xff, 0x32, 0xff, 0xae, 0xff, 0x37, 0xff, 0xa0, 0xff, 0x44, 0xff, 0x98, 0xff, 0x52, 0xff, 0x90, 0xff, 0x5c, 0xff, 0x86, 0xff, 0x62, 0xff, 0x7b, 0xff, 0x62, 0xff, 0x6f, 0xff, 0x5f, 0xff, 0x65, 0xff, 0x5d, 0xff, 0x60, 0xff, 0x5e, 0xff, 0x5f, 0xff, 0x66, 0xff, 0x62, 0xff, 0x76, 0xff, 0x69, 0xff, 0x86, 0xff, 0x6d, 0xff, 0x91, 0xff, 0x6a, 0xff, 0x97, 0xff, 0x67, 0xff, 0x9d, 0xff, 0x67, 0xff, 0xa2, 0xff, 0x6b, 0xff, 0xa8, 0xff, 0x70, 0xff, 0xac, 0xff, 0x74, 0xff, 0xad, 0xff, 0x73, 0xff, 0xa8, 0xff, 0x68, 0xff, 0x9d, 0xff, 0x54, 0xff, 0x91, 0xff, 0x3c, 0xff, 0x85, 0xff, 0x26, 0xff, 0x7a, 0xff, 0x15, 0xff, 0x77, 0xff, 0x0e, 0xff, 0x7b, 0xff, 0x11, 0xff, 0x81, 0xff, 0x15, 0xff, 0x81, 0xff, 0x12, 0xff, 0x79, 0xff, 0x05, 0xff, 0x6d, 0xff, 0xf5, 0xfe, 0x66, 0xff, 0xe8, 0xfe, 0x68, 0xff, 0xe4, 0xfe, 0x74, 0xff, 0xea, 0xfe, 0x86, 0xff, 0xf7, 0xfe, 0x96, 0xff, 0x00, 0xff, 0xa3, 0xff, 0x09, 0xff, 0xb0, 0xff, 0x16, 0xff, 0xbe, 0xff, 0x25, 0xff, 0xcd, 0xff, 0x3a, 0xff, 0xdf, 0xff, 0x53, 0xff, 0xf4, 0xff, 0x72, 0xff, 0x06, 0x00, 0x8e, 0xff, 0x16, 0x00, 0xa7, 0xff, 0x25, 0x00, 0xbe, 0xff, 0x35, 0x00, 0xd5, 0xff, 0x48, 0x00, 0xee, 0xff, 0x5b, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x29, 0x00, 0x7b, 0x00, 0x46, 0x00, 0x7d, 0x00, 0x57, 0x00, 0x74, 0x00, 0x5e, 0x00, 0x67, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5d, 0x00, 0x5b, 0x00, 0x62, 0x00, 0x60, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x7b, 0x00, 0x6e, 0x00, 0x85, 0x00, 0x6b, 0x00, 0x88, 0x00, 0x5c, 0x00, 0x80, 0x00, 0x47, 0x00, 0x71, 0x00, 0x33, 0x00, 0x61, 0x00, 0x29, 0x00, 0x58, 0x00, 0x2b, 0x00, 0x58, 0x00, 0x36, 0x00, 0x5f, 0x00, 0x43, 0x00, 0x67, 0x00, 0x4a, 0x00, 0x68, 0x00, 0x49, 0x00, 0x61, 0x00, 0x44, 0x00, 0x56, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x3e, 0x00, 0x47, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x54, 0x00, 0x5f, 0x00, 0x55, 0x00, 0x64, 0x00, 0x50, 0x00, 0x60, 0x00, 0x43, 0x00, 0x5c, 0x00, 0x38, 0x00, 0x5e, 0x00, 0x34, 0x00, 0x64, 0x00, 0x36, 0x00, 0x6a, 0x00, 0x3a, 0x00, 0x6e, 0x00, 0x3c, 0x00, 0x6f, 0x00, 0x3a, 0x00, 0x6d, 0x00, 0x34, 0x00, 0x69, 0x00, 0x2b, 0x00, 0x65, 0x00, 0x1f, 0x00, 0x63, 0x00, 0x15, 0x00, 0x60, 0x00, 0x0d, 0x00, 0x5c, 0x00, 0x07, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x54, 0x00, 0xf8, 0xff, 0x4b, 0x00, 0xeb, 0xff, 0x3f, 0x00, 0xd9, 0xff, 0x31, 0x00, 0xc5, 0xff, 0x25, 0x00, 0xb4, 0xff, 0x1e, 0x00, 0xa8, 0xff, 0x17, 0x00, 0x9d, 0xff, 0x0d, 0x00, 0x90, 0xff, 0x01, 0x00, 0x82, 0xff, 0xf3, 0xff, 0x73, 0xff, 0xe2, 0xff, 0x63, 0xff, 0xd5, 0xff, 0x58, 0xff, 0xcb, 0xff, 0x53, 0xff, 0xc3, 0xff, 0x54, 0xff, 0xbc, 0xff, 0x57, 0xff, 0xb5, 0xff, 0x59, 0xff, 0xae, 0xff, 0x5a, 0xff, 0xa6, 0xff, 0x58, 0xff, 0xa1, 0xff, 0x59, 0xff, 0xa3, 0xff, 0x61, 0xff, 0xa8, 0xff, 0x6e, 0xff, 0xae, 0xff, 0x7f, 0xff, 0xb3, 0xff, 0x91, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0xab, 0xff, 0xa5, 0xff, 0xa2, 0xff, 0xab, 0xff, 0x9e, 0xff, 0xb4, 0xff, 0xa4, 0xff, 0xc7, 0xff, 0xb4, 0xff, 0xe2, 0xff, 0xc8, 0xff, 0x02, 0x00, 0xdb, 0xff, 0x22, 0x00, 0xe8, 0xff, 0x3c, 0x00, 0xf0, 0xff, 0x53, 0x00, 0xf5, 0xff, 0x66, 0x00, 0xf9, 0xff, 0x77, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x0c, 0x00, 0xa1, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0x32, 0x00, 0xdd, 0x00, 0x44, 0x00, 0xf8, 0x00, 0x50, 0x00, 0x0c, 0x01, 0x54, 0x00, 0x16, 0x01, 0x57, 0x00, 0x1d, 0x01, 0x59, 0x00, 0x25, 0x01, 0x5b, 0x00, 0x2b, 0x01, 0x5e, 0x00, 0x31, 0x01, 0x5e, 0x00, 0x33, 0x01, 0x58, 0x00, 0x2c, 0x01, 0x4e, 0x00, 0x1d, 0x01, 0x45, 0x00, 0x0a, 0x01, 0x41, 0x00, 0xf7, 0x00, 0x3f, 0x00, 0xe3, 0x00, 0x3d, 0x00, 0xd1, 0x00, 0x3e, 0x00, 0xc6, 0x00, 0x3e, 0x00, 0xbb, 0x00, 0x38, 0x00, 0xad, 0x00, 0x2e, 0x00, 0x9b, 0x00, 0x24, 0x00, 0x84, 0x00, 0x19, 0x00, 0x6a, 0x00, 0x12, 0x00, 0x4e, 0x00, 0x0c, 0x00, 0x32, 0x00, 0x07, 0x00, 0x17, 0x00, 0x01, 0x00, 0xfd, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xe4, 0xff, 0xc1, 0xff, 0xcf, 0xff, 0xa3, 0xff, 0xc1, 0xff, 0x8f, 0xff, 0xbc, 0xff, 0x85, 0xff, 0xbe, 0xff, 0x81, 0xff, 0xc4, 0xff, 0x81, 0xff, 0xca, 0xff, 0x7e, 0xff, 0xca, 0xff, 0x78, 0xff, 0xc3, 0xff, 0x6d, 0xff, 0xb8, 0xff, 0x63, 0xff, 0xac, 0xff, 0x5b, 0xff, 0xa6, 0xff, 0x5d, 0xff, 0xa6, 0xff, 0x68, 0xff, 0xa7, 0xff, 0x75, 0xff, 0xa6, 0xff, 0x7c, 0xff, 0xa0, 0xff, 0x7c, 0xff, 0x99, 0xff, 0x76, 0xff, 0x92, 0xff, 0x6e, 0xff, 0x91, 0xff, 0x6c, 0xff, 0x97, 0xff, 0x74, 0xff, 0xa2, 0xff, 0x82, 0xff, 0xb0, 0xff, 0x92, 0xff, 0xba, 0xff, 0x9f, 0xff, 0xbd, 0xff, 0xa4, 0xff, 0xbb, 0xff, 0xa0, 0xff, 0xb4, 0xff, 0x94, 0xff, 0xb2, 0xff, 0x8a, 0xff, 0xb6, 0xff, 0x83, 0xff, 0xbe, 0xff, 0x82, 0xff, 0xc5, 0xff, 0x85, 0xff, 0xc7, 0xff, 0x87, 0xff, 0xc3, 0xff, 0x87, 0xff, 0xbc, 0xff, 0x83, 0xff, 0xb7, 0xff, 0x82, 0xff, 0xb8, 0xff, 0x87, 0xff, 0xc0, 0xff, 0x94, 0xff, 0xcc, 0xff, 0xa5, 0xff, 0xd9, 0xff, 0xbb, 0xff, 0xe3, 0xff, 0xd1, 0xff, 0xe7, 0xff, 0xe2, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x21, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x14, 0x00, 0x5c, 0x00, 0x22, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x87, 0x00, 0x3c, 0x00, 0x9c, 0x00, 0x4d, 0x00, 0xb2, 0x00, 0x62, 0x00, 0xc7, 0x00, 0x74, 0x00, 0xd8, 0x00, 0x81, 0x00, 0xe4, 0x00, 0x8a, 0x00, 0xec, 0x00, 0x90, 0x00, 0xf1, 0x00, 0x93, 0x00, 0xf4, 0x00, 0x91, 0x00, 0xf3, 0x00, 0x8d, 0x00, 0xed, 0x00, 0x8e, 0x00, 0xe9, 0x00, 0x97, 0x00, 0xeb, 0x00, 0xa5, 0x00, 0xef, 0x00, 0xae, 0x00, 0xee, 0x00, 0xac, 0x00, 0xe5, 0x00, 0xa4, 0x00, 0xd9, 0x00, 0x96, 0x00, 0xca, 0x00, 0x84, 0x00, 0xb9, 0x00, 0x6f, 0x00, 0xa3, 0x00, 0x5b, 0x00, 0x8d, 0x00, 0x4f, 0x00, 0x7d, 0x00, 0x47, 0x00, 0x70, 0x00, 0x3b, 0x00, 0x5e, 0x00, 0x25, 0x00, 0x46, 0x00, 0x0a, 0x00, 0x29, 0x00, 0xef, 0xff, 0x10, 0x00, 0xd9, 0xff, 0xfc, 0xff, 0xc8, 0xff, 0xec, 0xff, 0xba, 0xff, 0xdd, 0xff, 0xac, 0xff, 0xcb, 0xff, 0xa0, 0xff, 0xb9, 0xff, 0x98, 0xff, 0xa9, 0xff, 0x96, 0xff, 0x9e, 0xff, 0x98, 0xff, 0x98, 0xff, 0x9a, 0xff, 0x92, 0xff, 0x9d, 0xff, 0x8d, 0xff, 0xa4, 0xff, 0x8d, 0xff, 0xaf, 0xff, 0x90, 0xff, 0xb9, 0xff, 0x92, 0xff, 0xc0, 0xff, 0x8f, 0xff, 0xc2, 0xff, 0x88, 0xff, 0xc3, 0xff, 0x7f, 0xff, 0xc6, 0xff, 0x76, 0xff, 0xd0, 0xff, 0x73, 0xff, 0xe3, 0xff, 0x78, 0xff, 0xf5, 0xff, 0x80, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf4, 0xff, 0x77, 0xff, 0xe7, 0xff, 0x6e, 0xff, 0xe0, 0xff, 0x6b, 0xff, 0xe2, 0xff, 0x70, 0xff, 0xe6, 0xff, 0x79, 0xff, 0xec, 0xff, 0x84, 0xff, 0xef, 0xff, 0x8e, 0xff, 0xe8, 0xff, 0x90, 0xff, 0xd6, 0xff, 0x89, 0xff, 0xc6, 0xff, 0x83, 0xff, 0xbe, 0xff, 0x87, 0xff, 0xbe, 0xff, 0x92, 0xff, 0xc1, 0xff, 0xa0, 0xff, 0xc3, 0xff, 0xaf, 0xff, 0xc1, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xbd, 0xff, 0xaf, 0xff, 0xbe, 0xff, 0xac, 0xff, 0xc1, 0xff, 0xb1, 0xff, 0xc8, 0xff, 0xbc, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xe7, 0xff, 0xdd, 0xff, 0xf9, 0xff, 0xe4, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x07, 0x00, 0xde, 0xff, 0x09, 0x00, 0xde, 0xff, 0x0e, 0x00, 0xe7, 0xff, 0x19, 0x00, 0xfc, 0xff, 0x2c, 0x00, 0x15, 0x00, 0x41, 0x00, 0x29, 0x00, 0x52, 0x00, 0x30, 0x00, 0x59, 0x00, 0x2a, 0x00, 0x57, 0x00, 0x21, 0x00, 0x54, 0x00, 0x1c, 0x00, 0x55, 0x00, 0x21, 0x00, 0x5e, 0x00, 0x2d, 0x00, 0x6b, 0x00, 0x3c, 0x00, 0x7a, 0x00, 0x48, 0x00, 0x85, 0x00, 0x4c, 0x00, 0x88, 0x00, 0x49, 0x00, 0x87, 0x00, 0x3f, 0x00, 0x82, 0x00, 0x33, 0x00, 0x7d, 0x00, 0x2b, 0x00, 0x7d, 0x00, 0x28, 0x00, 0x81, 0x00, 0x29, 0x00, 0x86, 0x00, 0x29, 0x00, 0x88, 0x00, 0x26, 0x00, 0x87, 0x00, 0x1c, 0x00, 0x7f, 0x00, 0x0c, 0x00, 0x70, 0x00, 0xfc, 0xff, 0x61, 0x00, 0xf3, 0xff, 0x58, 0x00, 0xee, 0xff, 0x52, 0x00, 0xe6, 0xff, 0x4a, 0x00, 0xdb, 0xff, 0x3f, 0x00, 0xca, 0xff, 0x2d, 0x00, 0xb9, 0xff, 0x16, 0x00, 0xab, 0xff, 0x00, 0x00, 0xa2, 0xff, 0xeb, 0xff, 0x9d, 0xff, 0xdb, 0xff, 0x99, 0xff, 0xcb, 0xff, 0x93, 0xff, 0xb8, 0xff, 0x86, 0xff, 0x9f, 0xff, 0x74, 0xff, 0x80, 0xff, 0x62, 0xff, 0x64, 0xff, 0x5b, 0xff, 0x50, 0xff, 0x5f, 0xff, 0x45, 0xff, 0x68, 0xff, 0x3f, 0xff, 0x71, 0xff, 0x36, 0xff, 0x76, 0xff, 0x2b, 0xff, 0x79, 0xff, 0x20, 0xff, 0x7f, 0xff, 0x1a, 0xff, 0x8b, 0xff, 0x1b, 0xff, 0x9a, 0xff, 0x1f, 0xff, 0xac, 0xff, 0x26, 0xff, 0xc2, 0xff, 0x33, 0xff, 0xda, 0xff, 0x43, 0xff, 0xeb, 0xff, 0x51, 0xff, 0xf2, 0xff, 0x57, 0xff, 0xf1, 0xff, 0x58, 0xff, 0xf0, 0xff, 0x59, 0xff, 0xf6, 0xff, 0x63, 0xff, 0x02, 0x00, 0x72, 0xff, 0x0c, 0x00, 0x81, 0xff, 0x0e, 0x00, 0x8c, 0xff, 0x0b, 0x00, 0x93, 0xff, 0x04, 0x00, 0x99, 0xff, 0xfb, 0xff, 0x9f, 0xff, 0xf3, 0xff, 0xa5, 0xff, 0xf1, 0xff, 0xb1, 0xff, 0xfb, 0xff, 0xc5, 0xff, 0x0c, 0x00, 0xdd, 0xff, 0x1e, 0x00, 0xf6, 0xff, 0x2e, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x26, 0x00, 0x3d, 0x00, 0x31, 0x00, 0x48, 0x00, 0x42, 0x00, 0x5a, 0x00, 0x59, 0x00, 0x74, 0x00, 0x74, 0x00, 0x96, 0x00, 0x95, 0x00, 0xb6, 0x00, 0xb2, 0x00, 0xcc, 0x00, 0xc5, 0x00, 0xdc, 0x00, 0xd2, 0x00, 0xe9, 0x00, 0xdd, 0x00, 0xf2, 0x00, 0xe3, 0x00, 0xf8, 0x00, 0xe6, 0x00, 0xf9, 0x00, 0xe5, 0x00, 0xfb, 0x00, 0xe6, 0x00, 0xfe, 0x00, 0xea, 0x00, 0x06, 0x01, 0xf1, 0x00, 0x0d, 0x01, 0xf5, 0x00, 0x0c, 0x01, 0xf0, 0x00, 0x05, 0x01, 0xe6, 0x00, 0xfb, 0x00, 0xd9, 0x00, 0xf1, 0x00, 0xce, 0x00, 0xea, 0x00, 0xc9, 0x00, 0xeb, 0x00, 0xcb, 0x00, 0xed, 0x00, 0xce, 0x00, 0xe5, 0x00, 0xc7, 0x00, 0xd5, 0x00, 0xb9, 0x00, 0xbf, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x78, 0x00, 0x7d, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x52, 0x00, 0x57, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x2e, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x30, 0x00, 0x16, 0x00, 0x22, 0x00, 0x07, 0x00, 0x0f, 0x00, 0xf4, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xd1, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xe5, 0xff, 0xc5, 0xff, 0xe4, 0xff, 0xc1, 0xff, 0xdf, 0xff, 0xba, 0xff, 0xd5, 0xff, 0xb1, 0xff, 0xc6, 0xff, 0xa5, 0xff, 0xb5, 0xff, 0x98, 0xff, 0xa8, 0xff, 0x8e, 0xff, 0x9e, 0xff, 0x86, 0xff, 0x97, 0xff, 0x7e, 0xff, 0x90, 0xff, 0x77, 0xff, 0x89, 0xff, 0x71, 0xff, 0x83, 0xff, 0x6f, 0xff, 0x7d, 0xff, 0x70, 0xff, 0x74, 0xff, 0x71, 0xff, 0x68, 0xff, 0x70, 0xff, 0x5d, 0xff, 0x6c, 0xff, 0x57, 0xff, 0x6a, 0xff, 0x56, 0xff, 0x69, 0xff, 0x5a, 0xff, 0x6d, 0xff, 0x61, 0xff, 0x75, 0xff, 0x67, 0xff, 0x7f, 0xff, 0x6b, 0xff, 0x87, 0xff, 0x6d, 0xff, 0x8d, 0xff, 0x70, 0xff, 0x91, 0xff, 0x75, 0xff, 0x97, 0xff, 0x78, 0xff, 0x9a, 0xff, 0x7b, 0xff, 0x9e, 0xff, 0x7c, 0xff, 0xa3, 0xff, 0x81, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xba, 0xff, 0x96, 0xff, 0xc9, 0xff, 0xa4, 0xff, 0xd9, 0xff, 0xb4, 0xff, 0xe7, 0xff, 0xc1, 0xff, 0xf4, 0xff, 0xcd, 0xff, 0x00, 0x00, 0xd8, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x23, 0x00, 0xf9, 0xff, 0x3f, 0x00, 0x11, 0x00, 0x5f, 0x00, 0x2d, 0x00, 0x7f, 0x00, 0x47, 0x00, 0x9a, 0x00, 0x56, 0x00, 0xab, 0x00, 0x5e, 0x00, 0xb6, 0x00, 0x5f, 0x00, 0xbe, 0x00, 0x5d, 0x00, 0xc5, 0x00, 0x5a, 0x00, 0xce, 0x00, 0x57, 0x00, 0xd6, 0x00, 0x53, 0x00, 0xdc, 0x00, 0x4c, 0x00, 0xdd, 0x00, 0x42, 0x00, 0xd9, 0x00, 0x32, 0x00, 0xcc, 0x00, 0x1c, 0x00, 0xba, 0x00, 0x08, 0x00, 0xa8, 0x00, 0xf7, 0xff, 0x99, 0x00, 0xe9, 0xff, 0x8c, 0x00, 0xdb, 0xff, 0x7e, 0x00, 0xcd, 0xff, 0x70, 0x00, 0xbf, 0xff, 0x5f, 0x00, 0xac, 0xff, 0x49, 0x00, 0x9a, 0xff, 0x31, 0x00, 0x8d, 0xff, 0x1d, 0x00, 0x87, 0xff, 0x0d, 0x00, 0x86, 0xff, 0xff, 0xff, 0x83, 0xff, 0xed, 0xff, 0x7c, 0xff, 0xd8, 0xff, 0x73, 0xff, 0xc0, 0xff, 0x64, 0xff, 0xa8, 0xff, 0x55, 0xff, 0x90, 0xff, 0x47, 0xff, 0x7a, 0xff, 0x41, 0xff, 0x69, 0xff, 0x43, 0xff, 0x5e, 0xff, 0x4a, 0xff, 0x55, 0xff, 0x53, 0xff, 0x4d, 0xff, 0x58, 0xff, 0x44, 0xff, 0x5c, 0xff, 0x3b, 0xff, 0x5e, 0xff, 0x35, 0xff, 0x5f, 0xff, 0x2e, 0xff, 0x5c, 0xff, 0x25, 0xff, 0x56, 0xff, 0x1b, 0xff, 0x59, 0xff, 0x19, 0xff, 0x6d, 0xff, 0x26, 0xff, 0x8b, 0xff, 0x3e, 0xff, 0x9e, 0xff, 0x4b, 0xff, 0x9c, 0xff, 0x45, 0xff, 0x92, 0xff, 0x37, 0xff, 0x90, 0xff, 0x34, 0xff, 0x9a, 0xff, 0x3c, 0xff, 0xa0, 0xff, 0x43, 0xff, 0x9d, 0xff, 0x42, 0xff, 0x9e, 0xff, 0x45, 0xff, 0xb0, 0xff, 0x5a, 0xff, 0xcd, 0xff, 0x7a, 0xff, 0xe4, 0xff, 0x94, 0xff, 0xeb, 0xff, 0x9f, 0xff, 0xe5, 0xff, 0x9b, 0xff, 0xd9, 0xff, 0x90, 0xff, 0xcc, 0xff, 0x85, 0xff, 0xca, 0xff, 0x85, 0xff, 0xd5, 0xff, 0x95, 0xff, 0xeb, 0xff, 0xae, 0xff, 0xfb, 0xff, 0xc0, 0xff, 0xfd, 0xff, 0xc0, 0xff, 0xf4, 0xff, 0xb2, 0xff, 0xed, 0xff, 0xa7, 0xff, 0xf4, 0xff, 0xac, 0xff, 0x05, 0x00, 0xbd, 0xff, 0x19, 0x00, 0xd3, 0xff, 0x2b, 0x00, 0xe6, 0xff, 0x37, 0x00, 0xf1, 0xff, 0x3e, 0x00, 0xf5, 0xff, 0x44, 0x00, 0xf6, 0xff, 0x49, 0x00, 0xf3, 0xff, 0x4e, 0x00, 0xf1, 0xff, 0x57, 0x00, 0xf6, 0xff, 0x6e, 0x00, 0x0c, 0x00, 0x97, 0x00, 0x36, 0x00, 0xc2, 0x00, 0x62, 0x00, 0xda, 0x00, 0x79, 0x00, 0xda, 0x00, 0x77, 0x00, 0xd3, 0x00, 0x6c, 0x00, 0xd5, 0x00, 0x6e, 0x00, 0xe5, 0x00, 0x82, 0x00, 0xfd, 0x00, 0xa2, 0x00, 0x16, 0x01, 0xc2, 0x00, 0x30, 0x01, 0xe2, 0x00, 0x44, 0x01, 0xfa, 0x00, 0x4b, 0x01, 0x03, 0x01, 0x46, 0x01, 0xfe, 0x00, 0x38, 0x01, 0xef, 0x00, 0x27, 0x01, 0xdf, 0x00, 0x1a, 0x01, 0xd7, 0x00, 0x18, 0x01, 0xdb, 0x00, 0x1d, 0x01, 0xe7, 0x00, 0x22, 0x01, 0xf0, 0x00, 0x18, 0x01, 0xe6, 0x00, 0xf7, 0x00, 0xc1, 0x00, 0xc5, 0x00, 0x8b, 0x00, 0x93, 0x00, 0x58, 0x00, 0x77, 0x00, 0x3b, 0x00, 0x72, 0x00, 0x37, 0x00, 0x7a, 0x00, 0x3e, 0x00, 0x78, 0x00, 0x38, 0x00, 0x5f, 0x00, 0x1c, 0x00, 0x35, 0x00, 0xee, 0xff, 0x0a, 0x00, 0xc3, 0xff, 0xf0, 0xff, 0xa8, 0xff, 0xe6, 0xff, 0xa0, 0xff, 0xde, 0xff, 0x9b, 0xff, 0xcc, 0xff, 0x8b, 0xff, 0xb2, 0xff, 0x72, 0xff, 0x97, 0xff, 0x5a, 0xff, 0x84, 0xff, 0x4c, 0xff, 0x79, 0xff, 0x48, 0xff, 0x6e, 0xff, 0x45, 0xff, 0x66, 0xff, 0x45, 0xff, 0x61, 0xff, 0x48, 0xff, 0x65, 0xff, 0x4f, 0xff, 0x70, 0xff, 0x5b, 0xff, 0x84, 0xff, 0x6f, 0xff, 0x9e, 0xff, 0x89, 0xff, 0xb5, 0xff, 0xa2, 0xff, 0xc3, 0xff, 0xb6, 0xff, 0xcc, 0xff, 0xc5, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xee, 0xff, 0x03, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x2f, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x59, 0x00, 0x53, 0x00, 0x6a, 0x00, 0x5a, 0x00, 0x7b, 0x00, 0x60, 0x00, 0x89, 0x00, 0x61, 0x00, 0x8f, 0x00, 0x5e, 0x00, 0x90, 0x00, 0x60, 0x00, 0x95, 0x00, 0x67, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0xae, 0x00, 0x75, 0x00, 0xbb, 0x00, 0x74, 0x00, 0xc1, 0x00, 0x6b, 0x00, 0xbe, 0x00, 0x5f, 0x00, 0xb6, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x51, 0x00, 0xb2, 0x00, 0x56, 0x00, 0xbd, 0x00, 0x5c, 0x00, 0xc9, 0x00, 0x58, 0x00, 0xca, 0x00, 0x45, 0x00, 0xb8, 0x00, 0x26, 0x00, 0x97, 0x00, 0x0c, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x01, 0x00, 0x68, 0x00, 0x08, 0x00, 0x6d, 0x00, 0x0c, 0x00, 0x70, 0x00, 0x04, 0x00, 0x67, 0x00, 0xf3, 0xff, 0x52, 0x00, 0xdd, 0xff, 0x33, 0x00, 0xc6, 0xff, 0x13, 0x00, 0xb1, 0xff, 0xf3, 0xff, 0x9c, 0xff, 0xd8, 0xff, 0x8e, 0xff, 0xc5, 0xff, 0x84, 0xff, 0xb9, 0xff, 0x7f, 0xff, 0xaf, 0xff, 0x79, 0xff, 0xa1, 0xff, 0x6b, 0xff, 0x89, 0xff, 0x55, 0xff, 0x69, 0xff, 0x3d, 0xff, 0x48, 0xff, 0x2e, 0xff, 0x32, 0xff, 0x2b, 0xff, 0x2a, 0xff, 0x2f, 0xff, 0x2d, 0xff, 0x36, 0xff, 0x35, 0xff, 0x38, 0xff, 0x3a, 0xff, 0x33, 0xff, 0x38, 0xff, 0x2e, 0xff, 0x36, 0xff, 0x2f, 0xff, 0x3a, 0xff, 0x39, 0xff, 0x49, 0xff, 0x44, 0xff, 0x5c, 0xff, 0x4d, 0xff, 0x6c, 0xff, 0x54, 0xff, 0x77, 0xff, 0x59, 0xff, 0x7e, 0xff, 0x65, 0xff, 0x89, 0xff, 0x77, 0xff, 0x9b, 0xff, 0x87, 0xff, 0xac, 0xff, 0x91, 0xff, 0xb8, 0xff, 0x96, 0xff, 0xc0, 0xff, 0x98, 0xff, 0xc7, 0xff, 0x9c, 0xff, 0xcd, 0xff, 0xa2, 0xff, 0xd4, 0xff, 0xac, 0xff, 0xdb, 0xff, 0xb9, 0xff, 0xe3, 0xff, 0xc9, 0xff, 0xeb, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xec, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x09, 0x00, 0x06, 0x00, 0x07, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x18, 0x00, 0x28, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x19, 0x00, 0x27, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x15, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x20, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x18, 0x00, 0x4a, 0x00, 0x21, 0x00, 0x52, 0x00, 0x22, 0x00, 0x56, 0x00, 0x20, 0x00, 0x5a, 0x00, 0x1f, 0x00, 0x5f, 0x00, 0x22, 0x00, 0x67, 0x00, 0x2a, 0x00, 0x74, 0x00, 0x38, 0x00, 0x85, 0x00, 0x48, 0x00, 0x95, 0x00, 0x53, 0x00, 0x9d, 0x00, 0x57, 0x00, 0x9f, 0x00, 0x54, 0x00, 0xa0, 0x00, 0x52, 0x00, 0xa6, 0x00, 0x56, 0x00, 0xb3, 0x00, 0x64, 0x00, 0xc2, 0x00, 0x76, 0x00, 0xcf, 0x00, 0x87, 0x00, 0xd3, 0x00, 0x91, 0x00, 0xca, 0x00, 0x8e, 0x00, 0xb8, 0x00, 0x82, 0x00, 0xa6, 0x00, 0x76, 0x00, 0x98, 0x00, 0x70, 0x00, 0x8c, 0x00, 0x6e, 0x00, 0x81, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x5b, 0x00, 0x61, 0x00, 0x46, 0x00, 0x54, 0x00, 0x30, 0x00, 0x47, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x08, 0x00, 0x37, 0x00, 0xf3, 0xff, 0x2f, 0x00, 0xdc, 0xff, 0x24, 0x00, 0xc0, 0xff, 0x12, 0x00, 0xa3, 0xff, 0xfc, 0xff, 0x88, 0xff, 0xe4, 0xff, 0x73, 0xff, 0xcf, 0xff, 0x64, 0xff, 0xc1, 0xff, 0x57, 0xff, 0xb9, 0xff, 0x45, 0xff, 0xb1, 0xff, 0x2d, 0xff, 0xa5, 0xff, 0x13, 0xff, 0x96, 0xff, 0xfc, 0xfe, 0x88, 0xff, 0xec, 0xfe, 0x7d, 0xff, 0xe3, 0xfe, 0x79, 0xff, 0xe4, 0xfe, 0x7e, 0xff, 0xec, 0xfe, 0x8a, 0xff, 0xf6, 0xfe, 0x98, 0xff, 0xfe, 0xfe, 0xa7, 0xff, 0x03, 0xff, 0xb4, 0xff, 0x08, 0xff, 0xc1, 0xff, 0x0d, 0xff, 0xcc, 0xff, 0x15, 0xff, 0xd9, 0xff, 0x22, 0xff, 0xe8, 0xff, 0x34, 0xff, 0xfa, 0xff, 0x46, 0xff, 0x0b, 0x00, 0x55, 0xff, 0x17, 0x00, 0x61, 0xff, 0x1f, 0x00, 0x69, 0xff, 0x21, 0x00, 0x74, 0xff, 0x25, 0x00, 0x88, 0xff, 0x31, 0x00, 0xa6, 0xff, 0x45, 0x00, 0xc9, 0xff, 0x5e, 0x00, 0xea, 0xff, 0x71, 0x00, 0x04, 0x00, 0x7c, 0x00, 0x1a, 0x00, 0x82, 0x00, 0x33, 0x00, 0x8a, 0x00, 0x51, 0x00, 0x97, 0x00, 0x75, 0x00, 0xa9, 0x00, 0x9b, 0x00, 0xbc, 0x00, 0xb8, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xc9, 0x00, 0xc8, 0x00, 0xbd, 0x00, 0xc4, 0x00, 0xab, 0x00, 0xc5, 0x00, 0x9d, 0x00, 0xce, 0x00, 0x95, 0x00, 0xdf, 0x00, 0x94, 0x00, 0xef, 0x00, 0x93, 0x00, 0xf8, 0x00, 0x8d, 0x00, 0xf8, 0x00, 0x82, 0x00, 0xf4, 0x00, 0x78, 0x00, 0xee, 0x00, 0x6f, 0x00, 0xe6, 0x00, 0x66, 0x00, 0xe3, 0x00, 0x60, 0x00, 0xe2, 0x00, 0x5a, 0x00, 0xe1, 0x00, 0x52, 0x00, 0xda, 0x00, 0x45, 0x00, 0xcf, 0x00, 0x35, 0x00, 0xc0, 0x00, 0x25, 0x00, 0xb1, 0x00, 0x17, 0x00, 0xa8, 0x00, 0x10, 0x00, 0xa5, 0x00, 0x0f, 0x00, 0xa4, 0x00, 0x11, 0x00, 0xa2, 0x00, 0x0f, 0x00, 0x98, 0x00, 0x07, 0x00, 0x85, 0x00, 0xf6, 0xff, 0x6f, 0x00, 0xe2, 0xff, 0x5b, 0x00, 0xd1, 0xff, 0x4d, 0x00, 0xc8, 0xff, 0x45, 0x00, 0xc6, 0xff, 0x3b, 0x00, 0xc3, 0xff, 0x2f, 0x00, 0xc0, 0xff, 0x1b, 0x00, 0xb9, 0xff, 0xfe, 0xff, 0xaa, 0xff, 0xda, 0xff, 0x96, 0xff, 0xb4, 0xff, 0x7e, 0xff, 0x94, 0xff, 0x69, 0xff, 0x7f, 0xff, 0x5e, 0xff, 0x72, 0xff, 0x5b, 0xff, 0x69, 0xff, 0x5f, 0xff, 0x5e, 0xff, 0x65, 0xff, 0x4e, 0xff, 0x6a, 0xff, 0x37, 0xff, 0x66, 0xff, 0x1b, 0xff, 0x5a, 0xff, 0x01, 0xff, 0x4c, 0xff, 0xea, 0xfe, 0x3d, 0xff, 0xd7, 0xfe, 0x30, 0xff, 0xc7, 0xfe, 0x26, 0xff, 0xba, 0xfe, 0x1f, 0xff, 0xad, 0xfe, 0x17, 0xff, 0xa0, 0xfe, 0x0f, 0xff, 0x96, 0xfe, 0x08, 0xff, 0x92, 0xfe, 0x04, 0xff, 0x95, 0xfe, 0x06, 0xff, 0x9c, 0xfe, 0x0a, 0xff, 0xa5, 0xfe, 0x10, 0xff, 0xac, 0xfe, 0x14, 0xff, 0xb4, 0xfe, 0x19, 0xff, 0xc2, 0xfe, 0x20, 0xff, 0xd5, 0xfe, 0x2a, 0xff, 0xf1, 0xfe, 0x37, 0xff, 0x13, 0xff, 0x4a, 0xff, 0x3a, 0xff, 0x61, 0xff, 0x5d, 0xff, 0x79, 0xff, 0x7a, 0xff, 0x8e, 0xff, 0x92, 0xff, 0xa0, 0xff, 0xa8, 0xff, 0xae, 0xff, 0xc1, 0xff, 0xbc, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0x05, 0x00, 0xe0, 0xff, 0x2d, 0x00, 0xf7, 0xff, 0x57, 0x00, 0x11, 0x00, 0x7f, 0x00, 0x2b, 0x00, 0xa2, 0x00, 0x44, 0x00, 0xbb, 0x00, 0x55, 0x00, 0xcc, 0x00, 0x5f, 0x00, 0xde, 0x00, 0x69, 0x00, 0xf1, 0x00, 0x74, 0x00, 0x04, 0x01, 0x7f, 0x00, 0x17, 0x01, 0x89, 0x00, 0x2c, 0x01, 0x94, 0x00, 0x40, 0x01, 0x9d, 0x00, 0x52, 0x01, 0xa4, 0x00, 0x60, 0x01, 0xa6, 0x00, 0x68, 0x01, 0xa6, 0x00, 0x67, 0x01, 0xa1, 0x00, 0x5e, 0x01, 0x97, 0x00, 0x4e, 0x01, 0x8a, 0x00, 0x3c, 0x01, 0x79, 0x00, 0x2a, 0x01, 0x66, 0x00, 0x1a, 0x01, 0x4f, 0x00, 0x09, 0x01, 0x37, 0x00, 0xf9, 0x00, 0x23, 0x00, 0xeb, 0x00, 0x15, 0x00, 0xdd, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x09, 0x00, 0xbc, 0x00, 0x02, 0x00, 0xaa, 0x00, 0xf8, 0xff, 0x98, 0x00, 0xeb, 0xff, 0x89, 0x00, 0xdd, 0xff, 0x7f, 0x00, 0xd2, 0xff, 0x77, 0x00, 0xca, 0xff, 0x6e, 0x00, 0xc6, 0xff, 0x62, 0x00, 0xc4, 0xff, 0x55, 0x00, 0xc5, 0xff, 0x48, 0x00, 0xc7, 0xff, 0x38, 0x00, 0xc5, 0xff, 0x24, 0x00, 0xbd, 0xff, 0x0d, 0x00, 0xb2, 0xff, 0xf4, 0xff, 0xa7, 0xff, 0xdc, 0xff, 0x9e, 0xff, 0xc9, 0xff, 0x9d, 0xff, 0xb6, 0xff, 0x9f, 0xff, 0xa3, 0xff, 0xa1, 0xff, 0x91, 0xff, 0xa4, 0xff, 0x81, 0xff, 0xaa, 0xff, 0x73, 0xff, 0xb1, 0xff, 0x63, 0xff, 0xb6, 0xff, 0x4f, 0xff, 0xb7, 0xff, 0x38, 0xff, 0xb2, 0xff, 0x21, 0xff, 0xab, 0xff, 0x10, 0xff, 0xa6, 0xff, 0x06, 0xff, 0xa6, 0xff, 0xff, 0xfe, 0xa8, 0xff, 0xf9, 0xfe, 0xaa, 0xff, 0xf2, 0xfe, 0xac, 0xff, 0xee, 0xfe, 0xaf, 0xff, 0xef, 0xfe, 0xb6, 0xff, 0xef, 0xfe, 0xb9, 0xff, 0xf0, 0xfe, 0xba, 0xff, 0xf0, 0xfe, 0xb9, 0xff, 0xf6, 0xfe, 0xb9, 0xff, 0x00, 0xff, 0xbe, 0xff, 0x0f, 0xff, 0xca, 0xff, 0x24, 0xff, 0xde, 0xff, 0x3d, 0xff, 0xf7, 0xff, 0x57, 0xff, 0x0f, 0x00, 0x6e, 0xff, 0x21, 0x00, 0x82, 0xff, 0x2d, 0x00, 0x93, 0xff, 0x35, 0x00, 0xa3, 0xff, 0x3f, 0x00, 0xb7, 0xff, 0x4f, 0x00, 0xd1, 0xff, 0x65, 0x00, 0xed, 0xff, 0x7c, 0x00, 0x0b, 0x00, 0x93, 0x00, 0x28, 0x00, 0xa6, 0x00, 0x41, 0x00, 0xb7, 0x00, 0x54, 0x00, 0xc5, 0x00, 0x64, 0x00, 0xd2, 0x00, 0x74, 0x00, 0xe0, 0x00, 0x85, 0x00, 0xed, 0x00, 0x95, 0x00, 0xf8, 0x00, 0xa3, 0x00, 0xfd, 0x00, 0xab, 0x00, 0xfd, 0x00, 0xac, 0x00, 0xf6, 0x00, 0xab, 0x00, 0xee, 0x00, 0xa9, 0x00, 0xe7, 0x00, 0xa5, 0x00, 0xde, 0x00, 0x9f, 0x00, 0xd3, 0x00, 0x98, 0x00, 0xc4, 0x00, 0x95, 0x00, 0xb7, 0x00, 0x96, 0x00, 0xa8, 0x00, 0x96, 0x00, 0x95, 0x00, 0x93, 0x00, 0x7f, 0x00, 0x91, 0x00, 0x6a, 0x00, 0x90, 0x00, 0x5a, 0x00, 0x93, 0x00, 0x50, 0x00, 0x99, 0x00, 0x48, 0x00, 0x9c, 0x00, 0x3e, 0x00, 0x99, 0x00, 0x2b, 0x00, 0x8e, 0x00, 0x10, 0x00, 0x7e, 0x00, 0xf4, 0xff, 0x72, 0x00, 0xe0, 0xff, 0x69, 0x00, 0xd3, 0xff, 0x63, 0x00, 0xcb, 0xff, 0x63, 0x00, 0xc8, 0xff, 0x64, 0x00, 0xc4, 0xff, 0x63, 0x00, 0xbf, 0xff, 0x60, 0x00, 0xba, 0xff, 0x5b, 0x00, 0xb9, 0xff, 0x54, 0x00, 0xba, 0xff, 0x4a, 0x00, 0xbb, 0xff, 0x3f, 0x00, 0xba, 0xff, 0x34, 0x00, 0xb9, 0xff, 0x2a, 0x00, 0xb5, 0xff, 0x1e, 0x00, 0xae, 0xff, 0x12, 0x00, 0xa9, 0xff, 0x06, 0x00, 0xa5, 0xff, 0xf7, 0xff, 0xa3, 0xff, 0xe9, 0xff, 0xa4, 0xff, 0xdd, 0xff, 0xa4, 0xff, 0xcf, 0xff, 0xa1, 0xff, 0xc0, 0xff, 0x96, 0xff, 0xb0, 0xff, 0x87, 0xff, 0xa0, 0xff, 0x77, 0xff, 0x8d, 0xff, 0x65, 0xff, 0x7b, 0xff, 0x58, 0xff, 0x71, 0xff, 0x54, 0xff, 0x6c, 0xff, 0x55, 0xff, 0x68, 0xff, 0x54, 0xff, 0x66, 0xff, 0x51, 0xff, 0x62, 0xff, 0x4b, 0xff, 0x5f, 0xff, 0x43, 0xff, 0x60, 0xff, 0x40, 0xff, 0x66, 0xff, 0x43, 0xff, 0x6d, 0xff, 0x4a, 0xff, 0x78, 0xff, 0x55, 0xff, 0x87, 0xff, 0x64, 0xff, 0x99, 0xff, 0x75, 0xff, 0xa9, 0xff, 0x83, 0xff, 0xb7, 0xff, 0x91, 0xff, 0xc6, 0xff, 0xa3, 0xff, 0xd6, 0xff, 0xb7, 0xff, 0xe6, 0xff, 0xcb, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x15, 0x00, 0x04, 0x00, 0x22, 0x00, 0x17, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x32, 0x00, 0x34, 0x00, 0x39, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x55, 0x00, 0x53, 0x00, 0x5b, 0x00, 0x54, 0x00, 0x5e, 0x00, 0x52, 0x00, 0x5f, 0x00, 0x53, 0x00, 0x62, 0x00, 0x5a, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x88, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x94, 0x00, 0x9a, 0x00, 0x94, 0x00, 0x9d, 0x00, 0x92, 0x00, 0x9d, 0x00, 0x90, 0x00, 0x9a, 0x00, 0x8e, 0x00, 0x98, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0x93, 0x00, 0xaa, 0x00, 0x9b, 0x00, 0xb6, 0x00, 0xa0, 0x00, 0xbf, 0x00, 0xa3, 0x00, 0xc4, 0x00, 0xa5, 0x00, 0xc6, 0x00, 0xa6, 0x00, 0xc1, 0x00, 0xa3, 0x00, 0xbb, 0x00, 0x9d, 0x00, 0xb9, 0x00, 0x98, 0x00, 0xba, 0x00, 0x94, 0x00, 0xbb, 0x00, 0x8e, 0x00, 0xb5, 0x00, 0x85, 0x00, 0xa8, 0x00, 0x76, 0x00, 0x98, 0x00, 0x69, 0x00, 0x8c, 0x00, 0x62, 0x00, 0x85, 0x00, 0x61, 0x00, 0x7e, 0x00, 0x60, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x63, 0x00, 0x51, 0x00, 0x4b, 0x00, 0x3e, 0x00, 0x2d, 0x00, 0x26, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xd8, 0xff, 0xf5, 0xff, 0xbf, 0xff, 0xef, 0xff, 0xa9, 0xff, 0xea, 0xff, 0x92, 0xff, 0xe1, 0xff, 0x79, 0xff, 0xd2, 0xff, 0x5f, 0xff, 0xc3, 0xff, 0x49, 0xff, 0xbc, 0xff, 0x35, 0xff, 0xba, 0xff, 0x24, 0xff, 0xbc, 0xff, 0x18, 0xff, 0xbd, 0xff, 0x11, 0xff, 0xbb, 0xff, 0x0d, 0xff, 0xb8, 0xff, 0x10, 0xff, 0xb9, 0xff, 0x15, 0xff, 0xbd, 0xff, 0x1b, 0xff, 0xc2, 0xff, 0x23, 0xff, 0xc9, 0xff, 0x2d, 0xff, 0xd4, 0xff, 0x3a, 0xff, 0xdf, 0xff, 0x47, 0xff, 0xe5, 0xff, 0x4f, 0xff, 0xe5, 0xff, 0x59, 0xff, 0xe2, 0xff, 0x63, 0xff, 0xe0, 0xff, 0x6c, 0xff, 0xe2, 0xff, 0x77, 0xff, 0xe8, 0xff, 0x80, 0xff, 0xef, 0xff, 0x89, 0xff, 0xf5, 0xff, 0x94, 0xff, 0xfa, 0xff, 0xa0, 0xff, 0xfb, 0xff, 0xaa, 0xff, 0xfa, 0xff, 0xb5, 0xff, 0xfa, 0xff, 0xc1, 0xff, 0xfc, 0xff, 0xcf, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x1b, 0x00, 0xfc, 0xff, 0x1e, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x21, 0x00, 0x16, 0x00, 0x2f, 0x00, 0x19, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x4e, 0x00, 0x23, 0x00, 0x5b, 0x00, 0x23, 0x00, 0x65, 0x00, 0x1f, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x7f, 0x00, 0x20, 0x00, 0x91, 0x00, 0x29, 0x00, 0xa3, 0x00, 0x34, 0x00, 0xaf, 0x00, 0x3a, 0x00, 0xb8, 0x00, 0x3c, 0x00, 0xbc, 0x00, 0x38, 0x00, 0xbc, 0x00, 0x2f, 0x00, 0xbc, 0x00, 0x25, 0x00, 0xbe, 0x00, 0x20, 0x00, 0xc2, 0x00, 0x21, 0x00, 0xc2, 0x00, 0x22, 0x00, 0xbf, 0x00, 0x23, 0x00, 0xba, 0x00, 0x22, 0x00, 0xb1, 0x00, 0x1c, 0x00, 0xa2, 0x00, 0x0f, 0x00, 0x92, 0x00, 0x00, 0x00, 0x84, 0x00, 0xf6, 0xff, 0x78, 0x00, 0xf1, 0xff, 0x6b, 0x00, 0xf1, 0xff, 0x5f, 0x00, 0xf6, 0xff, 0x51, 0x00, 0xf9, 0xff, 0x3c, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xe5, 0xff, 0x00, 0x00, 0xd1, 0xff, 0xe0, 0xff, 0xbe, 0xff, 0xc4, 0xff, 0xb3, 0xff, 0xae, 0xff, 0xad, 0xff, 0x9c, 0xff, 0xaa, 0xff, 0x89, 0xff, 0xa5, 0xff, 0x70, 0xff, 0x99, 0xff, 0x4f, 0xff, 0x84, 0xff, 0x2d, 0xff, 0x6d, 0xff, 0x14, 0xff, 0x5f, 0xff, 0x0c, 0xff, 0x64, 0xff, 0x07, 0xff, 0x6a, 0xff, 0xf5, 0xfe, 0x63, 0xff, 0xda, 0xfe, 0x50, 0xff, 0xc8, 0xfe, 0x44, 0xff, 0xc5, 0xfe, 0x46, 0xff, 0xc6, 0xfe, 0x4c, 0xff, 0xc0, 0xfe, 0x4f, 0xff, 0xb2, 0xfe, 0x4b, 0xff, 0xa8, 0xfe, 0x4b, 0xff, 0xae, 0xfe, 0x59, 0xff, 0xc1, 0xfe, 0x71, 0xff, 0xd1, 0xfe, 0x81, 0xff, 0xd5, 0xfe, 0x82, 0xff, 0xd7, 0xfe, 0x81, 0xff, 0xe0, 0xfe, 0x89, 0xff, 0xf3, 0xfe, 0x9c, 0xff, 0x0e, 0xff, 0xb7, 0xff, 0x29, 0xff, 0xce, 0xff, 0x38, 0xff, 0xd4, 0xff, 0x40, 0xff, 0xce, 0xff, 0x4f, 0xff, 0xcd, 0xff, 0x67, 0xff, 0xd8, 0xff, 0x81, 0xff, 0xe6, 0xff, 0x96, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xf8, 0xff, 0xba, 0xff, 0xf9, 0xff, 0xce, 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xec, 0xff, 0x10, 0x00, 0xec, 0xff, 0x25, 0x00, 0xf0, 0xff, 0x38, 0x00, 0xf4, 0xff, 0x45, 0x00, 0xf0, 0xff, 0x50, 0x00, 0xeb, 0xff, 0x60, 0x00, 0xeb, 0xff, 0x76, 0x00, 0xf5, 0xff, 0x8e, 0x00, 0x02, 0x00, 0xa2, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x1d, 0x00, 0xb8, 0x00, 0x27, 0x00, 0xbd, 0x00, 0x30, 0x00, 0xc4, 0x00, 0x3b, 0x00, 0xd0, 0x00, 0x48, 0x00, 0xdd, 0x00, 0x54, 0x00, 0xe0, 0x00, 0x59, 0x00, 0xdd, 0x00, 0x5a, 0x00, 0xd8, 0x00, 0x5d, 0x00, 0xd7, 0x00, 0x65, 0x00, 0xd6, 0x00, 0x6f, 0x00, 0xd2, 0x00, 0x74, 0x00, 0xce, 0x00, 0x77, 0x00, 0xcd, 0x00, 0x7d, 0x00, 0xce, 0x00, 0x85, 0x00, 0xcd, 0x00, 0x8e, 0x00, 0xcc, 0x00, 0x96, 0x00, 0xcb, 0x00, 0x9e, 0x00, 0xcc, 0x00, 0xa6, 0x00, 0xcc, 0x00, 0xab, 0x00, 0xcc, 0x00, 0xaf, 0x00, 0xc9, 0x00, 0xb0, 0x00, 0xc2, 0x00, 0xaf, 0x00, 0xb8, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xad, 0x00, 0x9c, 0x00, 0xab, 0x00, 0x8e, 0x00, 0xa6, 0x00, 0x7e, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x8d, 0x00, 0x56, 0x00, 0x81, 0x00, 0x44, 0x00, 0x7b, 0x00, 0x31, 0x00, 0x75, 0x00, 0x1c, 0x00, 0x6a, 0x00, 0x05, 0x00, 0x59, 0x00, 0xf1, 0xff, 0x48, 0x00, 0xdc, 0xff, 0x36, 0x00, 0xc4, 0xff, 0x22, 0x00, 0xa8, 0xff, 0x0a, 0x00, 0x89, 0xff, 0xef, 0xff, 0x6c, 0xff, 0xd5, 0xff, 0x52, 0xff, 0xbf, 0xff, 0x3c, 0xff, 0xae, 0xff, 0x27, 0xff, 0x9e, 0xff, 0x16, 0xff, 0x91, 0xff, 0x0b, 0xff, 0x85, 0xff, 0x03, 0xff, 0x7b, 0xff, 0xfd, 0xfe, 0x73, 0xff, 0xf8, 0xfe, 0x6f, 0xff, 0xf8, 0xfe, 0x6f, 0xff, 0xfb, 0xfe, 0x70, 0xff, 0x03, 0xff, 0x70, 0xff, 0x0c, 0xff, 0x6d, 0xff, 0x16, 0xff, 0x6a, 0xff, 0x26, 0xff, 0x6d, 0xff, 0x38, 0xff, 0x74, 0xff, 0x49, 0xff, 0x7a, 0xff, 0x57, 0xff, 0x7a, 0xff, 0x67, 0xff, 0x77, 0xff, 0x7a, 0xff, 0x75, 0xff, 0x91, 0xff, 0x77, 0xff, 0xac, 0xff, 0x7f, 0xff, 0xc4, 0xff, 0x89, 0xff, 0xd9, 0xff, 0x93, 0xff, 0xed, 0xff, 0x9f, 0xff, 0x07, 0x00, 0xb0, 0xff, 0x22, 0x00, 0xc1, 0xff, 0x3a, 0x00, 0xce, 0xff, 0x4f, 0x00, 0xd9, 0xff, 0x5c, 0x00, 0xe1, 0xff, 0x66, 0x00, 0xea, 0xff, 0x70, 0x00, 0xf7, 0xff, 0x7d, 0x00, 0x06, 0x00, 0x89, 0x00, 0x15, 0x00, 0x92, 0x00, 0x1e, 0x00, 0x99, 0x00, 0x24, 0x00, 0xa3, 0x00, 0x2c, 0x00, 0xad, 0x00, 0x33, 0x00, 0xb4, 0x00, 0x38, 0x00, 0xb7, 0x00, 0x3b, 0x00, 0xb8, 0x00, 0x3e, 0x00, 0xbc, 0x00, 0x41, 0x00, 0xbf, 0x00, 0x42, 0x00, 0xc5, 0x00, 0x42, 0x00, 0xca, 0x00, 0x40, 0x00, 0xd1, 0x00, 0x41, 0x00, 0xd9, 0x00, 0x46, 0x00, 0xe0, 0x00, 0x4a, 0x00, 0xe5, 0x00, 0x4d, 0x00, 0xec, 0x00, 0x52, 0x00, 0xf4, 0x00, 0x57, 0x00, 0xfa, 0x00, 0x59, 0x00, 0xff, 0x00, 0x5b, 0x00, 0x02, 0x01, 0x5e, 0x00, 0x02, 0x01, 0x61, 0x00, 0xfe, 0x00, 0x63, 0x00, 0xf4, 0x00, 0x63, 0x00, 0xe7, 0x00, 0x62, 0x00, 0xd5, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0x54, 0x00, 0xc0, 0x00, 0x56, 0x00, 0xbc, 0x00, 0x5a, 0x00, 0xae, 0x00, 0x56, 0x00, 0x98, 0x00, 0x4e, 0x00, 0x83, 0x00, 0x4a, 0x00, 0x74, 0x00, 0x4e, 0x00, 0x66, 0x00, 0x57, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x25, 0x00, 0x44, 0x00, 0xf7, 0xff, 0x29, 0x00, 0xdd, 0xff, 0x1e, 0x00, 0xd9, 0xff, 0x28, 0x00, 0xd2, 0xff, 0x2d, 0x00, 0xb2, 0xff, 0x19, 0x00, 0x80, 0xff, 0xf3, 0xff, 0x51, 0xff, 0xd1, 0xff, 0x32, 0xff, 0xbf, 0xff, 0x1e, 0xff, 0xb6, 0xff, 0x07, 0xff, 0xa7, 0xff, 0xe8, 0xfe, 0x8a, 0xff, 0xca, 0xfe, 0x68, 0xff, 0xbd, 0xfe, 0x53, 0xff, 0xbb, 0xfe, 0x48, 0xff, 0xb8, 0xfe, 0x41, 0xff, 0xb2, 0xfe, 0x39, 0xff, 0xaf, 0xfe, 0x36, 0xff, 0xb2, 0xfe, 0x38, 0xff, 0xbb, 0xfe, 0x3d, 0xff, 0xc8, 0xfe, 0x41, 0xff, 0xd9, 0xfe, 0x46, 0xff, 0xed, 0xfe, 0x4e, 0xff, 0xfc, 0xfe, 0x55, 0xff, 0x05, 0xff, 0x59, 0xff, 0x09, 0xff, 0x5f, 0xff, 0x11, 0xff, 0x68, 0xff, 0x1f, 0xff, 0x76, 0xff, 0x32, 0xff, 0x84, 0xff, 0x43, 0xff, 0x90, 0xff, 0x4f, 0xff, 0x97, 0xff, 0x56, 0xff, 0x9a, 0xff, 0x58, 0xff, 0x9d, 0xff, 0x5b, 0xff, 0xa2, 0xff, 0x62, 0xff, 0xab, 0xff, 0x6e, 0xff, 0xb9, 0xff, 0x7e, 0xff, 0xc9, 0xff, 0x8f, 0xff, 0xd9, 0xff, 0xa2, 0xff, 0xea, 0xff, 0xb4, 0xff, 0xfa, 0xff, 0xc6, 0xff, 0x0c, 0x00, 0xd9, 0xff, 0x22, 0x00, 0xee, 0xff, 0x39, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x18, 0x00, 0x62, 0x00, 0x2c, 0x00, 0x74, 0x00, 0x42, 0x00, 0x87, 0x00, 0x54, 0x00, 0x9b, 0x00, 0x64, 0x00, 0xaf, 0x00, 0x72, 0x00, 0xc0, 0x00, 0x7e, 0x00, 0xcf, 0x00, 0x8b, 0x00, 0xdc, 0x00, 0x96, 0x00, 0xe6, 0x00, 0x9e, 0x00, 0xef, 0x00, 0xa5, 0x00, 0xf8, 0x00, 0xb1, 0x00, 0x07, 0x01, 0xbc, 0x00, 0x16, 0x01, 0xc0, 0x00, 0x1f, 0x01, 0xbe, 0x00, 0x23, 0x01, 0xb7, 0x00, 0x20, 0x01, 0xb1, 0x00, 0x1c, 0x01, 0xae, 0x00, 0x17, 0x01, 0xaf, 0x00, 0x10, 0x01, 0xae, 0x00, 0x06, 0x01, 0xa4, 0x00, 0xf4, 0x00, 0x95, 0x00, 0xde, 0x00, 0x88, 0x00, 0xc9, 0x00, 0x80, 0x00, 0xb9, 0x00, 0x7e, 0x00, 0xac, 0x00, 0x7b, 0x00, 0x9d, 0x00, 0x73, 0x00, 0x8a, 0x00, 0x69, 0x00, 0x78, 0x00, 0x62, 0x00, 0x69, 0x00, 0x5d, 0x00, 0x5a, 0x00, 0x54, 0x00, 0x45, 0x00, 0x49, 0x00, 0x2b, 0x00, 0x3d, 0x00, 0x11, 0x00, 0x33, 0x00, 0xfd, 0xff, 0x2b, 0x00, 0xf2, 0xff, 0x21, 0x00, 0xe9, 0xff, 0x13, 0x00, 0xdd, 0xff, 0x01, 0x00, 0xcb, 0xff, 0xf0, 0xff, 0xb4, 0xff, 0xde, 0xff, 0x9b, 0xff, 0xcb, 0xff, 0x81, 0xff, 0xb5, 0xff, 0x66, 0xff, 0x9b, 0xff, 0x4a, 0xff, 0x7e, 0xff, 0x2d, 0xff, 0x63, 0xff, 0x14, 0xff, 0x51, 0xff, 0x04, 0xff, 0x47, 0xff, 0xfa, 0xfe, 0x3e, 0xff, 0xef, 0xfe, 0x31, 0xff, 0xdf, 0xfe, 0x25, 0xff, 0xcd, 0xfe, 0x1f, 0xff, 0xc1, 0xfe, 0x25, 0xff, 0xc3, 0xfe, 0x34, 0xff, 0xd2, 0xfe, 0x43, 0xff, 0xe6, 0xfe, 0x4e, 0xff, 0xf6, 0xfe, 0x54, 0xff, 0x01, 0xff, 0x5f, 0xff, 0x0f, 0xff, 0x6f, 0xff, 0x20, 0xff, 0x82, 0xff, 0x37, 0xff, 0x97, 0xff, 0x50, 0xff, 0xae, 0xff, 0x69, 0xff, 0xc6, 0xff, 0x81, 0xff, 0xe2, 0xff, 0x99, 0xff, 0x01, 0x00, 0xb0, 0xff, 0x1d, 0x00, 0xc5, 0xff, 0x32, 0x00, 0xd7, 0xff, 0x43, 0x00, 0xe7, 0xff, 0x53, 0x00, 0xf8, 0xff, 0x69, 0x00, 0x0f, 0x00, 0x84, 0x00, 0x2b, 0x00, 0x9e, 0x00, 0x45, 0x00, 0xb2, 0x00, 0x57, 0x00, 0xba, 0x00, 0x5d, 0x00, 0xbd, 0x00, 0x5d, 0x00, 0xc1, 0x00, 0x60, 0x00, 0xc6, 0x00, 0x6a, 0x00, 0xcd, 0x00, 0x7b, 0x00, 0xd1, 0x00, 0x8a, 0x00, 0xcf, 0x00, 0x90, 0x00, 0xca, 0x00, 0x90, 0x00, 0xc8, 0x00, 0x8e, 0x00, 0xc9, 0x00, 0x8f, 0x00, 0xc7, 0x00, 0x91, 0x00, 0xc0, 0x00, 0x92, 0x00, 0xb7, 0x00, 0x94, 0x00, 0xb0, 0x00, 0x97, 0x00, 0xa8, 0x00, 0x99, 0x00, 0xa3, 0x00, 0x99, 0x00, 0xa2, 0x00, 0x9b, 0x00, 0xa5, 0x00, 0xa0, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xa2, 0x00, 0xa9, 0x00, 0x9e, 0x00, 0xac, 0x00, 0x97, 0x00, 0xac, 0x00, 0x90, 0x00, 0xab, 0x00, 0x8c, 0x00, 0xaa, 0x00, 0x89, 0x00, 0xaa, 0x00, 0x83, 0x00, 0xaa, 0x00, 0x78, 0x00, 0xa6, 0x00, 0x68, 0x00, 0xa0, 0x00, 0x57, 0x00, 0x97, 0x00, 0x42, 0x00, 0x8a, 0x00, 0x28, 0x00, 0x75, 0x00, 0x0b, 0x00, 0x5b, 0x00, 0xee, 0xff, 0x41, 0x00, 0xd3, 0xff, 0x27, 0x00, 0xbb, 0xff, 0x0d, 0x00, 0xa2, 0xff, 0xf3, 0xff, 0x83, 0xff, 0xd5, 0xff, 0x60, 0xff, 0xb6, 0xff, 0x40, 0xff, 0x9a, 0xff, 0x24, 0xff, 0x82, 0xff, 0x0e, 0xff, 0x6e, 0xff, 0xfd, 0xfe, 0x5b, 0xff, 0xf3, 0xfe, 0x4f, 0xff, 0xec, 0xfe, 0x45, 0xff, 0xe5, 0xfe, 0x39, 0xff, 0xdc, 0xfe, 0x2a, 0xff, 0xd6, 0xfe, 0x1a, 0xff, 0xd7, 0xfe, 0x12, 0xff, 0xde, 0xfe, 0x10, 0xff, 0xec, 0xfe, 0x17, 0xff, 0xfe, 0xfe, 0x24, 0xff, 0x10, 0xff, 0x33, 0xff, 0x20, 0xff, 0x3d, 0xff, 0x2c, 0xff, 0x41, 0xff, 0x39, 0xff, 0x44, 0xff, 0x49, 0xff, 0x49, 0xff, 0x61, 0xff, 0x56, 0xff, 0x7e, 0xff, 0x6c, 0xff, 0x9e, 0xff, 0x86, 0xff, 0xbc, 0xff, 0xa0, 0xff, 0xd2, 0xff, 0xb3, 0xff, 0xe0, 0xff, 0xbb, 0xff, 0xe8, 0xff, 0xbc, 0xff, 0xf1, 0xff, 0xbe, 0xff, 0xfa, 0xff, 0xc3, 0xff, 0x03, 0x00, 0xcc, 0xff, 0x0c, 0x00, 0xd7, 0xff, 0x11, 0x00, 0xdf, 0xff, 0x16, 0x00, 0xe3, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe6, 0xff, 0x25, 0x00, 0xe9, 0xff, 0x2b, 0x00, 0xed, 0xff, 0x33, 0x00, 0xf4, 0xff, 0x40, 0x00, 0x02, 0x00, 0x51, 0x00, 0x14, 0x00, 0x65, 0x00, 0x26, 0x00, 0x78, 0x00, 0x33, 0x00, 0x8a, 0x00, 0x3f, 0x00, 0x9e, 0x00, 0x4f, 0x00, 0xad, 0x00, 0x5f, 0x00, 0xb9, 0x00, 0x6f, 0x00, 0xc5, 0x00, 0x7f, 0x00, 0xd5, 0x00, 0x8f, 0x00, 0xe5, 0x00, 0x9c, 0x00, 0xf2, 0x00, 0xa7, 0x00, 0xfc, 0x00, 0xb1, 0x00, 0xff, 0x00, 0xb8, 0x00, 0xfd, 0x00, 0xbf, 0x00, 0xf7, 0x00, 0xc4, 0x00, 0xec, 0x00, 0xc5, 0x00, 0xdd, 0x00, 0xc0, 0x00, 0xca, 0x00, 0xb6, 0x00, 0xb5, 0x00, 0xa9, 0x00, 0xa0, 0x00, 0x9c, 0x00, 0x8e, 0x00, 0x92, 0x00, 0x7c, 0x00, 0x8d, 0x00, 0x67, 0x00, 0x85, 0x00, 0x4e, 0x00, 0x79, 0x00, 0x32, 0x00, 0x67, 0x00, 0x18, 0x00, 0x53, 0x00, 0x02, 0x00, 0x40, 0x00, 0xf1, 0xff, 0x33, 0x00, 0xe3, 0xff, 0x2c, 0x00, 0xd5, 0xff, 0x28, 0x00, 0xc3, 0xff, 0x20, 0x00, 0xae, 0xff, 0x10, 0x00, 0x99, 0xff, 0xfa, 0xff, 0x84, 0xff, 0xe0, 0xff, 0x78, 0xff, 0xcc, 0xff, 0x76, 0xff, 0xc2, 0xff, 0x7a, 0xff, 0xc1, 0xff, 0x7d, 0xff, 0xc0, 0xff, 0x7b, 0xff, 0xbd, 0xff, 0x77, 0xff, 0xb7, 0xff, 0x70, 0xff, 0xaf, 0xff, 0x69, 0xff, 0xa4, 0xff, 0x63, 0xff, 0x9c, 0xff, 0x5d, 0xff, 0x96, 0xff, 0x59, 0xff, 0x94, 0xff, 0x59, 0xff, 0x93, 0xff, 0x5d, 0xff, 0x96, 0xff, 0x5e, 0xff, 0x95, 0xff, 0x58, 0xff, 0x8d, 0xff, 0x4d, 0xff, 0x81, 0xff, 0x3f, 0xff, 0x75, 0xff, 0x33, 0xff, 0x6d, 0xff, 0x2e, 0xff, 0x6d, 0xff, 0x30, 0xff, 0x75, 0xff, 0x34, 0xff, 0x7c, 0xff, 0x37, 0xff, 0x7e, 0xff, 0x3d, 0xff, 0x7f, 0xff, 0x45, 0xff, 0x7d, 0xff, 0x4d, 0xff, 0x7c, 0xff, 0x59, 0xff, 0x80, 0xff, 0x6b, 0xff, 0x8c, 0xff, 0x80, 0xff, 0x9e, 0xff, 0x9a, 0xff, 0xb2, 0xff, 0xb7, 0xff, 0xc5, 0xff, 0xd6, 0xff, 0xd3, 0xff, 0xf2, 0xff, 0xda, 0xff, 0x0b, 0x00, 0xde, 0xff, 0x21, 0x00, 0xe5, 0xff, 0x34, 0x00, 0xee, 0xff, 0x44, 0x00, 0xfa, 0xff, 0x54, 0x00, 0x09, 0x00, 0x66, 0x00, 0x19, 0x00, 0x79, 0x00, 0x28, 0x00, 0x8e, 0x00, 0x37, 0x00, 0xa0, 0x00, 0x43, 0x00, 0xab, 0x00, 0x4c, 0x00, 0xb3, 0x00, 0x57, 0x00, 0xbb, 0x00, 0x64, 0x00, 0xc0, 0x00, 0x70, 0x00, 0xc2, 0x00, 0x7a, 0x00, 0xc2, 0x00, 0x84, 0x00, 0xbd, 0x00, 0x8c, 0x00, 0xb8, 0x00, 0x94, 0x00, 0xb7, 0x00, 0xa1, 0x00, 0xbc, 0x00, 0xb2, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xc8, 0x00, 0xd1, 0x00, 0xc7, 0x00, 0xd8, 0x00, 0xbf, 0x00, 0xd9, 0x00, 0xb5, 0x00, 0xd7, 0x00, 0xac, 0x00, 0xd4, 0x00, 0xa2, 0x00, 0xce, 0x00, 0x99, 0x00, 0xc5, 0x00, 0x8d, 0x00, 0xb7, 0x00, 0x7e, 0x00, 0xa1, 0x00, 0x6d, 0x00, 0x89, 0x00, 0x5c, 0x00, 0x71, 0x00, 0x4a, 0x00, 0x59, 0x00, 0x38, 0x00, 0x41, 0x00, 0x2a, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x08, 0x00, 0x03, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xdf, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xda, 0xff, 0xc7, 0xff, 0xd2, 0xff, 0xc4, 0xff, 0xd1, 0xff, 0xc7, 0xff, 0xd2, 0xff, 0xc9, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xd7, 0xff, 0xd0, 0xff, 0xd9, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xdd, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xc9, 0xff, 0xe8, 0xff, 0xc5, 0xff, 0xf1, 0xff, 0xc4, 0xff, 0xf9, 0xff, 0xc7, 0xff, 0x00, 0x00, 0xca, 0xff, 0x01, 0x00, 0xcb, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xf6, 0xff, 0xca, 0xff, 0xf0, 0xff, 0xcd, 0xff, 0xf0, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xe3, 0xff, 0x00, 0x00, 0xe5, 0xff, 0xfd, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe7, 0xff, 0xd2, 0xff, 0xf0, 0xff, 0xc9, 0xff, 0xf8, 0xff, 0xc1, 0xff, 0xfb, 0xff, 0xb7, 0xff, 0xfb, 0xff, 0xac, 0xff, 0xf8, 0xff, 0xa0, 0xff, 0xf8, 0xff, 0x97, 0xff, 0xfc, 0xff, 0x93, 0xff, 0x05, 0x00, 0x93, 0xff, 0x10, 0x00, 0x94, 0xff, 0x1d, 0x00, 0x93, 0xff, 0x2d, 0x00, 0x94, 0xff, 0x3b, 0x00, 0x94, 0xff, 0x44, 0x00, 0x95, 0xff, 0x42, 0x00, 0x8f, 0xff, 0x3c, 0x00, 0x8a, 0xff, 0x3e, 0x00, 0x90, 0xff, 0x4d, 0x00, 0xa3, 0xff, 0x64, 0x00, 0xbc, 0xff, 0x7b, 0x00, 0xd2, 0xff, 0x8d, 0x00, 0xe2, 0xff, 0x97, 0x00, 0xe9, 0xff, 0x9a, 0x00, 0xec, 0xff, 0x96, 0x00, 0xef, 0xff, 0x8b, 0x00, 0xf4, 0xff, 0x78, 0x00, 0xf8, 0xff, 0x63, 0x00, 0xfa, 0xff, 0x52, 0x00, 0xfc, 0xff, 0x46, 0x00, 0xfd, 0xff, 0x3e, 0x00, 0xfd, 0xff, 0x34, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xf6, 0xff, 0x14, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xde, 0xff, 0x06, 0x00, 0xd8, 0xff, 0x05, 0x00, 0xd8, 0xff, 0x0a, 0x00, 0xe1, 0xff, 0x16, 0x00, 0xec, 0xff, 0x23, 0x00, 0xf7, 0xff, 0x2b, 0x00, 0xfa, 0xff, 0x28, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xe4, 0xff, 0x08, 0x00, 0xdb, 0xff, 0xfd, 0xff, 0xd7, 0xff, 0xfa, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xcc, 0xff, 0xee, 0xff, 0xc0, 0xff, 0xe2, 0xff, 0xb0, 0xff, 0xd1, 0xff, 0xa2, 0xff, 0xc3, 0xff, 0x96, 0xff, 0xb9, 0xff, 0x8a, 0xff, 0xb1, 0xff, 0x7e, 0xff, 0xaa, 0xff, 0x71, 0xff, 0xa2, 0xff, 0x61, 0xff, 0x97, 0xff, 0x51, 0xff, 0x8a, 0xff, 0x47, 0xff, 0x84, 0xff, 0x41, 0xff, 0x85, 0xff, 0x3b, 0xff, 0x89, 0xff, 0x38, 0xff, 0x90, 0xff, 0x3b, 0xff, 0x9a, 0xff, 0x40, 0xff, 0xa4, 0xff, 0x42, 0xff, 0xaa, 0xff, 0x3f, 0xff, 0xa8, 0xff, 0x33, 0xff, 0x9f, 0xff, 0x25, 0xff, 0x96, 0xff, 0x1e, 0xff, 0x95, 0xff, 0x23, 0xff, 0x9e, 0xff, 0x30, 0xff, 0xaa, 0xff, 0x41, 0xff, 0xb4, 0xff, 0x5a, 0xff, 0xbf, 0xff, 0x75, 0xff, 0xc8, 0xff, 0x8c, 0xff, 0xcc, 0xff, 0x9a, 0xff, 0xc9, 0xff, 0xa2, 0xff, 0xc5, 0xff, 0xa9, 0xff, 0xc5, 0xff, 0xb7, 0xff, 0xce, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0xe2, 0xff, 0xe7, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0x06, 0x00, 0xea, 0xff, 0x13, 0x00, 0xea, 0xff, 0x1d, 0x00, 0xee, 0xff, 0x21, 0x00, 0xf0, 0xff, 0x22, 0x00, 0xf0, 0xff, 0x22, 0x00, 0xf1, 0xff, 0x1f, 0x00, 0xf1, 0xff, 0x16, 0x00, 0xee, 0xff, 0x05, 0x00, 0xe4, 0xff, 0xf4, 0xff, 0xdb, 0xff, 0xeb, 0xff, 0xd8, 0xff, 0xef, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xee, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xd9, 0xff, 0xff, 0xff, 0xde, 0xff, 0x0b, 0x00, 0xeb, 0xff, 0x1f, 0x00, 0xfa, 0xff, 0x33, 0x00, 0x09, 0x00, 0x45, 0x00, 0x17, 0x00, 0x53, 0x00, 0x24, 0x00, 0x5f, 0x00, 0x34, 0x00, 0x70, 0x00, 0x48, 0x00, 0x86, 0x00, 0x5c, 0x00, 0x9f, 0x00, 0x6d, 0x00, 0xb2, 0x00, 0x79, 0x00, 0xbf, 0x00, 0x84, 0x00, 0xc8, 0x00, 0x8a, 0x00, 0xc9, 0x00, 0x8c, 0x00, 0xc5, 0x00, 0x8d, 0x00, 0xbf, 0x00, 0x8b, 0x00, 0xb9, 0x00, 0x84, 0x00, 0xad, 0x00, 0x74, 0x00, 0x98, 0x00, 0x64, 0x00, 0x82, 0x00, 0x52, 0x00, 0x6b, 0x00, 0x3c, 0x00, 0x52, 0x00, 0x25, 0x00, 0x3b, 0x00, 0x12, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x1c, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xd8, 0xff, 0xb9, 0xff, 0xc0, 0xff, 0xa1, 0xff, 0xb0, 0xff, 0x90, 0xff, 0xaa, 0xff, 0x83, 0xff, 0xa9, 0xff, 0x79, 0xff, 0xa8, 0xff, 0x78, 0xff, 0xab, 0xff, 0x7f, 0xff, 0xb3, 0xff, 0x88, 0xff, 0xba, 0xff, 0x91, 0xff, 0xc0, 0xff, 0x9b, 0xff, 0xc8, 0xff, 0xa6, 0xff, 0xd3, 0xff, 0xb5, 0xff, 0xe3, 0xff, 0xc7, 0xff, 0xf7, 0xff, 0xd5, 0xff, 0x07, 0x00, 0xda, 0xff, 0x0d, 0x00, 0xdc, 0xff, 0x0d, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xef, 0xff, 0x09, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x02, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x14, 0x00, 0xff, 0xff, 0x1d, 0x00, 0x07, 0x00, 0x24, 0x00, 0x08, 0x00, 0x26, 0x00, 0x06, 0x00, 0x2b, 0x00, 0x02, 0x00, 0x36, 0x00, 0xfd, 0xff, 0x46, 0x00, 0xf7, 0xff, 0x56, 0x00, 0xf0, 0xff, 0x62, 0x00, 0xee, 0xff, 0x6c, 0x00, 0xf6, 0xff, 0x7b, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x1b, 0x00, 0xa3, 0x00, 0x29, 0x00, 0xb1, 0x00, 0x33, 0x00, 0xbe, 0x00, 0x3b, 0x00, 0xca, 0x00, 0x3d, 0x00, 0xd1, 0x00, 0x3b, 0x00, 0xd0, 0x00, 0x3f, 0x00, 0xcc, 0x00, 0x4a, 0x00, 0xc9, 0x00, 0x56, 0x00, 0xc5, 0x00, 0x5f, 0x00, 0xbe, 0x00, 0x66, 0x00, 0xb6, 0x00, 0x6f, 0x00, 0xad, 0x00, 0x78, 0x00, 0xa0, 0x00, 0x7f, 0x00, 0x8e, 0x00, 0x87, 0x00, 0x7e, 0x00, 0x8b, 0x00, 0x6c, 0x00, 0x88, 0x00, 0x58, 0x00, 0x83, 0x00, 0x47, 0x00, 0x84, 0x00, 0x40, 0x00, 0x87, 0x00, 0x3d, 0x00, 0x89, 0x00, 0x36, 0x00, 0x8d, 0x00, 0x2e, 0x00, 0x92, 0x00, 0x26, 0x00, 0x95, 0x00, 0x1f, 0x00, 0x96, 0x00, 0x19, 0x00, 0x96, 0x00, 0x16, 0x00, 0x95, 0x00, 0x15, 0x00, 0x92, 0x00, 0x15, 0x00, 0x92, 0x00, 0x17, 0x00, 0x92, 0x00, 0x18, 0x00, 0x8d, 0x00, 0x11, 0x00, 0x84, 0x00, 0x04, 0x00, 0x7b, 0x00, 0xf7, 0xff, 0x74, 0x00, 0xee, 0xff, 0x6e, 0x00, 0xe6, 0xff, 0x67, 0x00, 0xe0, 0xff, 0x60, 0x00, 0xd9, 0xff, 0x52, 0x00, 0xcc, 0xff, 0x3f, 0x00, 0xbc, 0xff, 0x29, 0x00, 0xaa, 0xff, 0x15, 0x00, 0x99, 0xff, 0x02, 0x00, 0x86, 0xff, 0xf3, 0xff, 0x75, 0xff, 0xeb, 0xff, 0x6a, 0xff, 0xe8, 0xff, 0x64, 0xff, 0xe5, 0xff, 0x63, 0xff, 0xe2, 0xff, 0x66, 0xff, 0xdd, 0xff, 0x6a, 0xff, 0xd8, 0xff, 0x6f, 0xff, 0xd2, 0xff, 0x70, 0xff, 0xcf, 0xff, 0x6f, 0xff, 0xd3, 0xff, 0x72, 0xff, 0xda, 0xff, 0x76, 0xff, 0xe0, 0xff, 0x7b, 0xff, 0xe1, 0xff, 0x83, 0xff, 0xdc, 0xff, 0x8a, 0xff, 0xd5, 0xff, 0x92, 0xff, 0xd3, 0xff, 0x9d, 0xff, 0xd4, 0xff, 0xa7, 0xff, 0xd3, 0xff, 0xad, 0xff, 0xd3, 0xff, 0xb1, 0xff, 0xd3, 0xff, 0xb7, 0xff, 0xd2, 0xff, 0xbc, 0xff, 0xce, 0xff, 0xbf, 0xff, 0xcc, 0xff, 0xc5, 0xff, 0xce, 0xff, 0xcd, 0xff, 0xd1, 0xff, 0xd5, 0xff, 0xd7, 0xff, 0xdf, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0x02, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x40, 0x00, 0x32, 0x00, 0x4e, 0x00, 0x37, 0x00, 0x58, 0x00, 0x3a, 0x00, 0x5e, 0x00, 0x3d, 0x00, 0x63, 0x00, 0x40, 0x00, 0x67, 0x00, 0x44, 0x00, 0x68, 0x00, 0x42, 0x00, 0x63, 0x00, 0x3a, 0x00, 0x5d, 0x00, 0x31, 0x00, 0x57, 0x00, 0x27, 0x00, 0x54, 0x00, 0x20, 0x00, 0x51, 0x00, 0x19, 0x00, 0x4d, 0x00, 0x13, 0x00, 0x45, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x31, 0x00, 0xf7, 0xff, 0x2a, 0x00, 0xec, 0xff, 0x24, 0x00, 0xe1, 0xff, 0x1c, 0x00, 0xd4, 0xff, 0x18, 0x00, 0xc9, 0xff, 0x17, 0x00, 0xbf, 0xff, 0x19, 0x00, 0xb5, 0xff, 0x1c, 0x00, 0xa9, 0xff, 0x1e, 0x00, 0x9e, 0xff, 0x20, 0x00, 0x92, 0xff, 0x1e, 0x00, 0x85, 0xff, 0x1d, 0x00, 0x7d, 0xff, 0x21, 0x00, 0x7b, 0xff, 0x28, 0x00, 0x7c, 0xff, 0x31, 0x00, 0x7c, 0xff, 0x39, 0x00, 0x78, 0xff, 0x40, 0x00, 0x72, 0xff, 0x46, 0x00, 0x70, 0xff, 0x4d, 0x00, 0x74, 0xff, 0x54, 0x00, 0x7d, 0xff, 0x5b, 0x00, 0x86, 0xff, 0x5c, 0x00, 0x8c, 0xff, 0x5a, 0x00, 0x90, 0xff, 0x53, 0x00, 0x92, 0xff, 0x48, 0x00, 0x95, 0xff, 0x3b, 0x00, 0x97, 0xff, 0x2e, 0x00, 0x9d, 0xff, 0x21, 0x00, 0xa7, 0xff, 0x14, 0x00, 0xb6, 0xff, 0x04, 0x00, 0xc6, 0xff, 0xf2, 0xff, 0xd4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xd2, 0xff, 0xec, 0xff, 0xc2, 0xff, 0xf5, 0xff, 0xb3, 0xff, 0xff, 0xff, 0xa4, 0xff, 0x0c, 0x00, 0x8f, 0xff, 0x16, 0x00, 0x76, 0xff, 0x1a, 0x00, 0x5b, 0xff, 0x18, 0x00, 0x40, 0xff, 0x14, 0x00, 0x29, 0xff, 0x11, 0x00, 0x18, 0xff, 0x17, 0x00, 0x0d, 0xff, 0x22, 0x00, 0x03, 0xff, 0x2e, 0x00, 0xfa, 0xfe, 0x35, 0x00, 0xf1, 0xfe, 0x39, 0x00, 0xea, 0xfe, 0x3c, 0x00, 0xe0, 0xfe, 0x3c, 0x00, 0xda, 0xfe, 0x3c, 0x00, 0xdc, 0xfe, 0x40, 0x00, 0xe7, 0xfe, 0x4a, 0x00, 0xf6, 0xfe, 0x59, 0x00, 0x04, 0xff, 0x67, 0x00, 0x0e, 0xff, 0x72, 0x00, 0x13, 0xff, 0x76, 0x00, 0x1a, 0xff, 0x79, 0x00, 0x25, 0xff, 0x80, 0x00, 0x34, 0xff, 0x8a, 0x00, 0x44, 0xff, 0x91, 0x00, 0x56, 0xff, 0x97, 0x00, 0x6b, 0xff, 0x9c, 0x00, 0x7f, 0xff, 0x9f, 0x00, 0x8f, 0xff, 0xa2, 0x00, 0x9a, 0xff, 0xa4, 0x00, 0xa5, 0xff, 0xa7, 0x00, 0xaf, 0xff, 0xa6, 0x00, 0xba, 0xff, 0xa3, 0x00, 0xc8, 0xff, 0xa0, 0x00, 0xd8, 0xff, 0x9a, 0x00, 0xe5, 0xff, 0x90, 0x00, 0xf5, 0xff, 0x89, 0x00, 0x09, 0x00, 0x88, 0x00, 0x1f, 0x00, 0x8d, 0x00, 0x2f, 0x00, 0x8f, 0x00, 0x38, 0x00, 0x88, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x46, 0x00, 0x69, 0x00, 0x4a, 0x00, 0x50, 0x00, 0x50, 0x00, 0x37, 0x00, 0x5c, 0x00, 0x23, 0x00, 0x6b, 0x00, 0x16, 0x00, 0x7a, 0x00, 0x0d, 0x00, 0x86, 0x00, 0x04, 0x00, 0x8f, 0x00, 0xf9, 0xff, 0x97, 0x00, 0xee, 0xff, 0x9f, 0x00, 0xe1, 0xff, 0xa5, 0x00, 0xd1, 0xff, 0xa4, 0x00, 0xb9, 0xff, 0xa0, 0x00, 0x9d, 0xff, 0x9e, 0x00, 0x84, 0xff, 0x9f, 0x00, 0x73, 0xff, 0xa2, 0x00, 0x69, 0xff, 0x9e, 0x00, 0x5e, 0xff, 0x92, 0x00, 0x4f, 0xff, 0x81, 0x00, 0x3e, 0xff, 0x75, 0x00, 0x30, 0xff, 0x73, 0x00, 0x2a, 0xff, 0x7b, 0x00, 0x2c, 0xff, 0x82, 0x00, 0x2d, 0xff, 0x82, 0x00, 0x2a, 0xff, 0x80, 0x00, 0x29, 0xff, 0x81, 0x00, 0x32, 0xff, 0x83, 0x00, 0x41, 0xff, 0x81, 0x00, 0x4e, 0xff, 0x7c, 0x00, 0x59, 0xff, 0x79, 0x00, 0x62, 0xff, 0x78, 0x00, 0x6c, 0xff, 0x76, 0x00, 0x76, 0xff, 0x72, 0x00, 0x7f, 0xff, 0x6b, 0x00, 0x88, 0xff, 0x5f, 0x00, 0x92, 0xff, 0x4f, 0x00, 0x9a, 0xff, 0x3a, 0x00, 0x9d, 0xff, 0x1f, 0x00, 0x9a, 0xff, 0xfe, 0xff, 0x8f, 0xff, 0xd8, 0xff, 0x80, 0xff, 0xb2, 0xff, 0x71, 0xff, 0x90, 0xff, 0x68, 0xff, 0x78, 0xff, 0x6b, 0xff, 0x69, 0xff, 0x78, 0xff, 0x61, 0xff, 0x8c, 0xff, 0x67, 0xff, 0xab, 0xff, 0x79, 0xff, 0xd5, 0xff, 0x8a, 0xff, 0xfb, 0xff, 0x8d, 0xff, 0x13, 0x00, 0x86, 0xff, 0x20, 0x00, 0x83, 0xff, 0x30, 0x00, 0x88, 0xff, 0x46, 0x00, 0x93, 0xff, 0x60, 0x00, 0x9f, 0xff, 0x79, 0x00, 0xa8, 0xff, 0x8c, 0x00, 0xb0, 0xff, 0x9b, 0x00, 0xb8, 0xff, 0xa7, 0x00, 0xbe, 0xff, 0xb1, 0x00, 0xb9, 0xff, 0xad, 0x00, 0xaa, 0xff, 0xa0, 0x00, 0x9d, 0xff, 0x92, 0x00, 0x98, 0xff, 0x88, 0x00, 0x97, 0xff, 0x7d, 0x00, 0x91, 0xff, 0x69, 0x00, 0x86, 0xff, 0x4e, 0x00, 0x7f, 0xff, 0x37, 0x00, 0x80, 0xff, 0x29, 0x00, 0x8b, 0xff, 0x25, 0x00, 0x9d, 0xff, 0x27, 0x00, 0xb3, 0xff, 0x2d, 0x00, 0xca, 0xff, 0x34, 0x00, 0xe7, 0xff, 0x43, 0x00, 0x0b, 0x00, 0x59, 0x00, 0x2f, 0x00, 0x70, 0x00, 0x4d, 0x00, 0x81, 0x00, 0x68, 0x00, 0x90, 0x00, 0x80, 0x00, 0x9b, 0x00, 0x90, 0x00, 0x9e, 0x00, 0x95, 0x00, 0x97, 0x00, 0x93, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x7e, 0x00, 0x81, 0x00, 0x71, 0x00, 0x72, 0x00, 0x61, 0x00, 0x61, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x0a, 0x00, 0x20, 0x00, 0xea, 0xff, 0x10, 0x00, 0xd0, 0xff, 0x05, 0x00, 0xbf, 0xff, 0x03, 0x00, 0xb8, 0xff, 0x07, 0x00, 0xb8, 0xff, 0x13, 0x00, 0xbe, 0xff, 0x22, 0x00, 0xc7, 0xff, 0x37, 0x00, 0xd4, 0xff, 0x4d, 0x00, 0xe4, 0xff, 0x5e, 0x00, 0xf0, 0xff, 0x6a, 0x00, 0xfb, 0xff, 0x6e, 0x00, 0x01, 0x00, 0x71, 0x00, 0x06, 0x00, 0x70, 0x00, 0x08, 0x00, 0x69, 0x00, 0x01, 0x00, 0x59, 0x00, 0xf1, 0xff, 0x42, 0x00, 0xdc, 0xff, 0x25, 0x00, 0xc5, 0xff, 0x01, 0x00, 0xad, 0xff, 0xda, 0xff, 0x97, 0xff, 0xb3, 0xff, 0x86, 0xff, 0x90, 0xff, 0x7a, 0xff, 0x71, 0xff, 0x72, 0xff, 0x55, 0xff, 0x6b, 0xff, 0x3e, 0xff, 0x67, 0xff, 0x2b, 0xff, 0x6a, 0xff, 0x20, 0xff, 0x77, 0xff, 0x1c, 0xff, 0x8f, 0xff, 0x1d, 0xff, 0xae, 0xff, 0x22, 0xff, 0xd0, 0xff, 0x29, 0xff, 0xf0, 0xff, 0x32, 0xff, 0x0f, 0x00, 0x3d, 0xff, 0x2f, 0x00, 0x4b, 0xff, 0x50, 0x00, 0x57, 0xff, 0x6c, 0x00, 0x5f, 0xff, 0x81, 0x00, 0x65, 0xff, 0x91, 0x00, 0x68, 0xff, 0x9f, 0x00, 0x66, 0xff, 0xa6, 0x00, 0x61, 0xff, 0xa9, 0x00, 0x5a, 0xff, 0xa5, 0x00, 0x51, 0xff, 0x9a, 0x00, 0x47, 0xff, 0x8b, 0x00, 0x41, 0xff, 0x7f, 0x00, 0x42, 0xff, 0x79, 0x00, 0x4a, 0xff, 0x77, 0x00, 0x57, 0xff, 0x77, 0x00, 0x6c, 0xff, 0x7e, 0x00, 0x8a, 0xff, 0x90, 0x00, 0xaa, 0xff, 0xa7, 0x00, 0xca, 0xff, 0xc0, 0x00, 0xe8, 0xff, 0xd4, 0x00, 0x01, 0x00, 0xe0, 0x00, 0x19, 0x00, 0xe7, 0x00, 0x3d, 0x00, 0xfb, 0x00, 0x73, 0x00, 0x1f, 0x01, 0xac, 0x00, 0x47, 0x01, 0xda, 0x00, 0x64, 0x01, 0xf5, 0x00, 0x6d, 0x01, 0xfb, 0x00, 0x5f, 0x01, 0xee, 0x00, 0x38, 0x01, 0xdd, 0x00, 0x09, 0x01, 0xd1, 0x00, 0xdb, 0x00, 0xc6, 0x00, 0xac, 0x00, 0xb7, 0x00, 0x7c, 0x00, 0xac, 0x00, 0x52, 0x00, 0xab, 0x00, 0x31, 0x00, 0xb4, 0x00, 0x1b, 0x00, 0xc3, 0x00, 0x07, 0x00, 0xca, 0x00, 0xe9, 0xff, 0xbe, 0x00, 0xb8, 0xff, 0xac, 0x00, 0x81, 0xff, 0xaf, 0x00, 0x64, 0xff, 0xd4, 0x00, 0x6c, 0xff, 0x07, 0x01, 0x87, 0xff, 0x2e, 0x01, 0x99, 0xff, 0x3d, 0x01, 0x93, 0xff, 0x3c, 0x01, 0x7f, 0xff, 0x3b, 0x01, 0x70, 0xff, 0x44, 0x01, 0x70, 0xff, 0x51, 0x01, 0x7b, 0xff, 0x54, 0x01, 0x83, 0xff, 0x45, 0x01, 0x7d, 0xff, 0x27, 0x01, 0x6a, 0xff, 0x01, 0x01, 0x4f, 0xff, 0xdb, 0x00, 0x34, 0xff, 0xb4, 0x00, 0x1c, 0xff, 0x8c, 0x00, 0x08, 0xff, 0x65, 0x00, 0xfb, 0xfe, 0x39, 0x00, 0xed, 0xfe, 0x0b, 0x00, 0xdd, 0xfe, 0xe5, 0xff, 0xd2, 0xfe, 0xcf, 0xff, 0xd1, 0xfe, 0xc9, 0xff, 0xda, 0xfe, 0xc7, 0xff, 0xe6, 0xfe, 0xc5, 0xff, 0xf3, 0xfe, 0xc6, 0xff, 0x07, 0xff, 0xcb, 0xff, 0x26, 0xff, 0xd7, 0xff, 0x51, 0xff, 0xe6, 0xff, 0x7c, 0xff, 0xf1, 0xff, 0xa0, 0xff, 0xf9, 0xff, 0xba, 0xff, 0xf8, 0xff, 0xca, 0xff, 0xf1, 0xff, 0xd2, 0xff, 0xe7, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe9, 0xff, 0xc9, 0xff, 0xf2, 0xff, 0xad, 0xff, 0xf0, 0xff, 0x84, 0xff, 0xe0, 0xff, 0x57, 0xff, 0xc8, 0xff, 0x2b, 0xff, 0xae, 0xff, 0x06, 0xff, 0x9a, 0xff, 0xef, 0xfe, 0x94, 0xff, 0xde, 0xfe, 0x97, 0xff, 0xd4, 0xfe, 0xa2, 0xff, 0xd3, 0xfe, 0xb7, 0xff, 0xdd, 0xfe, 0xd5, 0xff, 0xef, 0xfe, 0xf8, 0xff, 0x09, 0xff, 0x1e, 0x00, 0x2e, 0xff, 0x4b, 0x00, 0x59, 0xff, 0x7e, 0x00, 0x82, 0xff, 0xae, 0x00, 0xa3, 0xff, 0xd4, 0x00, 0xbb, 0xff, 0xee, 0x00, 0xcc, 0xff, 0xfd, 0x00, 0xd7, 0xff, 0x03, 0x01, 0xdc, 0xff, 0x01, 0x01, 0xda, 0xff, 0xf7, 0x00, 0xd4, 0xff, 0xe9, 0x00, 0xca, 0xff, 0xd4, 0x00, 0xbc, 0xff, 0xb8, 0x00, 0xae, 0xff, 0x97, 0x00, 0xa0, 0xff, 0x71, 0x00, 0x97, 0xff, 0x4b, 0x00, 0x95, 0xff, 0x2a, 0x00, 0xa2, 0xff, 0x18, 0x00, 0xbc, 0xff, 0x16, 0x00, 0xd9, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x42, 0x00, 0x20, 0x00, 0x6b, 0x00, 0x24, 0x00, 0x97, 0x00, 0x2b, 0x00, 0xc0, 0x00, 0x35, 0x00, 0xdd, 0x00, 0x3a, 0x00, 0xec, 0x00, 0x34, 0x00, 0xf4, 0x00, 0x2c, 0x00, 0xf6, 0x00, 0x1f, 0x00, 0xec, 0x00, 0x07, 0x00, 0xdc, 0x00, 0xec, 0xff, 0xc9, 0x00, 0xcf, 0xff, 0xaf, 0x00, 0xb0, 0xff, 0x8f, 0x00, 0x8f, 0xff, 0x71, 0x00, 0x74, 0xff, 0x55, 0x00, 0x5d, 0xff, 0x37, 0x00, 0x46, 0xff, 0x20, 0x00, 0x32, 0xff, 0x17, 0x00, 0x2b, 0xff, 0x13, 0x00, 0x2a, 0xff, 0x0e, 0x00, 0x2c, 0xff, 0x0e, 0x00, 0x3a, 0xff, 0x10, 0x00, 0x4d, 0xff, 0x0e, 0x00, 0x5c, 0xff, 0x0d, 0x00, 0x68, 0xff, 0x16, 0x00, 0x7b, 0xff, 0x1c, 0x00, 0x8b, 0xff, 0x18, 0x00, 0x92, 0xff, 0x16, 0x00, 0x9c, 0xff, 0x11, 0x00, 0xa4, 0xff, 0xfd, 0xff, 0x9a, 0xff, 0xdf, 0xff, 0x86, 0xff, 0xce, 0xff, 0x7c, 0xff, 0xc5, 0xff, 0x7c, 0xff, 0xb6, 0xff, 0x75, 0xff, 0xa1, 0xff, 0x69, 0xff, 0x8e, 0xff, 0x5f, 0xff, 0x80, 0xff, 0x5b, 0xff, 0x7d, 0xff, 0x65, 0xff, 0x89, 0xff, 0x80, 0xff, 0x92, 0xff, 0x99, 0xff, 0x90, 0xff, 0xa5, 0xff, 0x96, 0xff, 0xb8, 0xff, 0xac, 0xff, 0xdc, 0xff, 0xbe, 0xff, 0xfc, 0xff, 0xc7, 0xff, 0x15, 0x00, 0xce, 0xff, 0x2b, 0x00, 0xcb, 0xff, 0x36, 0x00, 0xbd, 0xff, 0x33, 0x00, 0xaf, 0xff, 0x31, 0x00, 0xa4, 0xff, 0x33, 0x00, 0x92, 0xff, 0x31, 0x00, 0x89, 0xff, 0x3a, 0x00, 0x97, 0xff, 0x5a, 0x00, 0x98, 0xff, 0x6b, 0x00, 0x7e, 0xff, 0x59, 0x00, 0x77, 0xff, 0x55, 0x00, 0xa0, 0xff, 0x7a, 0x00, 0xc8, 0xff, 0x9c, 0x00, 0xca, 0xff, 0x96, 0x00, 0xc4, 0xff, 0x88, 0x00, 0xcb, 0xff, 0x87, 0x00, 0xdf, 0xff, 0x8e, 0x00, 0x03, 0x00, 0xa1, 0x00, 0x2b, 0x00, 0xb3, 0x00, 0x35, 0x00, 0xa2, 0x00, 0x23, 0x00, 0x78, 0x00, 0x28, 0x00, 0x64, 0x00, 0x45, 0x00, 0x6b, 0x00, 0x4d, 0x00, 0x60, 0x00, 0x44, 0x00, 0x45, 0x00, 0x48, 0x00, 0x36, 0x00, 0x52, 0x00, 0x2d, 0x00, 0x55, 0x00, 0x1d, 0x00, 0x61, 0x00, 0x19, 0x00, 0x72, 0x00, 0x21, 0x00, 0x73, 0x00, 0x1e, 0x00, 0x72, 0x00, 0x1c, 0x00, 0x84, 0x00, 0x2e, 0x00, 0x9a, 0x00, 0x40, 0x00, 0xa4, 0x00, 0x42, 0x00, 0xb2, 0x00, 0x46, 0x00, 0xc5, 0x00, 0x53, 0x00, 0xcb, 0x00, 0x56, 0x00, 0xc3, 0x00, 0x4f, 0x00, 0xbc, 0x00, 0x4a, 0x00, 0xad, 0x00, 0x3a, 0x00, 0x93, 0x00, 0x1b, 0x00, 0x7f, 0x00, 0xfc, 0xff, 0x6d, 0x00, 0xdd, 0xff, 0x4b, 0x00, 0xae, 0xff, 0x2a, 0x00, 0x83, 0xff, 0x1c, 0x00, 0x6f, 0xff, 0x0f, 0x00, 0x5c, 0xff, 0xf4, 0xff, 0x3d, 0xff, 0xe4, 0xff, 0x2a, 0xff, 0xe9, 0xff, 0x2f, 0xff, 0xec, 0xff, 0x35, 0xff, 0xe5, 0xff, 0x32, 0xff, 0xe1, 0xff, 0x35, 0xff, 0xe1, 0xff, 0x3e, 0xff, 0xde, 0xff, 0x47, 0xff, 0xdd, 0xff, 0x53, 0xff, 0xdf, 0xff, 0x63, 0xff, 0xd8, 0xff, 0x6b, 0xff, 0xcc, 0xff, 0x70, 0xff, 0xc3, 0xff, 0x78, 0xff, 0xb5, 0xff, 0x7d, 0xff, 0x9d, 0xff, 0x7b, 0xff, 0x8a, 0xff, 0x7d, 0xff, 0x7b, 0xff, 0x81, 0xff, 0x6c, 0xff, 0x81, 0xff, 0x63, 0xff, 0x86, 0xff, 0x61, 0xff, 0x93, 0xff, 0x5c, 0xff, 0xa1, 0xff, 0x54, 0xff, 0xaf, 0xff, 0x5b, 0xff, 0xce, 0xff, 0x6e, 0xff, 0xf9, 0xff, 0x7f, 0xff, 0x1e, 0x00, 0x90, 0xff, 0x40, 0x00, 0xa8, 0xff, 0x65, 0x00, 0xba, 0xff, 0x83, 0x00, 0xc4, 0xff, 0x99, 0x00, 0xd4, 0xff, 0xb5, 0x00, 0xe6, 0xff, 0xd3, 0x00, 0xe5, 0xff, 0xe0, 0x00, 0xd5, 0xff, 0xde, 0x00, 0xce, 0xff, 0xe1, 0x00, 0xcf, 0xff, 0xe9, 0x00, 0xc9, 0xff, 0xe9, 0x00, 0xb8, 0xff, 0xdb, 0x00, 0xa1, 0xff, 0xc5, 0x00, 0x8f, 0xff, 0xb6, 0x00, 0x8e, 0xff, 0xba, 0x00, 0x9c, 0xff, 0xcd, 0x00, 0xa8, 0xff, 0xde, 0x00, 0xab, 0xff, 0xe2, 0x00, 0xae, 0xff, 0xe5, 0x00, 0xbb, 0xff, 0xef, 0x00, 0xcf, 0xff, 0xff, 0x00, 0xe8, 0xff, 0x12, 0x01, 0x02, 0x00, 0x23, 0x01, 0x16, 0x00, 0x2a, 0x01, 0x25, 0x00, 0x2c, 0x01, 0x37, 0x00, 0x30, 0x01, 0x47, 0x00, 0x34, 0x01, 0x4f, 0x00, 0x2d, 0x01, 0x54, 0x00, 0x22, 0x01, 0x62, 0x00, 0x1c, 0x01, 0x74, 0x00, 0x19, 0x01, 0x80, 0x00, 0x0e, 0x01, 0x82, 0x00, 0xfa, 0x00, 0x7f, 0x00, 0xde, 0x00, 0x77, 0x00, 0xbb, 0x00, 0x75, 0x00, 0x9b, 0x00, 0x7a, 0x00, 0x84, 0x00, 0x7f, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x5c, 0x00, 0x77, 0x00, 0x49, 0x00, 0x76, 0x00, 0x3c, 0x00, 0x73, 0x00, 0x2c, 0x00, 0x6b, 0x00, 0x17, 0x00, 0x64, 0x00, 0x02, 0x00, 0x60, 0x00, 0xf2, 0xff, 0x58, 0x00, 0xdf, 0xff, 0x4d, 0x00, 0xc6, 0xff, 0x42, 0x00, 0xae, 0xff, 0x37, 0x00, 0x96, 0xff, 0x29, 0x00, 0x7a, 0xff, 0x14, 0x00, 0x5a, 0xff, 0xff, 0xff, 0x3a, 0xff, 0xef, 0xff, 0x1e, 0xff, 0xe6, 0xff, 0x07, 0xff, 0xe6, 0xff, 0xfa, 0xfe, 0xec, 0xff, 0xf4, 0xfe, 0xf0, 0xff, 0xf3, 0xfe, 0xef, 0xff, 0xef, 0xfe, 0xe8, 0xff, 0xea, 0xfe, 0xe1, 0xff, 0xe7, 0xfe, 0xdb, 0xff, 0xe9, 0xfe, 0xdb, 0xff, 0xf0, 0xfe, 0xde, 0xff, 0xfa, 0xfe, 0xe2, 0xff, 0x05, 0xff, 0xe5, 0xff, 0x0e, 0xff, 0xe5, 0xff, 0x16, 0xff, 0xe0, 0xff, 0x1c, 0xff, 0xda, 0xff, 0x21, 0xff, 0xd6, 0xff, 0x2a, 0xff, 0xd1, 0xff, 0x33, 0xff, 0xcf, 0xff, 0x40, 0xff, 0xd2, 0xff, 0x54, 0xff, 0xd6, 0xff, 0x6e, 0xff, 0xd7, 0xff, 0x82, 0xff, 0xd0, 0xff, 0x8c, 0xff, 0xca, 0xff, 0x91, 0xff, 0xc8, 0xff, 0x98, 0xff, 0xc7, 0xff, 0xa2, 0xff, 0xc2, 0xff, 0xae, 0xff, 0xb9, 0xff, 0xba, 0xff, 0xaa, 0xff, 0xc3, 0xff, 0x9c, 0xff, 0xca, 0xff, 0x96, 0xff, 0xd5, 0xff, 0x95, 0xff, 0xe1, 0xff, 0x94, 0xff, 0xe9, 0xff, 0x94, 0xff, 0xef, 0xff, 0x98, 0xff, 0xfc, 0xff, 0x9e, 0xff, 0x0e, 0x00, 0xa6, 0xff, 0x25, 0x00, 0xad, 0xff, 0x38, 0x00, 0xb5, 0xff, 0x47, 0x00, 0xc0, 0xff, 0x54, 0x00, 0xd4, 0xff, 0x66, 0x00, 0xf0, 0xff, 0x82, 0x00, 0x08, 0x00, 0x98, 0x00, 0x16, 0x00, 0xa5, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x3b, 0x00, 0xbc, 0x00, 0x4c, 0x00, 0xc4, 0x00, 0x5c, 0x00, 0xca, 0x00, 0x6a, 0x00, 0xce, 0x00, 0x74, 0x00, 0xce, 0x00, 0x7b, 0x00, 0xcb, 0x00, 0x80, 0x00, 0xc6, 0x00, 0x83, 0x00, 0xbc, 0x00, 0x77, 0x00, 0xa1, 0x00, 0x60, 0x00, 0x78, 0x00, 0x4b, 0x00, 0x51, 0x00, 0x46, 0x00, 0x3c, 0x00, 0x53, 0x00, 0x3e, 0x00, 0x6c, 0x00, 0x50, 0x00, 0x82, 0x00, 0x61, 0x00, 0x8c, 0x00, 0x62, 0x00, 0x8a, 0x00, 0x53, 0x00, 0x7d, 0x00, 0x36, 0x00, 0x65, 0x00, 0x10, 0x00, 0x4a, 0x00, 0xe9, 0xff, 0x30, 0x00, 0xcb, 0xff, 0x16, 0x00, 0xb1, 0xff, 0x03, 0x00, 0xa0, 0xff, 0x04, 0x00, 0xa4, 0xff, 0x13, 0x00, 0xb4, 0xff, 0x1a, 0x00, 0xbb, 0xff, 0x0d, 0x00, 0xaf, 0xff, 0xf0, 0xff, 0x98, 0xff, 0xcf, 0xff, 0x80, 0xff, 0xb6, 0xff, 0x72, 0xff, 0xb2, 0xff, 0x78, 0xff, 0xbd, 0xff, 0x88, 0xff, 0xc3, 0xff, 0x8e, 0xff, 0xc1, 0xff, 0x87, 0xff, 0xc0, 0xff, 0x7f, 0xff, 0xc0, 0xff, 0x7b, 0xff, 0xbd, 0xff, 0x76, 0xff, 0xbb, 0xff, 0x75, 0xff, 0xbf, 0xff, 0x7a, 0xff, 0xc1, 0xff, 0x79, 0xff, 0xbb, 0xff, 0x6d, 0xff, 0xb9, 0xff, 0x62, 0xff, 0xbe, 0xff, 0x5e, 0xff, 0xc5, 0xff, 0x61, 0xff, 0xca, 0xff, 0x66, 0xff, 0xcb, 0xff, 0x69, 0xff, 0xc3, 0xff, 0x65, 0xff, 0xb3, 0xff, 0x58, 0xff, 0xa6, 0xff, 0x4c, 0xff, 0x9f, 0xff, 0x48, 0xff, 0xa0, 0xff, 0x4e, 0xff, 0xa8, 0xff, 0x60, 0xff, 0xb3, 0xff, 0x79, 0xff, 0xbf, 0xff, 0x9a, 0xff, 0xd0, 0xff, 0xc1, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xfd, 0xff, 0x15, 0x00, 0x09, 0x00, 0x34, 0x00, 0x0d, 0x00, 0x4c, 0x00, 0x15, 0x00, 0x69, 0x00, 0x1f, 0x00, 0x89, 0x00, 0x24, 0x00, 0xa2, 0x00, 0x22, 0x00, 0xad, 0x00, 0x20, 0x00, 0xb2, 0x00, 0x23, 0x00, 0xb9, 0x00, 0x26, 0x00, 0xbf, 0x00, 0x24, 0x00, 0xc3, 0x00, 0x1e, 0x00, 0xc6, 0x00, 0x14, 0x00, 0xc7, 0x00, 0x0a, 0x00, 0xc7, 0x00, 0x08, 0x00, 0xcb, 0x00, 0x10, 0x00, 0xd3, 0x00, 0x17, 0x00, 0xd6, 0x00, 0x1c, 0x00, 0xd4, 0x00, 0x23, 0x00, 0xd6, 0x00, 0x29, 0x00, 0xda, 0x00, 0x29, 0x00, 0xda, 0x00, 0x29, 0x00, 0xda, 0x00, 0x2d, 0x00, 0xdd, 0x00, 0x2f, 0x00, 0xdb, 0x00, 0x2b, 0x00, 0xcd, 0x00, 0x27, 0x00, 0xbe, 0x00, 0x23, 0x00, 0xae, 0x00, 0x17, 0x00, 0x98, 0x00, 0x08, 0x00, 0x7f, 0x00, 0xfc, 0xff, 0x6b, 0x00, 0xf5, 0xff, 0x57, 0x00, 0xeb, 0xff, 0x3e, 0x00, 0xe4, 0xff, 0x23, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x03, 0x00, 0xe6, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xea, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xdb, 0xff, 0xd6, 0xff, 0xd1, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xbe, 0xff, 0xc1, 0xff, 0xb2, 0xff, 0xb7, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0x98, 0xff, 0xb0, 0xff, 0x91, 0xff, 0xae, 0xff, 0x89, 0xff, 0xa5, 0xff, 0x7b, 0xff, 0x97, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x53, 0xff, 0x80, 0xff, 0x3d, 0xff, 0x78, 0xff, 0x26, 0xff, 0x73, 0xff, 0x10, 0xff, 0x74, 0xff, 0xfd, 0xfe, 0x7c, 0xff, 0xf1, 0xfe, 0x84, 0xff, 0xe8, 0xfe, 0x8a, 0xff, 0xe2, 0xfe, 0x8e, 0xff, 0xe1, 0xfe, 0x95, 0xff, 0xe8, 0xfe, 0xa5, 0xff, 0xf8, 0xfe, 0xba, 0xff, 0x0d, 0xff, 0xd2, 0xff, 0x23, 0xff, 0xe8, 0xff, 0x37, 0xff, 0xf9, 0xff, 0x4b, 0xff, 0x06, 0x00, 0x5d, 0xff, 0x0d, 0x00, 0x6e, 0xff, 0x12, 0x00, 0x7e, 0xff, 0x15, 0x00, 0x8c, 0xff, 0x12, 0x00, 0x92, 0xff, 0x0a, 0x00, 0x92, 0xff, 0x02, 0x00, 0x94, 0xff, 0xff, 0xff, 0x9a, 0xff, 0xfc, 0xff, 0xa2, 0xff, 0xfd, 0xff, 0xae, 0xff, 0x02, 0x00, 0xbc, 0xff, 0x0a, 0x00, 0xcd, 0xff, 0x17, 0x00, 0xe1, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x31, 0x00, 0x0b, 0x00, 0x3f, 0x00, 0x22, 0x00, 0x51, 0x00, 0x3a, 0x00, 0x66, 0x00, 0x53, 0x00, 0x80, 0x00, 0x69, 0x00, 0x9c, 0x00, 0x7d, 0x00, 0xba, 0x00, 0x91, 0x00, 0xd3, 0x00, 0xa1, 0x00, 0xe3, 0x00, 0xab, 0x00, 0xeb, 0x00, 0xb3, 0x00, 0xf2, 0x00, 0xb9, 0x00, 0xf9, 0x00, 0xc0, 0x00, 0x05, 0x01, 0xca, 0x00, 0x13, 0x01, 0xd1, 0x00, 0x1f, 0x01, 0xd2, 0x00, 0x2c, 0x01, 0xd1, 0x00, 0x38, 0x01, 0xcf, 0x00, 0x3f, 0x01, 0xcd, 0x00, 0x3c, 0x01, 0xc3, 0x00, 0x30, 0x01, 0xb2, 0x00, 0x25, 0x01, 0xa0, 0x00, 0x1c, 0x01, 0x91, 0x00, 0x13, 0x01, 0x84, 0x00, 0x0a, 0x01, 0x77, 0x00, 0xfc, 0x00, 0x68, 0x00, 0xeb, 0x00, 0x55, 0x00, 0xd6, 0x00, 0x3f, 0x00, 0xbf, 0x00, 0x2a, 0x00, 0xa8, 0x00, 0x18, 0x00, 0x8f, 0x00, 0x09, 0x00, 0x72, 0x00, 0xfb, 0xff, 0x53, 0x00, 0xec, 0xff, 0x35, 0x00, 0xdc, 0xff, 0x19, 0x00, 0xca, 0xff, 0x00, 0x00, 0xb6, 0xff, 0xe8, 0xff, 0xa0, 0xff, 0xcd, 0xff, 0x8a, 0xff, 0xb1, 0xff, 0x78, 0xff, 0x96, 0xff, 0x6d, 0xff, 0x7d, 0xff, 0x66, 0xff, 0x67, 0xff, 0x63, 0xff, 0x58, 0xff, 0x61, 0xff, 0x53, 0xff, 0x64, 0xff, 0x57, 0xff, 0x67, 0xff, 0x5d, 0xff, 0x6b, 0xff, 0x63, 0xff, 0x6f, 0xff, 0x65, 0xff, 0x75, 0xff, 0x62, 0xff, 0x7d, 0xff, 0x5f, 0xff, 0x87, 0xff, 0x5c, 0xff, 0x8e, 0xff, 0x5b, 0xff, 0x90, 0xff, 0x59, 0xff, 0x8b, 0xff, 0x56, 0xff, 0x85, 0xff, 0x53, 0xff, 0x7f, 0xff, 0x4e, 0xff, 0x7d, 0xff, 0x47, 0xff, 0x7f, 0xff, 0x40, 0xff, 0x81, 0xff, 0x39, 0xff, 0x82, 0xff, 0x33, 0xff, 0x81, 0xff, 0x2f, 0xff, 0x7f, 0xff, 0x31, 0xff, 0x7f, 0xff, 0x3b, 0xff, 0x86, 0xff, 0x4b, 0xff, 0x93, 0xff, 0x5b, 0xff, 0xa0, 0xff, 0x6d, 0xff, 0xb0, 0xff, 0x81, 0xff, 0xc2, 0xff, 0x96, 0xff, 0xd8, 0xff, 0xac, 0xff, 0xf0, 0xff, 0xbf, 0xff, 0x05, 0x00, 0xcf, 0xff, 0x15, 0x00, 0xdf, 0xff, 0x20, 0x00, 0xef, 0xff, 0x2a, 0x00, 0xfd, 0xff, 0x31, 0x00, 0x09, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x1c, 0x00, 0x44, 0x00, 0x23, 0x00, 0x4d, 0x00, 0x2a, 0x00, 0x59, 0x00, 0x31, 0x00, 0x67, 0x00, 0x36, 0x00, 0x71, 0x00, 0x3e, 0x00, 0x77, 0x00, 0x4b, 0x00, 0x7a, 0x00, 0x5c, 0x00, 0x7f, 0x00, 0x6f, 0x00, 0x88, 0x00, 0x7d, 0x00, 0x92, 0x00, 0x85, 0x00, 0x9b, 0x00, 0x8a, 0x00, 0xa2, 0x00, 0x8d, 0x00, 0xa2, 0x00, 0x90, 0x00, 0x9d, 0x00, 0x93, 0x00, 0x94, 0x00, 0x99, 0x00, 0x8c, 0x00, 0xa0, 0x00, 0x87, 0x00, 0xa6, 0x00, 0x84, 0x00, 0xa4, 0x00, 0x7d, 0x00, 0x9d, 0x00, 0x74, 0x00, 0x96, 0x00, 0x6c, 0x00, 0x8f, 0x00, 0x61, 0x00, 0x8a, 0x00, 0x55, 0x00, 0x83, 0x00, 0x47, 0x00, 0x7c, 0x00, 0x3a, 0x00, 0x71, 0x00, 0x2d, 0x00, 0x63, 0x00, 0x22, 0x00, 0x54, 0x00, 0x1b, 0x00, 0x45, 0x00, 0x15, 0x00, 0x38, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x12, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xf9, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0xd8, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xbd, 0xff, 0xf2, 0xff, 0xab, 0xff, 0xe6, 0xff, 0x96, 0xff, 0xdb, 0xff, 0x7e, 0xff, 0xd3, 0xff, 0x64, 0xff, 0xce, 0xff, 0x4a, 0xff, 0xc9, 0xff, 0x35, 0xff, 0xc2, 0xff, 0x25, 0xff, 0xba, 0xff, 0x19, 0xff, 0xb3, 0xff, 0x0e, 0xff, 0xae, 0xff, 0x04, 0xff, 0xab, 0xff, 0xfa, 0xfe, 0xac, 0xff, 0xf2, 0xfe, 0xae, 0xff, 0xf0, 0xfe, 0xb4, 0xff, 0xf4, 0xfe, 0xbc, 0xff, 0xfc, 0xfe, 0xc4, 0xff, 0x06, 0xff, 0xca, 0xff, 0x0e, 0xff, 0xcf, 0xff, 0x14, 0xff, 0xd8, 0xff, 0x18, 0xff, 0xe3, 0xff, 0x1c, 0xff, 0xf0, 0xff, 0x23, 0xff, 0xfc, 0xff, 0x30, 0xff, 0x08, 0x00, 0x43, 0xff, 0x13, 0x00, 0x56, 0xff, 0x1a, 0x00, 0x69, 0xff, 0x23, 0x00, 0x7c, 0xff, 0x2d, 0x00, 0x8e, 0xff, 0x3c, 0x00, 0xa2, 0xff, 0x4c, 0x00, 0xb6, 0xff, 0x5b, 0x00, 0xcd, 0xff, 0x69, 0x00, 0xe4, 0xff, 0x75, 0x00, 0xfc, 0xff, 0x7d, 0x00, 0x11, 0x00, 0x85, 0x00, 0x22, 0x00, 0x8f, 0x00, 0x2e, 0x00, 0x98, 0x00, 0x35, 0x00, 0xa0, 0x00, 0x3a, 0x00, 0xa5, 0x00, 0x40, 0x00, 0xa6, 0x00, 0x4a, 0x00, 0xa6, 0x00, 0x57, 0x00, 0xa4, 0x00, 0x63, 0x00, 0xa0, 0x00, 0x6d, 0x00, 0x9e, 0x00, 0x75, 0x00, 0x9e, 0x00, 0x7c, 0x00, 0xa0, 0x00, 0x82, 0x00, 0xa1, 0x00, 0x89, 0x00, 0x9f, 0x00, 0x90, 0x00, 0x9a, 0x00, 0x97, 0x00, 0x93, 0x00, 0x9e, 0x00, 0x8c, 0x00, 0xa5, 0x00, 0x87, 0x00, 0xac, 0x00, 0x83, 0x00, 0xb1, 0x00, 0x7e, 0x00, 0xb4, 0x00, 0x79, 0x00, 0xb5, 0x00, 0x71, 0x00, 0xb5, 0x00, 0x68, 0x00, 0xb4, 0x00, 0x5e, 0x00, 0xaf, 0x00, 0x54, 0x00, 0xa7, 0x00, 0x4c, 0x00, 0x9a, 0x00, 0x46, 0x00, 0x8f, 0x00, 0x41, 0x00, 0x82, 0x00, 0x3b, 0x00, 0x73, 0x00, 0x2f, 0x00, 0x63, 0x00, 0x22, 0x00, 0x53, 0x00, 0x15, 0x00, 0x43, 0x00, 0x0d, 0x00, 0x32, 0x00, 0x05, 0x00, 0x1f, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xf1, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf2, 0xff, 0xdf, 0xff, 0xf1, 0xff, 0xdd, 0xff, 0xec, 0xff, 0xd8, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xdc, 0xff, 0xc6, 0xff, 0xd1, 0xff, 0xb9, 0xff, 0xc5, 0xff, 0xa9, 0xff, 0xb9, 0xff, 0x9a, 0xff, 0xac, 0xff, 0x8c, 0xff, 0x9f, 0xff, 0x82, 0xff, 0x94, 0xff, 0x7c, 0xff, 0x8a, 0xff, 0x78, 0xff, 0x83, 0xff, 0x74, 0xff, 0x7d, 0xff, 0x6c, 0xff, 0x79, 0xff, 0x61, 0xff, 0x74, 0xff, 0x55, 0xff, 0x6f, 0xff, 0x49, 0xff, 0x6e, 0xff, 0x44, 0xff, 0x70, 0xff, 0x45, 0xff, 0x70, 0xff, 0x45, 0xff, 0x72, 0xff, 0x43, 0xff, 0x77, 0xff, 0x3f, 0xff, 0x80, 0xff, 0x3a, 0xff, 0x89, 0xff, 0x31, 0xff, 0x90, 0xff, 0x27, 0xff, 0x98, 0xff, 0x22, 0xff, 0xa0, 0xff, 0x22, 0xff, 0xa9, 0xff, 0x24, 0xff, 0xb3, 0xff, 0x26, 0xff, 0xbc, 0xff, 0x25, 0xff, 0xc8, 0xff, 0x25, 0xff, 0xd6, 0xff, 0x27, 0xff, 0xe7, 0xff, 0x2f, 0xff, 0xfb, 0xff, 0x3e, 0xff, 0x12, 0x00, 0x52, 0xff, 0x2a, 0x00, 0x6b, 0xff, 0x41, 0x00, 0x85, 0xff, 0x56, 0x00, 0x9c, 0xff, 0x6b, 0x00, 0xb2, 0xff, 0x7d, 0x00, 0xc5, 0xff, 0x8c, 0x00, 0xd5, 0xff, 0x95, 0x00, 0xe5, 0xff, 0x97, 0x00, 0xf5, 0xff, 0x96, 0x00, 0x04, 0x00, 0x94, 0x00, 0x10, 0x00, 0x93, 0x00, 0x18, 0x00, 0x95, 0x00, 0x1d, 0x00, 0x95, 0x00, 0x21, 0x00, 0x95, 0x00, 0x25, 0x00, 0x95, 0x00, 0x2b, 0x00, 0x98, 0x00, 0x36, 0x00, 0x9a, 0x00, 0x43, 0x00, 0x9c, 0x00, 0x51, 0x00, 0x9c, 0x00, 0x5c, 0x00, 0x9a, 0x00, 0x63, 0x00, 0x98, 0x00, 0x65, 0x00, 0x97, 0x00, 0x63, 0x00, 0x92, 0x00, 0x5b, 0x00, 0x86, 0x00, 0x4f, 0x00, 0x78, 0x00, 0x44, 0x00, 0x69, 0x00, 0x3b, 0x00, 0x59, 0x00, 0x32, 0x00, 0x47, 0x00, 0x27, 0x00, 0x36, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x19, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xe9, 0xff, 0xfd, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xcc, 0xff, 0xf3, 0xff, 0xcd, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xfe, 0xff, 0xe3, 0xff, 0x01, 0x00, 0xea, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0xee, 0xff, 0x00, 0x00, 0xdd, 0xff, 0xfb, 0xff, 0xce, 0xff, 0xf7, 0xff, 0xc3, 0xff, 0xf6, 0xff, 0xbb, 0xff, 0xf8, 0xff, 0xaf, 0xff, 0xf9, 0xff, 0x9d, 0xff, 0xf6, 0xff, 0x88, 0xff, 0xf0, 0xff, 0x71, 0xff, 0xe4, 0xff, 0x5a, 0xff, 0xd2, 0xff, 0x46, 0xff, 0xbe, 0xff, 0x37, 0xff, 0xa9, 0xff, 0x2b, 0xff, 0x95, 0xff, 0x22, 0xff, 0x84, 0xff, 0x1e, 0xff, 0x78, 0xff, 0x1d, 0xff, 0x70, 0xff, 0x20, 0xff, 0x6c, 0xff, 0x2a, 0xff, 0x6c, 0xff, 0x3c, 0xff, 0x6e, 0xff, 0x4f, 0xff, 0x6f, 0xff, 0x5d, 0xff, 0x6a, 0xff, 0x67, 0xff, 0x66, 0xff, 0x71, 0xff, 0x69, 0xff, 0x7a, 0xff, 0x71, 0xff, 0x85, 0xff, 0x7e, 0xff, 0x92, 0xff, 0x90, 0xff, 0xa3, 0xff, 0xa5, 0xff, 0xb6, 0xff, 0xbd, 0xff, 0xc8, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xeb, 0xff, 0xde, 0xff, 0xfc, 0xff, 0xe1, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x13, 0x00, 0xea, 0xff, 0x1c, 0x00, 0xf5, 0xff, 0x28, 0x00, 0x0a, 0x00, 0x3d, 0x00, 0x27, 0x00, 0x59, 0x00, 0x41, 0x00, 0x70, 0x00, 0x52, 0x00, 0x7e, 0x00, 0x60, 0x00, 0x89, 0x00, 0x67, 0x00, 0x8d, 0x00, 0x6d, 0x00, 0x8e, 0x00, 0x72, 0x00, 0x8d, 0x00, 0x79, 0x00, 0x8a, 0x00, 0x7c, 0x00, 0x87, 0x00, 0x7b, 0x00, 0x86, 0x00, 0x79, 0x00, 0x8a, 0x00, 0x70, 0x00, 0x8d, 0x00, 0x64, 0x00, 0x8e, 0x00, 0x5c, 0x00, 0x91, 0x00, 0x52, 0x00, 0x92, 0x00, 0x46, 0x00, 0x90, 0x00, 0x3e, 0x00, 0x92, 0x00, 0x3e, 0x00, 0x9f, 0x00, 0x46, 0x00, 0xb5, 0x00, 0x51, 0x00, 0xce, 0x00, 0x55, 0x00, 0xdd, 0x00, 0x50, 0x00, 0xe1, 0x00, 0x43, 0x00, 0xda, 0x00, 0x32, 0x00, 0xce, 0x00, 0x24, 0x00, 0xc5, 0x00, 0x1a, 0x00, 0xbf, 0x00, 0x14, 0x00, 0xbc, 0x00, 0x15, 0x00, 0xbf, 0x00, 0x22, 0x00, 0xcd, 0x00, 0x30, 0x00, 0xdc, 0x00, 0x37, 0x00, 0xe3, 0x00, 0x2e, 0x00, 0xdc, 0x00, 0x12, 0x00, 0xc6, 0x00, 0xed, 0xff, 0xa9, 0x00, 0xcd, 0xff, 0x94, 0x00, 0xbb, 0xff, 0x89, 0x00, 0xb7, 0xff, 0x86, 0x00, 0xbe, 0xff, 0x88, 0x00, 0xca, 0xff, 0x8a, 0x00, 0xd3, 0xff, 0x88, 0x00, 0xd7, 0xff, 0x81, 0x00, 0xd4, 0xff, 0x76, 0x00, 0xc9, 0xff, 0x61, 0x00, 0xb6, 0xff, 0x40, 0x00, 0xa2, 0xff, 0x18, 0x00, 0x96, 0xff, 0xf2, 0xff, 0x95, 0xff, 0xd5, 0xff, 0x9f, 0xff, 0xc6, 0xff, 0xb1, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xd5, 0xff, 0xc5, 0xff, 0xe0, 0xff, 0xc3, 0xff, 0xe8, 0xff, 0xc1, 0xff, 0xeb, 0xff, 0xbe, 0xff, 0xe9, 0xff, 0xb7, 0xff, 0xe4, 0xff, 0xaf, 0xff, 0xdf, 0xff, 0xa7, 0xff, 0xe1, 0xff, 0xa6, 0xff, 0xee, 0xff, 0xaf, 0xff, 0x06, 0x00, 0xc0, 0xff, 0x20, 0x00, 0xd1, 0xff, 0x37, 0x00, 0xdf, 0xff, 0x46, 0x00, 0xe9, 0xff, 0x4f, 0x00, 0xef, 0xff, 0x55, 0x00, 0xf4, 0xff, 0x5c, 0x00, 0xf7, 0xff, 0x65, 0x00, 0xf9, 0xff, 0x6f, 0x00, 0xf7, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0x94, 0x00, 0xfd, 0xff, 0xa6, 0x00, 0x06, 0x00, 0xb1, 0x00, 0x0f, 0x00, 0xae, 0x00, 0x12, 0x00, 0xa0, 0x00, 0x0c, 0x00, 0x8a, 0x00, 0xfb, 0xff, 0x75, 0x00, 0xe6, 0xff, 0x66, 0x00, 0xd6, 0xff, 0x64, 0x00, 0xd4, 0xff, 0x6e, 0x00, 0xe3, 0xff, 0x7c, 0x00, 0xfd, 0xff, 0x8a, 0x00, 0x1a, 0x00, 0x97, 0x00, 0x33, 0x00, 0x9f, 0x00, 0x44, 0x00, 0xa0, 0x00, 0x4b, 0x00, 0x9e, 0x00, 0x48, 0x00, 0x95, 0x00, 0x3c, 0x00, 0x8c, 0x00, 0x31, 0x00, 0x85, 0x00, 0x2c, 0x00, 0x85, 0x00, 0x2e, 0x00, 0x90, 0x00, 0x3c, 0x00, 0xa5, 0x00, 0x50, 0x00, 0xb8, 0x00, 0x60, 0x00, 0xc7, 0x00, 0x6c, 0x00, 0xcf, 0x00, 0x74, 0x00, 0xc8, 0x00, 0x71, 0x00, 0xb4, 0x00, 0x68, 0x00, 0x9b, 0x00, 0x5e, 0x00, 0x80, 0x00, 0x54, 0x00, 0x65, 0x00, 0x48, 0x00, 0x52, 0x00, 0x40, 0x00, 0x48, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x1b, 0x00, 0x2f, 0x00, 0x01, 0x00, 0x1c, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xcd, 0xff, 0xe9, 0xff, 0xc2, 0xff, 0xd6, 0xff, 0xbe, 0xff, 0xc9, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xaf, 0xff, 0xba, 0xff, 0xaa, 0xff, 0xb0, 0xff, 0x99, 0xff, 0x98, 0xff, 0x78, 0xff, 0x84, 0xff, 0x58, 0xff, 0x72, 0xff, 0x3b, 0xff, 0x5e, 0xff, 0x1b, 0xff, 0x5e, 0xff, 0x12, 0xff, 0x7b, 0xff, 0x29, 0xff, 0x94, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0x46, 0xff, 0xa6, 0xff, 0x4a, 0xff, 0xa2, 0xff, 0x41, 0xff, 0x90, 0xff, 0x29, 0xff, 0x81, 0xff, 0x14, 0xff, 0x7a, 0xff, 0x07, 0xff, 0x78, 0xff, 0x00, 0xff, 0x83, 0xff, 0x07, 0xff, 0x9a, 0xff, 0x1a, 0xff, 0xb0, 0xff, 0x2c, 0xff, 0xc0, 0xff, 0x38, 0xff, 0xc7, 0xff, 0x3d, 0xff, 0xba, 0xff, 0x2f, 0xff, 0xa1, 0xff, 0x17, 0xff, 0x97, 0xff, 0x12, 0xff, 0x9a, 0xff, 0x1b, 0xff, 0xa7, 0xff, 0x2c, 0xff, 0xd2, 0xff, 0x58, 0xff, 0x11, 0x00, 0x99, 0xff, 0x34, 0x00, 0xc3, 0xff, 0x27, 0x00, 0xc2, 0xff, 0xf2, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x5a, 0xff, 0x53, 0xff, 0x1d, 0xff, 0x33, 0xff, 0x0a, 0xff, 0x39, 0xff, 0x1d, 0xff, 0x67, 0xff, 0x58, 0xff, 0xcb, 0xff, 0xc9, 0xff, 0x44, 0x00, 0x4b, 0x00, 0xa2, 0x00, 0xb2, 0x00, 0xc9, 0x00, 0xde, 0x00, 0x96, 0x00, 0xad, 0x00, 0x1a, 0x00, 0x30, 0x00, 0xa1, 0xff, 0xb3, 0xff, 0x58, 0xff, 0x66, 0xff, 0x55, 0xff, 0x63, 0xff, 0xae, 0xff, 0xc3, 0xff, 0x3b, 0x00, 0x5d, 0x00, 0xb5, 0x00, 0xe4, 0x00, 0xf6, 0x00, 0x2f, 0x01, 0xe5, 0x00, 0x24, 0x01, 0x8b, 0x00, 0xcd, 0x00, 0x29, 0x00, 0x6f, 0x00, 0xf1, 0xff, 0x42, 0x00, 0xf4, 0xff, 0x55, 0x00, 0x32, 0x00, 0xa7, 0x00, 0x71, 0x00, 0xfa, 0x00, 0x6c, 0x00, 0x05, 0x01, 0x0d, 0x00, 0xb0, 0x00, 0x60, 0xff, 0x09, 0x00, 0xae, 0xfe, 0x5b, 0xff, 0x66, 0xfe, 0x14, 0xff, 0xbf, 0xfe, 0x6d, 0xff, 0xb2, 0xff, 0x61, 0x00, 0xfb, 0x00, 0xaa, 0x01, 0x0e, 0x02, 0xbd, 0x02, 0x7e, 0x02, 0x2d, 0x03, 0x15, 0x02, 0xc0, 0x02, 0xb1, 0x00, 0x52, 0x01, 0xcc, 0xfe, 0x5e, 0xff, 0x6a, 0xfd, 0xea, 0xfd, 0x17, 0xfd, 0x86, 0xfd, 0xee, 0xfd, 0x4f, 0xfe, 0xd1, 0xff, 0x29, 0x00, 0xf6, 0x01, 0x46, 0x02, 0x61, 0x03, 0xa9, 0x03, 0xad, 0x03, 0xea, 0x03, 0xb2, 0x02, 0xe1, 0x02, 0xa7, 0x00, 0xca, 0x00, 0x8d, 0xfe, 0xa2, 0xfe, 0x50, 0xfd, 0x56, 0xfd, 0x3d, 0xfd, 0x33, 0xfd, 0x52, 0xfe, 0x39, 0xfe, 0x0b, 0x00, 0xe6, 0xff, 0x88, 0x01, 0x5b, 0x01, 0x42, 0x02, 0x10, 0x02, 0x02, 0x02, 0xcb, 0x01, 0xd8, 0x00, 0x9d, 0x00, 0x58, 0xff, 0x18, 0xff, 0x22, 0xfe, 0xe0, 0xfd, 0x98, 0xfd, 0x54, 0xfd, 0xee, 0xfd, 0xa9, 0xfd, 0xeb, 0xfe, 0xa7, 0xfe, 0xff, 0xff, 0xbd, 0xff, 0xc7, 0x00, 0x8c, 0x00, 0xfd, 0x00, 0xcc, 0x00, 0x7b, 0x00, 0x54, 0x00, 0x8a, 0xff, 0x68, 0xff, 0x84, 0xfe, 0x63, 0xfe, 0xbe, 0xfd, 0x9a, 0xfd, 0xa2, 0xfd, 0x7d, 0xfd, 0x33, 0xfe, 0x0e, 0xfe, 0x12, 0xff, 0xf2, 0xfe, 0x01, 0x00, 0xe9, 0xff, 0xb4, 0x00, 0xa7, 0x00, 0xe0, 0x00, 0xde, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x39, 0xff, 0x40, 0xff, 0x90, 0xfe, 0x95, 0xfe, 0x49, 0xfe, 0x4e, 0xfe, 0x69, 0xfe, 0x72, 0xfe, 0x02, 0xff, 0x13, 0xff, 0xe8, 0xff, 0x06, 0x00, 0xac, 0x00, 0xd8, 0x00, 0x19, 0x01, 0x51, 0x01, 0x12, 0x01, 0x51, 0x01, 0x84, 0x00, 0xc7, 0x00, 0xbb, 0xff, 0x00, 0x00, 0x0b, 0xff, 0x50, 0xff, 0x98, 0xfe, 0xde, 0xfe, 0xa4, 0xfe, 0xeb, 0xfe, 0x39, 0xff, 0x80, 0xff, 0xf2, 0xff, 0x39, 0x00, 0x85, 0x00, 0xcb, 0x00, 0xd3, 0x00, 0x17, 0x01, 0xb6, 0x00, 0xf8, 0x00, 0x4f, 0x00, 0x90, 0x00, 0xf2, 0xff, 0x32, 0x00, 0xbe, 0xff, 0xfc, 0xff, 0xba, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x39, 0x00, 0x5f, 0x00, 0xa2, 0x00, 0xc3, 0x00, 0x0c, 0x01, 0xfb, 0x00, 0x4b, 0x01, 0xe0, 0x00, 0x35, 0x01, 0x75, 0x00, 0xcf, 0x00, 0xeb, 0xff, 0x49, 0x00, 0x7f, 0xff, 0xe0, 0xff, 0x6d, 0xff, 0xcf, 0xff, 0xc9, 0xff, 0x29, 0x00, 0x63, 0x00, 0xc2, 0x00, 0xfd, 0x00, 0x5b, 0x01, 0x60, 0x01, 0xbe, 0x01, 0x58, 0x01, 0xb4, 0x01, 0xda, 0x00, 0x31, 0x01, 0x11, 0x00, 0x61, 0x00, 0x37, 0xff, 0x7e, 0xff, 0xa0, 0xfe, 0xdf, 0xfe, 0xad, 0xfe, 0xe4, 0xfe, 0x6b, 0xff, 0x9a, 0xff, 0x7b, 0x00, 0x9e, 0x00, 0x63, 0x01, 0x79, 0x01, 0xce, 0x01, 0xd5, 0x01, 0x95, 0x01, 0x8a, 0x01, 0xcb, 0x00, 0xac, 0x00, 0xc0, 0xff, 0x8c, 0xff, 0xe7, 0xfe, 0x9f, 0xfe, 0xa9, 0xfe, 0x4f, 0xfe, 0x36, 0xff, 0xce, 0xfe, 0x6e, 0x00, 0xfa, 0xff, 0xc9, 0x01, 0x48, 0x01, 0x7b, 0x02, 0xea, 0x01, 0x0f, 0x02, 0x6b, 0x01, 0xc1, 0x00, 0x08, 0x00, 0x17, 0xff, 0x4f, 0xfe, 0xba, 0xfd, 0xea, 0xfc, 0x6e, 0xfd, 0x9f, 0xfc, 0x70, 0xfe, 0xa7, 0xfd, 0x34, 0x00, 0x75, 0xff, 0xf4, 0x01, 0x40, 0x01, 0xe6, 0x02, 0x3e, 0x02, 0x6e, 0x02, 0xd2, 0x01, 0xbe, 0x00, 0x2f, 0x00, 0xb3, 0xfe, 0x32, 0xfe, 0x27, 0xfd, 0xb7, 0xfc, 0xa8, 0xfc, 0x50, 0xfc, 0x5c, 0xfd, 0x22, 0xfd, 0xf2, 0xfe, 0xd8, 0xfe, 0xb9, 0x00, 0xbc, 0x00, 0xdc, 0x01, 0xf8, 0x01, 0xdf, 0x01, 0x0e, 0x02, 0xe2, 0x00, 0x21, 0x01, 0x52, 0xff, 0x9e, 0xff, 0xc4, 0xfd, 0x1c, 0xfe, 0xfa, 0xfc, 0x59, 0xfd, 0x47, 0xfd, 0xaa, 0xfd, 0x5b, 0xfe, 0xc0, 0xfe, 0xc4, 0xff, 0x2c, 0x00, 0x0a, 0x01, 0x76, 0x01, 0xa5, 0x01, 0x14, 0x02, 0x63, 0x01, 0xd4, 0x01, 0x85, 0x00, 0xf6, 0x00, 0x76, 0xff, 0xe6, 0xff, 0x96, 0xfe, 0x03, 0xff, 0x10, 0xfe, 0x7e, 0xfe, 0x22, 0xfe, 0x93, 0xfe, 0xf7, 0xfe, 0x6e, 0xff, 0x22, 0x00, 0x9f, 0x00, 0x18, 0x01, 0x9b, 0x01, 0xbf, 0x01, 0x46, 0x02, 0xf5, 0x01, 0x7d, 0x02, 0x78, 0x01, 0xff, 0x01, 0x90, 0x00, 0x14, 0x01, 0xa5, 0xff, 0x22, 0x00, 0xd1, 0xfe, 0x48, 0xff, 0x71, 0xfe, 0xe5, 0xfe, 0xf0, 0xfe, 0x62, 0xff, 0x25, 0x00, 0x96, 0x00, 0x7d, 0x01, 0xeb, 0x01, 0x62, 0x02, 0xc7, 0x02, 0x76, 0x02, 0xd1, 0x02, 0xbb, 0x01, 0x09, 0x02, 0x80, 0x00, 0xc3, 0x00, 0x58, 0xff, 0x8f, 0xff, 0xdf, 0xfe, 0x0d, 0xff, 0x3e, 0xff, 0x65, 0xff, 0x2f, 0x00, 0x52, 0x00, 0x5b, 0x01, 0x7c, 0x01, 0x43, 0x02, 0x61, 0x02, 0x68, 0x02, 0x81, 0x02, 0xcb, 0x01, 0xde, 0x01, 0xd0, 0x00, 0xda, 0x00, 0xe4, 0xff, 0xe2, 0xff, 0x69, 0xff, 0x58, 0xff, 0x7f, 0xff, 0x5e, 0xff, 0x06, 0x00, 0xd6, 0xff, 0xc5, 0x00, 0x87, 0x00, 0x66, 0x01, 0x1c, 0x01, 0xa8, 0x01, 0x53, 0x01, 0x8a, 0x01, 0x2c, 0x01, 0x0b, 0x01, 0xa5, 0x00, 0x4f, 0x00, 0xe1, 0xff, 0xbd, 0xff, 0x41, 0xff, 0x80, 0xff, 0xf0, 0xfe, 0x86, 0xff, 0xe0, 0xfe, 0xd7, 0xff, 0x1f, 0xff, 0x4f, 0x00, 0x8d, 0xff, 0xa0, 0x00, 0xdc, 0xff, 0xb5, 0x00, 0xf4, 0xff, 0x93, 0x00, 0xd6, 0xff, 0x3c, 0x00, 0x82, 0xff, 0xd1, 0xff, 0x18, 0xff, 0x7d, 0xff, 0xc3, 0xfe, 0x56, 0xff, 0x9a, 0xfe, 0x67, 0xff, 0xa9, 0xfe, 0x9a, 0xff, 0xda, 0xfe, 0xd9, 0xff, 0x19, 0xff, 0x1d, 0x00, 0x61, 0xff, 0x3e, 0x00, 0x89, 0xff, 0x23, 0x00, 0x75, 0xff, 0xe8, 0xff, 0x43, 0xff, 0xaa, 0xff, 0x0d, 0xff, 0x77, 0xff, 0xe4, 0xfe, 0x70, 0xff, 0xe9, 0xfe, 0x9c, 0xff, 0x23, 0xff, 0xd9, 0xff, 0x72, 0xff, 0x0c, 0x00, 0xbc, 0xff, 0x13, 0x00, 0xde, 0xff, 0xe3, 0xff, 0xce, 0xff, 0x99, 0xff, 0xa4, 0xff, 0x49, 0xff, 0x74, 0xff, 0x14, 0xff, 0x58, 0xff, 0x1f, 0xff, 0x74, 0xff, 0x54, 0xff, 0xb5, 0xff, 0x84, 0xff, 0xef, 0xff, 0xab, 0xff, 0x1e, 0x00, 0xbe, 0xff, 0x38, 0x00, 0xa6, 0xff, 0x26, 0x00, 0x7d, 0xff, 0x04, 0x00, 0x60, 0xff, 0xee, 0xff, 0x4d, 0xff, 0xe1, 0xff, 0x49, 0xff, 0xe0, 0xff, 0x52, 0xff, 0xe7, 0xff, 0x5e, 0xff, 0xec, 0xff, 0x73, 0xff, 0xf7, 0xff, 0x8b, 0xff, 0x06, 0x00, 0xa1, 0xff, 0x16, 0x00, 0xbc, 0xff, 0x2d, 0x00, 0xce, 0xff, 0x3d, 0x00, 0xcd, 0xff, 0x3c, 0x00, 0xcd, 0xff, 0x3a, 0x00, 0xd4, 0xff, 0x3b, 0x00, 0xd7, 0xff, 0x36, 0x00, 0xea, 0xff, 0x40, 0x00, 0x15, 0x00, 0x60, 0x00, 0x35, 0x00, 0x7a, 0x00, 0x3f, 0x00, 0x81, 0x00, 0x2f, 0x00, 0x73, 0x00, 0x01, 0x00, 0x47, 0x00, 0xca, 0xff, 0x0e, 0x00, 0xb4, 0xff, 0xf0, 0xff, 0xe0, 0xff, 0x0d, 0x00, 0x44, 0x00, 0x5e, 0x00, 0xa0, 0x00, 0xa7, 0x00, 0xc6, 0x00, 0xc0, 0x00, 0xbf, 0x00, 0xb2, 0x00, 0x8f, 0x00, 0x82, 0x00, 0x3a, 0x00, 0x2b, 0x00, 0xdb, 0xff, 0xc6, 0xff, 0x91, 0xff, 0x6d, 0xff, 0x7f, 0xff, 0x46, 0xff, 0xcf, 0xff, 0x7b, 0xff, 0x62, 0x00, 0xf4, 0xff, 0xdb, 0x00, 0x58, 0x00, 0xf6, 0x00, 0x64, 0x00, 0xac, 0x00, 0x10, 0x00, 0x24, 0x00, 0x82, 0xff, 0xa7, 0xff, 0xfc, 0xfe, 0x67, 0xff, 0xad, 0xfe, 0x7e, 0xff, 0xae, 0xfe, 0xef, 0xff, 0x06, 0xff, 0x80, 0x00, 0x81, 0xff, 0xdc, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0xcd, 0xff, 0x8c, 0x00, 0x83, 0xff, 0x15, 0x00, 0x18, 0xff, 0xbe, 0xff, 0xce, 0xfe, 0xa9, 0xff, 0xc6, 0xfe, 0xcb, 0xff, 0xf4, 0xfe, 0x0e, 0x00, 0x42, 0xff, 0x54, 0x00, 0x92, 0xff, 0x79, 0x00, 0xc5, 0xff, 0x74, 0x00, 0xd1, 0xff, 0x47, 0x00, 0xbb, 0xff, 0x03, 0x00, 0x93, 0xff, 0xcb, 0xff, 0x77, 0xff, 0xad, 0xff, 0x70, 0xff, 0xa9, 0xff, 0x7c, 0xff, 0xbe, 0xff, 0x9c, 0xff, 0xdd, 0xff, 0xc5, 0xff, 0xf0, 0xff, 0xe1, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xb0, 0xff, 0xc8, 0xff, 0x88, 0xff, 0xb1, 0xff, 0x72, 0xff, 0xad, 0xff, 0x73, 0xff, 0xc0, 0xff, 0x85, 0xff, 0xe0, 0xff, 0x99, 0xff, 0x01, 0x00, 0xa0, 0xff, 0x13, 0x00, 0xa1, 0xff, 0x1f, 0x00, 0xa0, 0xff, 0x27, 0x00, 0x9a, 0xff, 0x2b, 0x00, 0x9d, 0xff, 0x39, 0x00, 0xa7, 0xff, 0x4e, 0x00, 0xae, 0xff, 0x61, 0x00, 0xae, 0xff, 0x6d, 0x00, 0xac, 0xff, 0x74, 0x00, 0xb2, 0xff, 0x80, 0x00, 0xcb, 0xff, 0x9a, 0x00, 0xee, 0xff, 0xb7, 0x00, 0x07, 0x00, 0xc8, 0x00, 0x11, 0x00, 0xc9, 0x00, 0x0f, 0x00, 0xc2, 0x00, 0x07, 0x00, 0xbe, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x0a, 0x00, 0xd2, 0x00, 0x23, 0x00, 0xef, 0x00, 0x4b, 0x00, 0x12, 0x01, 0x6b, 0x00, 0x25, 0x01, 0x7e, 0x00, 0x27, 0x01, 0x84, 0x00, 0x1e, 0x01, 0x7a, 0x00, 0x0b, 0x01, 0x64, 0x00, 0xf5, 0x00, 0x52, 0x00, 0xe9, 0x00, 0x4c, 0x00, 0xec, 0x00, 0x4c, 0x00, 0xf3, 0x00, 0x54, 0x00, 0xf9, 0x00, 0x5e, 0x00, 0xf8, 0x00, 0x6a, 0x00, 0xf0, 0x00, 0x76, 0x00, 0xe2, 0x00, 0x7c, 0x00, 0xd0, 0x00, 0x7d, 0x00, 0xc2, 0x00, 0x72, 0x00, 0xb2, 0x00, 0x5b, 0x00, 0x9d, 0x00, 0x48, 0x00, 0x8c, 0x00, 0x40, 0x00, 0x7f, 0x00, 0x40, 0x00, 0x72, 0x00, 0x48, 0x00, 0x63, 0x00, 0x58, 0x00, 0x58, 0x00, 0x68, 0x00, 0x4e, 0x00, 0x71, 0x00, 0x45, 0x00, 0x6b, 0x00, 0x38, 0x00, 0x58, 0x00, 0x2b, 0x00, 0x43, 0x00, 0x20, 0x00, 0x33, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x0b, 0x00, 0x37, 0x00, 0x01, 0x00, 0x4e, 0x00, 0xfc, 0xff, 0x6a, 0x00, 0xfb, 0xff, 0x7e, 0x00, 0xfc, 0xff, 0x7c, 0x00, 0xf6, 0xff, 0x62, 0x00, 0xe5, 0xff, 0x3d, 0x00, 0xd2, 0xff, 0x1d, 0x00, 0xc2, 0xff, 0x08, 0x00, 0xb5, 0xff, 0x08, 0x00, 0xae, 0xff, 0x18, 0x00, 0xad, 0xff, 0x2c, 0x00, 0xaf, 0xff, 0x3a, 0x00, 0xaf, 0xff, 0x34, 0x00, 0xa8, 0xff, 0x18, 0x00, 0x99, 0xff, 0xf2, 0xff, 0x8b, 0xff, 0xd0, 0xff, 0x87, 0xff, 0xb8, 0xff, 0x8c, 0xff, 0xb0, 0xff, 0x9d, 0xff, 0xb4, 0xff, 0xb1, 0xff, 0xbb, 0xff, 0xc0, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd3, 0xff, 0xc8, 0xff, 0xd4, 0xff, 0xbb, 0xff, 0xd8, 0xff, 0xae, 0xff, 0xe2, 0xff, 0xa8, 0xff, 0xf1, 0xff, 0xac, 0xff, 0x05, 0x00, 0xb6, 0xff, 0x18, 0x00, 0xc3, 0xff, 0x24, 0x00, 0xcf, 0xff, 0x27, 0x00, 0xd5, 0xff, 0x22, 0x00, 0xd6, 0xff, 0x1a, 0x00, 0xd1, 0xff, 0x11, 0x00, 0xc7, 0xff, 0x09, 0x00, 0xbf, 0xff, 0x06, 0x00, 0xbe, 0xff, 0x08, 0x00, 0xc6, 0xff, 0x0d, 0x00, 0xd8, 0xff, 0x14, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0x12, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2a, 0x00, 0x23, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x15, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xf1, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x25, 0x00, 0xf1, 0xff, 0x30, 0x00, 0xeb, 0xff, 0x30, 0x00, 0xe4, 0xff, 0x25, 0x00, 0xde, 0xff, 0x14, 0x00, 0xd8, 0xff, 0x05, 0x00, 0xd6, 0xff, 0xfc, 0xff, 0xd4, 0xff, 0xf7, 0xff, 0xce, 0xff, 0xf4, 0xff, 0xc3, 0xff, 0xf2, 0xff, 0xb6, 0xff, 0xf1, 0xff, 0xab, 0xff, 0xeb, 0xff, 0xa0, 0xff, 0xe1, 0xff, 0x97, 0xff, 0xd6, 0xff, 0x91, 0xff, 0xd0, 0xff, 0x91, 0xff, 0xcd, 0xff, 0x93, 0xff, 0xcd, 0xff, 0x93, 0xff, 0xd0, 0xff, 0x90, 0xff, 0xd1, 0xff, 0x85, 0xff, 0xcf, 0xff, 0x72, 0xff, 0xcc, 0xff, 0x5c, 0xff, 0xc7, 0xff, 0x47, 0xff, 0xbe, 0xff, 0x32, 0xff, 0xb2, 0xff, 0x1f, 0xff, 0xa9, 0xff, 0x11, 0xff, 0xa3, 0xff, 0x06, 0xff, 0xa1, 0xff, 0xf9, 0xfe, 0xa4, 0xff, 0xeb, 0xfe, 0xae, 0xff, 0xe1, 0xfe, 0xbc, 0xff, 0xdc, 0xfe, 0xc8, 0xff, 0xda, 0xfe, 0xcd, 0xff, 0xdc, 0xfe, 0xc9, 0xff, 0xe1, 0xfe, 0xbe, 0xff, 0xe5, 0xfe, 0xb1, 0xff, 0xe8, 0xfe, 0xa6, 0xff, 0xe8, 0xfe, 0x9f, 0xff, 0xe3, 0xfe, 0xa3, 0xff, 0xe1, 0xfe, 0xae, 0xff, 0xe3, 0xfe, 0xba, 0xff, 0xec, 0xfe, 0xbd, 0xff, 0xf3, 0xfe, 0xb4, 0xff, 0xfa, 0xfe, 0xa5, 0xff, 0x06, 0xff, 0x93, 0xff, 0x12, 0xff, 0x85, 0xff, 0x21, 0xff, 0x81, 0xff, 0x30, 0xff, 0x89, 0xff, 0x40, 0xff, 0x9a, 0xff, 0x4e, 0xff, 0xad, 0xff, 0x5a, 0xff, 0xbe, 0xff, 0x67, 0xff, 0xc5, 0xff, 0x77, 0xff, 0xc5, 0xff, 0x8a, 0xff, 0xc3, 0xff, 0xa3, 0xff, 0xc5, 0xff, 0xc0, 0xff, 0xcd, 0xff, 0xdd, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xed, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x31, 0x00, 0x15, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0xff, 0xff, 0x44, 0x00, 0xf8, 0xff, 0x57, 0x00, 0xf7, 0xff, 0x6f, 0x00, 0xfc, 0xff, 0x85, 0x00, 0x07, 0x00, 0x97, 0x00, 0x17, 0x00, 0xa6, 0x00, 0x23, 0x00, 0xae, 0x00, 0x28, 0x00, 0xb1, 0x00, 0x2b, 0x00, 0xba, 0x00, 0x2f, 0x00, 0xce, 0x00, 0x35, 0x00, 0xed, 0x00, 0x3d, 0x00, 0x11, 0x01, 0x46, 0x00, 0x33, 0x01, 0x4f, 0x00, 0x48, 0x01, 0x52, 0x00, 0x4a, 0x01, 0x4f, 0x00, 0x3d, 0x01, 0x4e, 0x00, 0x31, 0x01, 0x4e, 0x00, 0x2b, 0x01, 0x4b, 0x00, 0x2a, 0x01, 0x49, 0x00, 0x2e, 0x01, 0x47, 0x00, 0x33, 0x01, 0x47, 0x00, 0x33, 0x01, 0x49, 0x00, 0x2c, 0x01, 0x49, 0x00, 0x1a, 0x01, 0x48, 0x00, 0x03, 0x01, 0x43, 0x00, 0xeb, 0x00, 0x3b, 0x00, 0xd5, 0x00, 0x36, 0x00, 0xc7, 0x00, 0x33, 0x00, 0xbc, 0x00, 0x35, 0x00, 0xb3, 0x00, 0x3b, 0x00, 0xa9, 0x00, 0x44, 0x00, 0x9b, 0x00, 0x4d, 0x00, 0x89, 0x00, 0x53, 0x00, 0x78, 0x00, 0x55, 0x00, 0x68, 0x00, 0x51, 0x00, 0x5c, 0x00, 0x49, 0x00, 0x55, 0x00, 0x3d, 0x00, 0x4e, 0x00, 0x2d, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x26, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x18, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xea, 0xff, 0x1d, 0x00, 0xdb, 0xff, 0x19, 0x00, 0xd2, 0xff, 0x14, 0x00, 0xcd, 0xff, 0x0b, 0x00, 0xc5, 0xff, 0xfd, 0xff, 0xb5, 0xff, 0xf4, 0xff, 0xa5, 0xff, 0xf6, 0xff, 0x9b, 0xff, 0x00, 0x00, 0x95, 0xff, 0x12, 0x00, 0x98, 0xff, 0x28, 0x00, 0xa3, 0xff, 0x3d, 0x00, 0xb6, 0xff, 0x46, 0x00, 0xc7, 0xff, 0x3f, 0x00, 0xce, 0xff, 0x30, 0x00, 0xcb, 0xff, 0x20, 0x00, 0xc1, 0xff, 0x15, 0x00, 0xb4, 0xff, 0x14, 0x00, 0xac, 0xff, 0x1b, 0x00, 0xa9, 0xff, 0x26, 0x00, 0xab, 0xff, 0x30, 0x00, 0xb3, 0xff, 0x37, 0x00, 0xc4, 0xff, 0x3a, 0x00, 0xd9, 0xff, 0x36, 0x00, 0xeb, 0xff, 0x2b, 0x00, 0xf4, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x2a, 0x00, 0x0a, 0x00, 0x37, 0x00, 0x21, 0x00, 0x41, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x52, 0x00, 0x42, 0x00, 0x66, 0x00, 0x39, 0x00, 0x72, 0x00, 0x31, 0x00, 0x7b, 0x00, 0x2c, 0x00, 0x82, 0x00, 0x28, 0x00, 0x87, 0x00, 0x21, 0x00, 0x89, 0x00, 0x19, 0x00, 0x8e, 0x00, 0x0e, 0x00, 0x93, 0x00, 0x05, 0x00, 0x98, 0x00, 0x00, 0x00, 0x9c, 0x00, 0xfc, 0xff, 0x9c, 0x00, 0xf8, 0xff, 0x98, 0x00, 0xf0, 0xff, 0x8f, 0x00, 0xe7, 0xff, 0x85, 0x00, 0xdc, 0xff, 0x7e, 0x00, 0xd0, 0xff, 0x78, 0x00, 0xc7, 0xff, 0x79, 0x00, 0xc4, 0xff, 0x80, 0x00, 0xc7, 0xff, 0x87, 0x00, 0xce, 0xff, 0x8a, 0x00, 0xdb, 0xff, 0x89, 0x00, 0xe8, 0xff, 0x86, 0x00, 0xf2, 0xff, 0x82, 0x00, 0xf8, 0xff, 0x7f, 0x00, 0xfd, 0xff, 0x7e, 0x00, 0x04, 0x00, 0x7d, 0x00, 0x0e, 0x00, 0x79, 0x00, 0x19, 0x00, 0x73, 0x00, 0x24, 0x00, 0x68, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x2f, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x25, 0x00, 0x11, 0x00, 0x1d, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xd6, 0xff, 0x26, 0x00, 0xc8, 0xff, 0x2e, 0x00, 0xb7, 0xff, 0x30, 0x00, 0xa3, 0xff, 0x27, 0x00, 0x8c, 0xff, 0x15, 0x00, 0x76, 0xff, 0xfe, 0xff, 0x65, 0xff, 0xe6, 0xff, 0x5a, 0xff, 0xd4, 0xff, 0x56, 0xff, 0xc9, 0xff, 0x54, 0xff, 0xc7, 0xff, 0x50, 0xff, 0xca, 0xff, 0x4a, 0xff, 0xcb, 0xff, 0x40, 0xff, 0xc6, 0xff, 0x34, 0xff, 0xbc, 0xff, 0x2b, 0xff, 0xac, 0xff, 0x25, 0xff, 0x9c, 0xff, 0x22, 0xff, 0x94, 0xff, 0x27, 0xff, 0x97, 0xff, 0x32, 0xff, 0x9d, 0xff, 0x3b, 0xff, 0x9f, 0xff, 0x3d, 0xff, 0x9d, 0xff, 0x3c, 0xff, 0x98, 0xff, 0x37, 0xff, 0x91, 0xff, 0x30, 0xff, 0x8d, 0xff, 0x2f, 0xff, 0x94, 0xff, 0x36, 0xff, 0x9f, 0xff, 0x43, 0xff, 0xa9, 0xff, 0x50, 0xff, 0xae, 0xff, 0x5a, 0xff, 0xaf, 0xff, 0x66, 0xff, 0xaf, 0xff, 0x75, 0xff, 0xad, 0xff, 0x87, 0xff, 0xad, 0xff, 0x9b, 0xff, 0xb2, 0xff, 0xb0, 0xff, 0xbf, 0xff, 0xc5, 0xff, 0xd1, 0xff, 0xd7, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x23, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0xfd, 0xff, 0x5b, 0x00, 0x02, 0x00, 0x74, 0x00, 0x0d, 0x00, 0x86, 0x00, 0x1b, 0x00, 0x8f, 0x00, 0x27, 0x00, 0x92, 0x00, 0x2c, 0x00, 0x92, 0x00, 0x2a, 0x00, 0x96, 0x00, 0x20, 0x00, 0xa1, 0x00, 0x14, 0x00, 0xb5, 0x00, 0x0b, 0x00, 0xcf, 0x00, 0x07, 0x00, 0xe4, 0x00, 0x07, 0x00, 0xec, 0x00, 0x0c, 0x00, 0xe4, 0x00, 0x13, 0x00, 0xd3, 0x00, 0x19, 0x00, 0xbe, 0x00, 0x19, 0x00, 0xab, 0x00, 0x16, 0x00, 0xa1, 0x00, 0x0e, 0x00, 0x9f, 0x00, 0x04, 0x00, 0xa3, 0x00, 0xfd, 0xff, 0xaa, 0x00, 0xfc, 0xff, 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0x04, 0x00, 0x9f, 0x00, 0x06, 0x00, 0x88, 0x00, 0x07, 0x00, 0x71, 0x00, 0x05, 0x00, 0x5e, 0x00, 0x01, 0x00, 0x51, 0x00, 0xff, 0xff, 0x4c, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x0a, 0x00, 0x56, 0x00, 0x15, 0x00, 0x5b, 0x00, 0x20, 0x00, 0x5d, 0x00, 0x26, 0x00, 0x56, 0x00, 0x24, 0x00, 0x46, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x19, 0x00, 0x17, 0x00, 0x19, 0x00, 0x04, 0x00, 0x1f, 0x00, 0xf5, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x3a, 0x00, 0xeb, 0xff, 0x46, 0x00, 0xe7, 0xff, 0x4e, 0x00, 0xe1, 0xff, 0x50, 0x00, 0xd7, 0xff, 0x4d, 0x00, 0xc7, 0xff, 0x46, 0x00, 0xaf, 0xff, 0x41, 0x00, 0x98, 0xff, 0x44, 0x00, 0x89, 0xff, 0x4c, 0x00, 0x83, 0xff, 0x53, 0x00, 0x81, 0xff, 0x57, 0x00, 0x84, 0xff, 0x57, 0x00, 0x87, 0xff, 0x50, 0x00, 0x81, 0xff, 0x46, 0x00, 0x75, 0xff, 0x3d, 0x00, 0x64, 0xff, 0x38, 0x00, 0x55, 0xff, 0x34, 0x00, 0x4c, 0xff, 0x31, 0x00, 0x4a, 0xff, 0x2e, 0x00, 0x50, 0xff, 0x29, 0x00, 0x58, 0xff, 0x25, 0x00, 0x60, 0xff, 0x21, 0x00, 0x67, 0xff, 0x1f, 0x00, 0x6c, 0xff, 0x1b, 0x00, 0x6d, 0xff, 0x1a, 0x00, 0x6f, 0xff, 0x1c, 0x00, 0x75, 0xff, 0x1f, 0x00, 0x7e, 0xff, 0x1f, 0x00, 0x88, 0xff, 0x1b, 0x00, 0x92, 0xff, 0x16, 0x00, 0x9c, 0xff, 0x11, 0x00, 0xa4, 0xff, 0x0c, 0x00, 0xa8, 0xff, 0x07, 0x00, 0xa9, 0xff, 0x03, 0x00, 0xaa, 0xff, 0xfb, 0xff, 0xaa, 0xff, 0xf0, 0xff, 0xab, 0xff, 0xe6, 0xff, 0xae, 0xff, 0xdc, 0xff, 0xb1, 0xff, 0xd5, 0xff, 0xb7, 0xff, 0xd5, 0xff, 0xc4, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe3, 0xff, 0xf6, 0xff, 0xdb, 0xff, 0xfb, 0xff, 0xd0, 0xff, 0x01, 0x00, 0xc5, 0xff, 0x0c, 0x00, 0xbb, 0xff, 0x19, 0x00, 0xb3, 0xff, 0x25, 0x00, 0xaf, 0xff, 0x2f, 0x00, 0xad, 0xff, 0x33, 0x00, 0xad, 0xff, 0x32, 0x00, 0xab, 0xff, 0x29, 0x00, 0xa8, 0xff, 0x23, 0x00, 0xa9, 0xff, 0x28, 0x00, 0xad, 0xff, 0x37, 0x00, 0xae, 0xff, 0x4a, 0x00, 0xad, 0xff, 0x5b, 0x00, 0xae, 0xff, 0x67, 0x00, 0xac, 0xff, 0x65, 0x00, 0xaa, 0xff, 0x58, 0x00, 0xa7, 0xff, 0x44, 0x00, 0xa3, 0xff, 0x30, 0x00, 0xa1, 0xff, 0x25, 0x00, 0xa2, 0xff, 0x25, 0x00, 0xa5, 0xff, 0x2d, 0x00, 0xaa, 0xff, 0x38, 0x00, 0xaf, 0xff, 0x3d, 0x00, 0xb1, 0xff, 0x37, 0x00, 0xb0, 0xff, 0x28, 0x00, 0xac, 0xff, 0x0f, 0x00, 0xa8, 0xff, 0xf8, 0xff, 0xa9, 0xff, 0xea, 0xff, 0xae, 0xff, 0xe2, 0xff, 0xb4, 0xff, 0xdf, 0xff, 0xbd, 0xff, 0xde, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xd1, 0xff, 0xdb, 0xff, 0xd7, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xcf, 0xff, 0xdc, 0xff, 0xc7, 0xff, 0xdd, 0xff, 0xbe, 0xff, 0xde, 0xff, 0xb3, 0xff, 0xe2, 0xff, 0xaa, 0xff, 0xe8, 0xff, 0xa5, 0xff, 0xf0, 0xff, 0xa2, 0xff, 0xf9, 0xff, 0xa6, 0xff, 0x05, 0x00, 0xb0, 0xff, 0x14, 0x00, 0xbb, 0xff, 0x23, 0x00, 0xc2, 0xff, 0x2f, 0x00, 0xc1, 0xff, 0x37, 0x00, 0xb9, 0xff, 0x37, 0x00, 0xab, 0xff, 0x34, 0x00, 0x9e, 0xff, 0x33, 0x00, 0x99, 0xff, 0x34, 0x00, 0x9c, 0xff, 0x3b, 0x00, 0xa6, 0xff, 0x45, 0x00, 0xb4, 0xff, 0x51, 0x00, 0xc0, 0xff, 0x58, 0x00, 0xc3, 0xff, 0x59, 0x00, 0xbf, 0xff, 0x53, 0x00, 0xba, 0xff, 0x40, 0x00, 0xb4, 0xff, 0x29, 0x00, 0xb3, 0xff, 0x18, 0x00, 0xbd, 0xff, 0x15, 0x00, 0xd4, 0xff, 0x23, 0x00, 0xf1, 0xff, 0x37, 0x00, 0x08, 0x00, 0x45, 0x00, 0x12, 0x00, 0x44, 0x00, 0x11, 0x00, 0x35, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xfd, 0xff, 0x2b, 0x00, 0x12, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x46, 0x00, 0x35, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x51, 0x00, 0x25, 0x00, 0x51, 0x00, 0x11, 0x00, 0x52, 0x00, 0x01, 0x00, 0x56, 0x00, 0xf7, 0xff, 0x5c, 0x00, 0xf6, 0xff, 0x64, 0x00, 0xfd, 0xff, 0x6d, 0x00, 0x0a, 0x00, 0x78, 0x00, 0x18, 0x00, 0x84, 0x00, 0x22, 0x00, 0x8b, 0x00, 0x21, 0x00, 0x8a, 0x00, 0x13, 0x00, 0x81, 0x00, 0xfe, 0xff, 0x76, 0x00, 0xeb, 0xff, 0x72, 0x00, 0xe0, 0xff, 0x75, 0x00, 0xdb, 0xff, 0x79, 0x00, 0xde, 0xff, 0x7d, 0x00, 0xe6, 0xff, 0x7c, 0x00, 0xef, 0xff, 0x76, 0x00, 0xf7, 0xff, 0x68, 0x00, 0xfe, 0xff, 0x56, 0x00, 0x04, 0x00, 0x47, 0x00, 0x06, 0x00, 0x3f, 0x00, 0x03, 0x00, 0x3d, 0x00, 0xfc, 0xff, 0x3e, 0x00, 0xf4, 0xff, 0x3d, 0x00, 0xeb, 0xff, 0x31, 0x00, 0xe7, 0xff, 0x1e, 0x00, 0xe7, 0xff, 0x06, 0x00, 0xea, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x09, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf5, 0xff, 0x21, 0x00, 0xff, 0xff, 0x29, 0x00, 0x11, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x01, 0x00, 0x21, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x06, 0x00, 0xeb, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xde, 0xff, 0xfd, 0xff, 0xca, 0xff, 0xf7, 0xff, 0xbb, 0xff, 0xee, 0xff, 0xb5, 0xff, 0xe3, 0xff, 0xb7, 0xff, 0xd4, 0xff, 0xbf, 0xff, 0xc5, 0xff, 0xce, 0xff, 0xbd, 0xff, 0xdc, 0xff, 0xc1, 0xff, 0xe2, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xe6, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xda, 0xff, 0x09, 0x00, 0xd7, 0xff, 0x07, 0x00, 0xd8, 0xff, 0xf8, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0x0c, 0x00, 0x11, 0x00, 0x17, 0x00, 0x36, 0x00, 0x1b, 0x00, 0x55, 0x00, 0x1c, 0x00, 0x65, 0x00, 0x1a, 0x00, 0x61, 0x00, 0x15, 0x00, 0x4d, 0x00, 0x11, 0x00, 0x35, 0x00, 0x10, 0x00, 0x27, 0x00, 0x10, 0x00, 0x25, 0x00, 0x0f, 0x00, 0x2e, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x0c, 0x00, 0x4b, 0x00, 0x0f, 0x00, 0x4f, 0x00, 0x14, 0x00, 0x47, 0x00, 0x1d, 0x00, 0x38, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x19, 0x00, 0x22, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x34, 0x00, 0x06, 0x00, 0x3d, 0x00, 0x03, 0x00, 0x42, 0x00, 0x01, 0x00, 0x3f, 0x00, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x05, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x42, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0x14, 0x00, 0x5b, 0x00, 0x19, 0x00, 0x65, 0x00, 0x19, 0x00, 0x6a, 0x00, 0x15, 0x00, 0x67, 0x00, 0x0c, 0x00, 0x5f, 0x00, 0x02, 0x00, 0x51, 0x00, 0xf6, 0xff, 0x43, 0x00, 0xec, 0xff, 0x3b, 0x00, 0xe4, 0xff, 0x39, 0x00, 0xd9, 0xff, 0x3c, 0x00, 0xc9, 0xff, 0x44, 0x00, 0xb4, 0xff, 0x4b, 0x00, 0x9c, 0xff, 0x4d, 0x00, 0x85, 0xff, 0x4d, 0x00, 0x75, 0xff, 0x4b, 0x00, 0x6f, 0xff, 0x46, 0x00, 0x6e, 0xff, 0x3e, 0x00, 0x6f, 0xff, 0x35, 0x00, 0x6e, 0xff, 0x2f, 0x00, 0x6a, 0xff, 0x2e, 0x00, 0x61, 0xff, 0x35, 0x00, 0x59, 0xff, 0x44, 0x00, 0x57, 0xff, 0x56, 0x00, 0x5d, 0xff, 0x60, 0x00, 0x69, 0xff, 0x5e, 0x00, 0x78, 0xff, 0x4f, 0x00, 0x87, 0xff, 0x37, 0x00, 0x8e, 0xff, 0x1e, 0x00, 0x8d, 0xff, 0x09, 0x00, 0x88, 0xff, 0x01, 0x00, 0x85, 0xff, 0x00, 0x00, 0x85, 0xff, 0x04, 0x00, 0x8e, 0xff, 0x0c, 0x00, 0xa2, 0xff, 0x10, 0x00, 0xba, 0xff, 0x0b, 0x00, 0xd0, 0xff, 0xfe, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xda, 0xff, 0xdd, 0xff, 0xcd, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xc1, 0xff, 0xd8, 0xff, 0xc5, 0xff, 0xe3, 0xff, 0xd3, 0xff, 0xeb, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xdd, 0xff, 0x02, 0x00, 0xcf, 0xff, 0x04, 0x00, 0xc4, 0xff, 0x00, 0x00, 0xbf, 0xff, 0xf9, 0xff, 0xc0, 0xff, 0xf1, 0xff, 0xc7, 0xff, 0xef, 0xff, 0xd1, 0xff, 0xf6, 0xff, 0xd9, 0xff, 0x05, 0x00, 0xdd, 0xff, 0x1c, 0x00, 0xe0, 0xff, 0x37, 0x00, 0xdd, 0xff, 0x4f, 0x00, 0xd7, 0xff, 0x5e, 0x00, 0xd1, 0xff, 0x65, 0x00, 0xcf, 0xff, 0x67, 0x00, 0xcf, 0xff, 0x66, 0x00, 0xd2, 0xff, 0x66, 0x00, 0xda, 0xff, 0x6d, 0x00, 0xe5, 0xff, 0x7e, 0x00, 0xee, 0xff, 0x95, 0x00, 0xf3, 0xff, 0xac, 0x00, 0xf2, 0xff, 0xc0, 0x00, 0xeb, 0xff, 0xc8, 0x00, 0xe2, 0xff, 0xc6, 0x00, 0xdc, 0xff, 0xbd, 0x00, 0xdb, 0xff, 0xae, 0x00, 0xdd, 0xff, 0xa1, 0x00, 0xe4, 0xff, 0x9b, 0x00, 0xef, 0xff, 0xa2, 0x00, 0xfc, 0xff, 0xb1, 0x00, 0x04, 0x00, 0xbf, 0x00, 0x06, 0x00, 0xc3, 0x00, 0x04, 0x00, 0xba, 0x00, 0xfb, 0xff, 0xa0, 0x00, 0xf0, 0xff, 0x7c, 0x00, 0xed, 0xff, 0x5d, 0x00, 0xf2, 0xff, 0x4b, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x14, 0x00, 0x5b, 0x00, 0x25, 0x00, 0x6f, 0x00, 0x2d, 0x00, 0x7c, 0x00, 0x2b, 0x00, 0x7b, 0x00, 0x25, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x55, 0x00, 0x1f, 0x00, 0x39, 0x00, 0x25, 0x00, 0x25, 0x00, 0x31, 0x00, 0x1d, 0x00, 0x3d, 0x00, 0x22, 0x00, 0x45, 0x00, 0x2c, 0x00, 0x45, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x38, 0x00, 0x32, 0x00, 0x33, 0x00, 0x26, 0x00, 0x28, 0x00, 0x20, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x25, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xe8, 0xff, 0x13, 0x00, 0xdb, 0xff, 0x00, 0x00, 0xce, 0xff, 0xed, 0xff, 0xc4, 0xff, 0xe0, 0xff, 0xbd, 0xff, 0xda, 0xff, 0xba, 0xff, 0xda, 0xff, 0xba, 0xff, 0xdd, 0xff, 0xbb, 0xff, 0xe1, 0xff, 0xbf, 0xff, 0xe1, 0xff, 0xc4, 0xff, 0xda, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xc5, 0xff, 0xbe, 0xff, 0xc3, 0xff, 0xb1, 0xff, 0xc3, 0xff, 0xaa, 0xff, 0xc5, 0xff, 0xac, 0xff, 0xc9, 0xff, 0xb3, 0xff, 0xcf, 0xff, 0xbb, 0xff, 0xd5, 0xff, 0xbf, 0xff, 0xdb, 0xff, 0xbd, 0xff, 0xe0, 0xff, 0xb5, 0xff, 0xe1, 0xff, 0xad, 0xff, 0xe1, 0xff, 0xa9, 0xff, 0xe2, 0xff, 0xac, 0xff, 0xe2, 0xff, 0xb5, 0xff, 0xe6, 0xff, 0xc3, 0xff, 0xed, 0xff, 0xd2, 0xff, 0xf8, 0xff, 0xdc, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x17, 0x00, 0xe5, 0xff, 0x26, 0x00, 0xe0, 0xff, 0x2c, 0x00, 0xd7, 0xff, 0x28, 0x00, 0xcd, 0xff, 0x1f, 0x00, 0xc8, 0xff, 0x19, 0x00, 0xca, 0xff, 0x1b, 0x00, 0xd0, 0xff, 0x24, 0x00, 0xd5, 0xff, 0x31, 0x00, 0xd5, 0xff, 0x3b, 0x00, 0xd0, 0xff, 0x40, 0x00, 0xc7, 0xff, 0x3f, 0x00, 0xbd, 0xff, 0x39, 0x00, 0xb4, 0xff, 0x2f, 0x00, 0xb0, 0xff, 0x28, 0x00, 0xb6, 0xff, 0x29, 0x00, 0xc3, 0xff, 0x2f, 0x00, 0xd0, 0xff, 0x37, 0x00, 0xdc, 0xff, 0x3d, 0x00, 0xe5, 0xff, 0x3e, 0x00, 0xea, 0xff, 0x38, 0x00, 0xe7, 0xff, 0x2b, 0x00, 0xe0, 0xff, 0x18, 0x00, 0xd9, 0xff, 0x05, 0x00, 0xd6, 0xff, 0xf5, 0xff, 0xd7, 0xff, 0xe9, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xce, 0xff, 0xff, 0xff, 0xc6, 0xff, 0x05, 0x00, 0xbe, 0xff, 0x05, 0x00, 0xb6, 0xff, 0xfe, 0xff, 0xaa, 0xff, 0xf2, 0xff, 0x99, 0xff, 0xe6, 0xff, 0x83, 0xff, 0xe0, 0xff, 0x6f, 0xff, 0xe1, 0xff, 0x5e, 0xff, 0xec, 0xff, 0x55, 0xff, 0xfd, 0xff, 0x55, 0xff, 0x0f, 0x00, 0x5c, 0xff, 0x19, 0x00, 0x63, 0xff, 0x18, 0x00, 0x66, 0xff, 0x0f, 0x00, 0x66, 0xff, 0xff, 0xff, 0x61, 0xff, 0xed, 0xff, 0x5b, 0xff, 0xe0, 0xff, 0x56, 0xff, 0xde, 0xff, 0x59, 0xff, 0xe9, 0xff, 0x65, 0xff, 0xfa, 0xff, 0x72, 0xff, 0x07, 0x00, 0x7b, 0xff, 0x0a, 0x00, 0x7f, 0xff, 0x01, 0x00, 0x7b, 0xff, 0xf0, 0xff, 0x76, 0xff, 0xe0, 0xff, 0x75, 0xff, 0xd4, 0xff, 0x78, 0xff, 0xcf, 0xff, 0x7c, 0xff, 0xd2, 0xff, 0x81, 0xff, 0xdd, 0xff, 0x85, 0xff, 0xee, 0xff, 0x89, 0xff, 0xfd, 0xff, 0x8c, 0xff, 0x06, 0x00, 0x8f, 0xff, 0x05, 0x00, 0x8e, 0xff, 0xfe, 0xff, 0x8a, 0xff, 0xf1, 0xff, 0x82, 0xff, 0xe3, 0xff, 0x79, 0xff, 0xdb, 0xff, 0x75, 0xff, 0xd9, 0xff, 0x78, 0xff, 0xdf, 0xff, 0x85, 0xff, 0xeb, 0xff, 0x9c, 0xff, 0xf8, 0xff, 0xb6, 0xff, 0x00, 0x00, 0xca, 0xff, 0xfd, 0xff, 0xd3, 0xff, 0xf1, 0xff, 0xd2, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xd3, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcf, 0xff, 0xcd, 0xff, 0xe2, 0xff, 0xdb, 0xff, 0x01, 0x00, 0xef, 0xff, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x0c, 0x00, 0x51, 0x00, 0x12, 0x00, 0x56, 0x00, 0x12, 0x00, 0x51, 0x00, 0x10, 0x00, 0x4a, 0x00, 0x12, 0x00, 0x47, 0x00, 0x19, 0x00, 0x4e, 0x00, 0x25, 0x00, 0x5c, 0x00, 0x36, 0x00, 0x6f, 0x00, 0x4a, 0x00, 0x82, 0x00, 0x5c, 0x00, 0x8f, 0x00, 0x6b, 0x00, 0x94, 0x00, 0x73, 0x00, 0x92, 0x00, 0x77, 0x00, 0x8d, 0x00, 0x79, 0x00, 0x89, 0x00, 0x7c, 0x00, 0x87, 0x00, 0x81, 0x00, 0x88, 0x00, 0x85, 0x00, 0x89, 0x00, 0x88, 0x00, 0x87, 0x00, 0x88, 0x00, 0x81, 0x00, 0x85, 0x00, 0x77, 0x00, 0x7f, 0x00, 0x6a, 0x00, 0x78, 0x00, 0x5d, 0x00, 0x6d, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x43, 0x00, 0x58, 0x00, 0x39, 0x00, 0x4e, 0x00, 0x33, 0x00, 0x43, 0x00, 0x2e, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x28, 0x00, 0x2b, 0x00, 0x21, 0x00, 0x23, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfa, 0xff, 0xef, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd2, 0xff, 0xbc, 0xff, 0xd5, 0xff, 0xb2, 0xff, 0xdd, 0xff, 0xb2, 0xff, 0xe7, 0xff, 0xb9, 0xff, 0xea, 0xff, 0xbd, 0xff, 0xe5, 0xff, 0xba, 0xff, 0xd8, 0xff, 0xaf, 0xff, 0xcb, 0xff, 0xa1, 0xff, 0xbf, 0xff, 0x93, 0xff, 0xb6, 0xff, 0x8b, 0xff, 0xb1, 0xff, 0x8c, 0xff, 0xb2, 0xff, 0x94, 0xff, 0xb5, 0xff, 0xa1, 0xff, 0xba, 0xff, 0xad, 0xff, 0xbd, 0xff, 0xb5, 0xff, 0xbe, 0xff, 0xb8, 0xff, 0xbc, 0xff, 0xb6, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xb9, 0xff, 0xb2, 0xff, 0xb9, 0xff, 0xb4, 0xff, 0xbb, 0xff, 0xba, 0xff, 0xbd, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc8, 0xff, 0xc7, 0xff, 0xd0, 0xff, 0xce, 0xff, 0xda, 0xff, 0xd4, 0xff, 0xe3, 0xff, 0xda, 0xff, 0xec, 0xff, 0xdd, 0xff, 0xf0, 0xff, 0xde, 0xff, 0xf1, 0xff, 0xde, 0xff, 0xee, 0xff, 0xdf, 0xff, 0xeb, 0xff, 0xe2, 0xff, 0xed, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x12, 0x00, 0x10, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x45, 0x00, 0x28, 0x00, 0x52, 0x00, 0x31, 0x00, 0x56, 0x00, 0x38, 0x00, 0x51, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x57, 0x00, 0x64, 0x00, 0x6b, 0x00, 0x73, 0x00, 0x7f, 0x00, 0x81, 0x00, 0x90, 0x00, 0x8b, 0x00, 0x96, 0x00, 0x8e, 0x00, 0x91, 0x00, 0x88, 0x00, 0x81, 0x00, 0x7e, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x64, 0x00, 0x72, 0x00, 0x61, 0x00, 0x71, 0x00, 0x67, 0x00, 0x74, 0x00, 0x70, 0x00, 0x7a, 0x00, 0x78, 0x00, 0x81, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x74, 0x00, 0x83, 0x00, 0x65, 0x00, 0x78, 0x00, 0x52, 0x00, 0x67, 0x00, 0x40, 0x00, 0x56, 0x00, 0x34, 0x00, 0x48, 0x00, 0x32, 0x00, 0x3d, 0x00, 0x35, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x3d, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x08, 0x00, 0x0c, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfb, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xde, 0xff, 0x0a, 0x00, 0xc9, 0xff, 0x09, 0x00, 0xb3, 0xff, 0x02, 0x00, 0xa1, 0xff, 0xf6, 0xff, 0x95, 0xff, 0xe7, 0xff, 0x8e, 0xff, 0xd8, 0xff, 0x8e, 0xff, 0xd2, 0xff, 0x90, 0xff, 0xd5, 0xff, 0x92, 0xff, 0xe2, 0xff, 0x8e, 0xff, 0xf0, 0xff, 0x84, 0xff, 0xf8, 0xff, 0x75, 0xff, 0xf5, 0xff, 0x68, 0xff, 0xe9, 0xff, 0x63, 0xff, 0xd9, 0xff, 0x68, 0xff, 0xcd, 0xff, 0x73, 0xff, 0xca, 0xff, 0x7f, 0xff, 0xce, 0xff, 0x87, 0xff, 0xd7, 0xff, 0x8a, 0xff, 0xe2, 0xff, 0x8a, 0xff, 0xec, 0xff, 0x88, 0xff, 0xef, 0xff, 0x87, 0xff, 0xe8, 0xff, 0x8b, 0xff, 0xd9, 0xff, 0x95, 0xff, 0xc9, 0xff, 0xa4, 0xff, 0xbd, 0xff, 0xb2, 0xff, 0xb9, 0xff, 0xbd, 0xff, 0xbe, 0xff, 0xc1, 0xff, 0xc9, 0xff, 0xc1, 0xff, 0xd3, 0xff, 0xc0, 0xff, 0xda, 0xff, 0xc5, 0xff, 0xdd, 0xff, 0xcf, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd7, 0xff, 0xed, 0xff, 0xd0, 0xff, 0xfc, 0xff, 0xc9, 0xff, 0x0b, 0x00, 0xc8, 0xff, 0x18, 0x00, 0xce, 0xff, 0x23, 0x00, 0xdc, 0xff, 0x2e, 0x00, 0xef, 0xff, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x0c, 0x00, 0x40, 0x00, 0x10, 0x00, 0x48, 0x00, 0x0f, 0x00, 0x56, 0x00, 0x0f, 0x00, 0x67, 0x00, 0x13, 0x00, 0x7b, 0x00, 0x1e, 0x00, 0x8e, 0x00, 0x2f, 0x00, 0x9c, 0x00, 0x42, 0x00, 0xa3, 0x00, 0x53, 0x00, 0xa5, 0x00, 0x5e, 0x00, 0xa2, 0x00, 0x62, 0x00, 0x9e, 0x00, 0x5f, 0x00, 0x9b, 0x00, 0x5b, 0x00, 0x9d, 0x00, 0x5a, 0x00, 0xa2, 0x00, 0x5d, 0x00, 0xa6, 0x00, 0x63, 0x00, 0xa8, 0x00, 0x6b, 0x00, 0xa2, 0x00, 0x70, 0x00, 0x94, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x65, 0x00, 0x68, 0x00, 0x58, 0x00, 0x58, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x47, 0x00, 0x50, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x42, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x31, 0x00, 0x09, 0x00, 0x23, 0x00, 0xf2, 0xff, 0x16, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x07, 0x00, 0xd9, 0xff, 0x06, 0x00, 0xdb, 0xff, 0x07, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xd6, 0xff, 0x0e, 0x00, 0xcf, 0xff, 0x12, 0x00, 0xc6, 0xff, 0x14, 0x00, 0xbc, 0xff, 0x11, 0x00, 0xb1, 0xff, 0x08, 0x00, 0xa6, 0xff, 0xfb, 0xff, 0x9f, 0xff, 0xee, 0xff, 0x9c, 0xff, 0xe8, 0xff, 0x9a, 0xff, 0xe8, 0xff, 0x9c, 0xff, 0xef, 0xff, 0xa0, 0xff, 0xfc, 0xff, 0xa4, 0xff, 0x09, 0x00, 0xa5, 0xff, 0x10, 0x00, 0xa1, 0xff, 0x0e, 0x00, 0x9a, 0xff, 0x03, 0x00, 0x90, 0xff, 0xf1, 0xff, 0x88, 0xff, 0xe2, 0xff, 0x84, 0xff, 0xd8, 0xff, 0x87, 0xff, 0xd6, 0xff, 0x8d, 0xff, 0xdb, 0xff, 0x95, 0xff, 0xe1, 0xff, 0x9b, 0xff, 0xe6, 0xff, 0x9d, 0xff, 0xe8, 0xff, 0x9e, 0xff, 0xe7, 0xff, 0x9e, 0xff, 0xe6, 0xff, 0xa1, 0xff, 0xe6, 0xff, 0xab, 0xff, 0xe8, 0xff, 0xbc, 0xff, 0xed, 0xff, 0xd2, 0xff, 0xf5, 0xff, 0xe7, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x21, 0x00, 0x00, 0x00, 0x23, 0x00, 0x08, 0x00, 0x22, 0x00, 0x16, 0x00, 0x22, 0x00, 0x28, 0x00, 0x25, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x45, 0x00, 0x38, 0x00, 0x49, 0x00, 0x42, 0x00, 0x47, 0x00, 0x49, 0x00, 0x43, 0x00, 0x4a, 0x00, 0x42, 0x00, 0x45, 0x00, 0x44, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x35, 0x00, 0x53, 0x00, 0x35, 0x00, 0x5b, 0x00, 0x3b, 0x00, 0x5f, 0x00, 0x44, 0x00, 0x5f, 0x00, 0x4e, 0x00, 0x5b, 0x00, 0x53, 0x00, 0x55, 0x00, 0x52, 0x00, 0x50, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x50, 0x00, 0x3b, 0x00, 0x54, 0x00, 0x38, 0x00, 0x56, 0x00, 0x39, 0x00, 0x56, 0x00, 0x3e, 0x00, 0x52, 0x00, 0x44, 0x00, 0x45, 0x00, 0x44, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x33, 0x00, 0x16, 0x00, 0x24, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xda, 0xff, 0xfd, 0xff, 0xc1, 0xff, 0xef, 0xff, 0xac, 0xff, 0xdc, 0xff, 0x9e, 0xff, 0xc9, 0xff, 0x9a, 0xff, 0xbb, 0xff, 0x9b, 0xff, 0xb2, 0xff, 0x9c, 0xff, 0xaf, 0xff, 0x96, 0xff, 0xb0, 0xff, 0x86, 0xff, 0xb2, 0xff, 0x70, 0xff, 0xb3, 0xff, 0x57, 0xff, 0xad, 0xff, 0x45, 0xff, 0xa3, 0xff, 0x3e, 0xff, 0x96, 0xff, 0x41, 0xff, 0x87, 0xff, 0x4a, 0xff, 0x78, 0xff, 0x51, 0xff, 0x6d, 0xff, 0x52, 0xff, 0x69, 0xff, 0x4e, 0xff, 0x6d, 0xff, 0x47, 0xff, 0x76, 0xff, 0x43, 0xff, 0x7e, 0xff, 0x48, 0xff, 0x82, 0xff, 0x57, 0xff, 0x7f, 0xff, 0x6f, 0xff, 0x78, 0xff, 0x89, 0xff, 0x6f, 0xff, 0xa1, 0xff, 0x68, 0xff, 0xb1, 0xff, 0x64, 0xff, 0xbc, 0xff, 0x65, 0xff, 0xc3, 0xff, 0x69, 0xff, 0xca, 0xff, 0x6e, 0xff, 0xd7, 0xff, 0x74, 0xff, 0xec, 0xff, 0x79, 0xff, 0x07, 0x00, 0x7d, 0xff, 0x20, 0x00, 0x7c, 0xff, 0x34, 0x00, 0x76, 0xff, 0x42, 0x00, 0x71, 0xff, 0x4e, 0x00, 0x71, 0xff, 0x59, 0x00, 0x78, 0xff, 0x63, 0x00, 0x83, 0xff, 0x6d, 0x00, 0x91, 0xff, 0x77, 0x00, 0x9c, 0xff, 0x81, 0x00, 0xa4, 0xff, 0x8c, 0x00, 0xa8, 0xff, 0x96, 0x00, 0xaa, 0xff, 0x9f, 0x00, 0xac, 0xff, 0xa8, 0x00, 0xb2, 0xff, 0xb2, 0x00, 0xbe, 0xff, 0xbc, 0x00, 0xd3, 0xff, 0xc5, 0x00, 0xed, 0xff, 0xca, 0x00, 0x08, 0x00, 0xcc, 0x00, 0x1e, 0x00, 0xcd, 0x00, 0x2b, 0x00, 0xcd, 0x00, 0x2f, 0x00, 0xcd, 0x00, 0x2d, 0x00, 0xcf, 0x00, 0x2c, 0x00, 0xd2, 0x00, 0x2f, 0x00, 0xd5, 0x00, 0x3a, 0x00, 0xd7, 0x00, 0x4c, 0x00, 0xd6, 0x00, 0x5f, 0x00, 0xd0, 0x00, 0x6f, 0x00, 0xc8, 0x00, 0x78, 0x00, 0xbe, 0x00, 0x79, 0x00, 0xb1, 0x00, 0x72, 0x00, 0xa1, 0x00, 0x65, 0x00, 0x91, 0x00, 0x58, 0x00, 0x84, 0x00, 0x50, 0x00, 0x79, 0x00, 0x4b, 0x00, 0x6f, 0x00, 0x4c, 0x00, 0x64, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x51, 0x00, 0x43, 0x00, 0x50, 0x00, 0x30, 0x00, 0x4c, 0x00, 0x1d, 0x00, 0x44, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0xfe, 0xff, 0x31, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xe8, 0xff, 0x2a, 0x00, 0xda, 0xff, 0x2b, 0x00, 0xc8, 0xff, 0x2d, 0x00, 0xb5, 0xff, 0x30, 0x00, 0xa3, 0xff, 0x2e, 0x00, 0x93, 0xff, 0x27, 0x00, 0x89, 0xff, 0x1d, 0x00, 0x84, 0xff, 0x10, 0x00, 0x82, 0xff, 0x05, 0x00, 0x81, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xfe, 0xff, 0x72, 0xff, 0x01, 0x00, 0x65, 0xff, 0x02, 0x00, 0x59, 0xff, 0x01, 0x00, 0x54, 0xff, 0xfb, 0xff, 0x56, 0xff, 0xf2, 0xff, 0x5e, 0xff, 0xe8, 0xff, 0x68, 0xff, 0xe2, 0xff, 0x71, 0xff, 0xde, 0xff, 0x72, 0xff, 0xd9, 0xff, 0x6f, 0xff, 0xd5, 0xff, 0x6b, 0xff, 0xd0, 0xff, 0x68, 0xff, 0xcb, 0xff, 0x6c, 0xff, 0xc8, 0xff, 0x76, 0xff, 0xc6, 0xff, 0x81, 0xff, 0xc6, 0xff, 0x8a, 0xff, 0xc6, 0xff, 0x8f, 0xff, 0xc8, 0xff, 0x91, 0xff, 0xca, 0xff, 0x92, 0xff, 0xc9, 0xff, 0x96, 0xff, 0xc9, 0xff, 0xa1, 0xff, 0xcb, 0xff, 0xb4, 0xff, 0xd2, 0xff, 0xcb, 0xff, 0xdc, 0xff, 0xe0, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x09, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x14, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x26, 0x00, 0x43, 0x00, 0x30, 0x00, 0x59, 0x00, 0x3a, 0x00, 0x6c, 0x00, 0x40, 0x00, 0x78, 0x00, 0x41, 0x00, 0x7c, 0x00, 0x3f, 0x00, 0x7d, 0x00, 0x3f, 0x00, 0x7c, 0x00, 0x42, 0x00, 0x7c, 0x00, 0x4a, 0x00, 0x7e, 0x00, 0x51, 0x00, 0x81, 0x00, 0x54, 0x00, 0x85, 0x00, 0x55, 0x00, 0x88, 0x00, 0x51, 0x00, 0x89, 0x00, 0x4b, 0x00, 0x85, 0x00, 0x47, 0x00, 0x7d, 0x00, 0x47, 0x00, 0x71, 0x00, 0x4b, 0x00, 0x66, 0x00, 0x55, 0x00, 0x5d, 0x00, 0x60, 0x00, 0x56, 0x00, 0x65, 0x00, 0x51, 0x00, 0x65, 0x00, 0x4b, 0x00, 0x5e, 0x00, 0x3f, 0x00, 0x54, 0x00, 0x2f, 0x00, 0x4d, 0x00, 0x18, 0x00, 0x48, 0x00, 0x01, 0x00, 0x46, 0x00, 0xed, 0xff, 0x45, 0x00, 0xe2, 0xff, 0x44, 0x00, 0xe0, 0xff, 0x41, 0x00, 0xe0, 0xff, 0x3b, 0x00, 0xdd, 0xff, 0x2f, 0x00, 0xd2, 0xff, 0x21, 0x00, 0xbf, 0xff, 0x13, 0x00, 0xa7, 0xff, 0x06, 0x00, 0x8f, 0xff, 0xfd, 0xff, 0x7e, 0xff, 0xfa, 0xff, 0x77, 0xff, 0xfb, 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0x05, 0x00, 0x89, 0xff, 0x08, 0x00, 0x8d, 0xff, 0x06, 0x00, 0x8c, 0xff, 0xfe, 0xff, 0x86, 0xff, 0xef, 0xff, 0x7e, 0xff, 0xdf, 0xff, 0x79, 0xff, 0xd3, 0xff, 0x79, 0xff, 0xcf, 0xff, 0x7e, 0xff, 0xd1, 0xff, 0x86, 0xff, 0xd7, 0xff, 0x90, 0xff, 0xdd, 0xff, 0x9a, 0xff, 0xdc, 0xff, 0x9e, 0xff, 0xd0, 0xff, 0x9f, 0xff, 0xbe, 0xff, 0xa1, 0xff, 0xaa, 0xff, 0xa3, 0xff, 0x9a, 0xff, 0xa6, 0xff, 0x91, 0xff, 0xaa, 0xff, 0x90, 0xff, 0xb3, 0xff, 0x95, 0xff, 0xbf, 0xff, 0x9a, 0xff, 0xcc, 0xff, 0x9a, 0xff, 0xd8, 0xff, 0x92, 0xff, 0xe0, 0xff, 0x87, 0xff, 0xe4, 0xff, 0x7b, 0xff, 0xe3, 0xff, 0x72, 0xff, 0xe1, 0xff, 0x70, 0xff, 0xe1, 0xff, 0x75, 0xff, 0xe5, 0xff, 0x7f, 0xff, 0xef, 0xff, 0x8b, 0xff, 0xfc, 0xff, 0x93, 0xff, 0x0b, 0x00, 0x98, 0xff, 0x18, 0x00, 0x9a, 0xff, 0x21, 0x00, 0x9c, 0xff, 0x24, 0x00, 0xa1, 0xff, 0x26, 0x00, 0xac, 0xff, 0x2a, 0x00, 0xbc, 0xff, 0x32, 0x00, 0xcf, 0xff, 0x3e, 0x00, 0xe2, 0xff, 0x4c, 0x00, 0xf4, 0xff, 0x5a, 0x00, 0x04, 0x00, 0x66, 0x00, 0x13, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x6e, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0x3c, 0x00, 0x72, 0x00, 0x49, 0x00, 0x77, 0x00, 0x53, 0x00, 0x7f, 0x00, 0x5a, 0x00, 0x88, 0x00, 0x5f, 0x00, 0x92, 0x00, 0x63, 0x00, 0x99, 0x00, 0x66, 0x00, 0x9c, 0x00, 0x69, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x98, 0x00, 0x69, 0x00, 0x90, 0x00, 0x65, 0x00, 0x85, 0x00, 0x5e, 0x00, 0x79, 0x00, 0x54, 0x00, 0x6f, 0x00, 0x4a, 0x00, 0x69, 0x00, 0x42, 0x00, 0x66, 0x00, 0x3a, 0x00, 0x62, 0x00, 0x33, 0x00, 0x5a, 0x00, 0x2e, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x30, 0x00, 0xf0, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x32, 0x00, 0xda, 0xff, 0x32, 0x00, 0xdc, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x30, 0x00, 0xe0, 0xff, 0x2e, 0x00, 0xd7, 0xff, 0x2e, 0x00, 0xc4, 0xff, 0x2f, 0x00, 0xac, 0xff, 0x2f, 0x00, 0x97, 0xff, 0x30, 0x00, 0x8d, 0xff, 0x32, 0x00, 0x8c, 0xff, 0x31, 0x00, 0x91, 0xff, 0x2a, 0x00, 0x99, 0xff, 0x1e, 0x00, 0x9d, 0xff, 0x0f, 0x00, 0x97, 0xff, 0xff, 0xff, 0x88, 0xff, 0xf1, 0xff, 0x76, 0xff, 0xe9, 0xff, 0x68, 0xff, 0xe7, 0xff, 0x61, 0xff, 0xeb, 0xff, 0x65, 0xff, 0xf1, 0xff, 0x71, 0xff, 0xf7, 0xff, 0x80, 0xff, 0xf9, 0xff, 0x8c, 0xff, 0xf5, 0xff, 0x92, 0xff, 0xee, 0xff, 0x91, 0xff, 0xe8, 0xff, 0x8d, 0xff, 0xe7, 0xff, 0x8a, 0xff, 0xec, 0xff, 0x8b, 0xff, 0xf6, 0xff, 0x93, 0xff, 0x01, 0x00, 0xa0, 0xff, 0x09, 0x00, 0xaf, 0xff, 0x0c, 0x00, 0xbe, 0xff, 0x09, 0x00, 0xcb, 0xff, 0x03, 0x00, 0xd4, 0xff, 0xfc, 0xff, 0xdb, 0xff, 0xf9, 0xff, 0xe1, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0x03, 0x00, 0xea, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x12, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x2e, 0x00, 0xff, 0xff, 0x39, 0x00, 0xf6, 0xff, 0x3e, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0xee, 0xff, 0x40, 0x00, 0xf2, 0xff, 0x45, 0x00, 0xf8, 0xff, 0x4d, 0x00, 0xfd, 0xff, 0x58, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x72, 0x00, 0xfd, 0xff, 0x78, 0x00, 0xf7, 0xff, 0x77, 0x00, 0xf1, 0xff, 0x71, 0x00, 0xee, 0xff, 0x6c, 0x00, 0xf2, 0xff, 0x6a, 0x00, 0xfc, 0xff, 0x6c, 0x00, 0x08, 0x00, 0x70, 0x00, 0x11, 0x00, 0x74, 0x00, 0x16, 0x00, 0x76, 0x00, 0x16, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6c, 0x00, 0x10, 0x00, 0x61, 0x00, 0x0e, 0x00, 0x55, 0x00, 0x11, 0x00, 0x4a, 0x00, 0x15, 0x00, 0x40, 0x00, 0x19, 0x00, 0x37, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x19, 0x00, 0x27, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x10, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xe6, 0xff, 0xf9, 0xff, 0xe1, 0xff, 0xf0, 0xff, 0xe3, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xf1, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd2, 0xff, 0xef, 0xff, 0xcc, 0xff, 0xe7, 0xff, 0xc9, 0xff, 0xde, 0xff, 0xc7, 0xff, 0xd7, 0xff, 0xc4, 0xff, 0xd1, 0xff, 0xc0, 0xff, 0xcf, 0xff, 0xbb, 0xff, 0xd1, 0xff, 0xb8, 0xff, 0xd6, 0xff, 0xb5, 0xff, 0xda, 0xff, 0xb5, 0xff, 0xdd, 0xff, 0xb7, 0xff, 0xde, 0xff, 0xbc, 0xff, 0xdc, 0xff, 0xc3, 0xff, 0xd7, 0xff, 0xc7, 0xff, 0xcf, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc5, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc9, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xe7, 0xff, 0xd3, 0xff, 0xeb, 0xff, 0xce, 0xff, 0xea, 0xff, 0xc9, 0xff, 0xe9, 0xff, 0xca, 0xff, 0xec, 0xff, 0xd0, 0xff, 0xf3, 0xff, 0xd8, 0xff, 0xfd, 0xff, 0xde, 0xff, 0x07, 0x00, 0xe0, 0xff, 0x10, 0x00, 0xdf, 0xff, 0x16, 0x00, 0xdb, 0xff, 0x1a, 0x00, 0xd8, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x1c, 0x00, 0xdf, 0xff, 0x1d, 0x00, 0xe7, 0xff, 0x24, 0x00, 0xf1, 0xff, 0x31, 0x00, 0xfb, 0xff, 0x41, 0x00, 0xff, 0xff, 0x50, 0x00, 0xfe, 0xff, 0x5b, 0x00, 0xfc, 0xff, 0x62, 0x00, 0xfc, 0xff, 0x66, 0x00, 0xff, 0xff, 0x6b, 0x00, 0x07, 0x00, 0x70, 0x00, 0x11, 0x00, 0x76, 0x00, 0x1a, 0x00, 0x7d, 0x00, 0x21, 0x00, 0x83, 0x00, 0x22, 0x00, 0x87, 0x00, 0x1e, 0x00, 0x88, 0x00, 0x18, 0x00, 0x84, 0x00, 0x12, 0x00, 0x7d, 0x00, 0x10, 0x00, 0x76, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x18, 0x00, 0x68, 0x00, 0x1e, 0x00, 0x62, 0x00, 0x23, 0x00, 0x5e, 0x00, 0x27, 0x00, 0x5a, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x4d, 0x00, 0x28, 0x00, 0x40, 0x00, 0x25, 0x00, 0x32, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x16, 0x00, 0x34, 0x00, 0x13, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x42, 0x00, 0x0b, 0x00, 0x46, 0x00, 0x05, 0x00, 0x47, 0x00, 0xfb, 0xff, 0x44, 0x00, 0xed, 0xff, 0x3f, 0x00, 0xde, 0xff, 0x3b, 0x00, 0xcf, 0xff, 0x38, 0x00, 0xc2, 0xff, 0x39, 0x00, 0xba, 0xff, 0x3c, 0x00, 0xb5, 0xff, 0x3e, 0x00, 0xb1, 0xff, 0x3d, 0x00, 0xab, 0xff, 0x36, 0x00, 0xa2, 0xff, 0x2b, 0x00, 0x97, 0xff, 0x1e, 0x00, 0x8a, 0xff, 0x14, 0x00, 0x81, 0xff, 0x10, 0x00, 0x7b, 0xff, 0x11, 0x00, 0x78, 0xff, 0x17, 0x00, 0x78, 0xff, 0x1d, 0x00, 0x7a, 0xff, 0x21, 0x00, 0x7c, 0xff, 0x1f, 0x00, 0x7d, 0xff, 0x18, 0x00, 0x7e, 0xff, 0x10, 0x00, 0x7f, 0xff, 0x0a, 0x00, 0x80, 0xff, 0x04, 0x00, 0x82, 0xff, 0x02, 0x00, 0x86, 0xff, 0x04, 0x00, 0x8c, 0xff, 0x08, 0x00, 0x92, 0xff, 0x0b, 0x00, 0x9a, 0xff, 0x0b, 0x00, 0xa5, 0xff, 0x09, 0x00, 0xb1, 0xff, 0x03, 0x00, 0xbe, 0xff, 0xfb, 0xff, 0xcd, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x1c, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x08, 0x00, 0x47, 0x00, 0x02, 0x00, 0x4e, 0x00, 0xf7, 0xff, 0x4f, 0x00, 0xec, 0xff, 0x4b, 0x00, 0xe3, 0xff, 0x44, 0x00, 0xde, 0xff, 0x3f, 0x00, 0xdc, 0xff, 0x3f, 0x00, 0xde, 0xff, 0x46, 0x00, 0xe5, 0xff, 0x51, 0x00, 0xed, 0xff, 0x59, 0x00, 0xf0, 0xff, 0x5d, 0x00, 0xef, 0xff, 0x5b, 0x00, 0xea, 0xff, 0x51, 0x00, 0xe2, 0xff, 0x44, 0x00, 0xde, 0xff, 0x3a, 0x00, 0xdf, 0xff, 0x37, 0x00, 0xe6, 0xff, 0x3c, 0x00, 0xef, 0xff, 0x46, 0x00, 0xf9, 0xff, 0x52, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x07, 0x00, 0x55, 0x00, 0x04, 0x00, 0x4a, 0x00, 0xff, 0xff, 0x40, 0x00, 0xfc, 0xff, 0x3b, 0x00, 0xfe, 0xff, 0x3d, 0x00, 0x04, 0x00, 0x45, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x17, 0x00, 0x4e, 0x00, 0x1b, 0x00, 0x48, 0x00, 0x1a, 0x00, 0x3a, 0x00, 0x16, 0x00, 0x2a, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x05, 0x00, 0x13, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xed, 0xff, 0x11, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xc7, 0xff, 0x0a, 0x00, 0xb7, 0xff, 0x05, 0x00, 0xac, 0xff, 0x00, 0x00, 0xa4, 0xff, 0xf8, 0xff, 0x9c, 0xff, 0xf0, 0xff, 0x92, 0xff, 0xe9, 0xff, 0x88, 0xff, 0xe6, 0xff, 0x7d, 0xff, 0xe6, 0xff, 0x71, 0xff, 0xe6, 0xff, 0x67, 0xff, 0xe5, 0xff, 0x61, 0xff, 0xe1, 0xff, 0x60, 0xff, 0xdd, 0xff, 0x64, 0xff, 0xda, 0xff, 0x6a, 0xff, 0xd8, 0xff, 0x71, 0xff, 0xd9, 0xff, 0x77, 0xff, 0xdb, 0xff, 0x79, 0xff, 0xdb, 0xff, 0x79, 0xff, 0xda, 0xff, 0x7a, 0xff, 0xda, 0xff, 0x7e, 0xff, 0xd9, 0xff, 0x86, 0xff, 0xd9, 0xff, 0x93, 0xff, 0xd9, 0xff, 0xa4, 0xff, 0xd9, 0xff, 0xb4, 0xff, 0xd8, 0xff, 0xc2, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xd2, 0xff, 0xd3, 0xff, 0xce, 0xff, 0xd6, 0xff, 0xca, 0xff, 0xd9, 0xff, 0xc8, 0xff, 0xdf, 0xff, 0xc9, 0xff, 0xe8, 0xff, 0xcb, 0xff, 0xf4, 0xff, 0xcd, 0xff, 0x02, 0x00, 0xcc, 0xff, 0x10, 0x00, 0xc8, 0xff, 0x1b, 0x00, 0xc2, 0xff, 0x22, 0x00, 0xbc, 0xff, 0x28, 0x00, 0xb8, 0xff, 0x2c, 0x00, 0xba, 0xff, 0x2f, 0x00, 0xbe, 0xff, 0x32, 0x00, 0xc5, 0xff, 0x38, 0x00, 0xca, 0xff, 0x3f, 0x00, 0xcf, 0xff, 0x49, 0x00, 0xd2, 0xff, 0x52, 0x00, 0xd2, 0xff, 0x5a, 0x00, 0xd1, 0xff, 0x62, 0x00, 0xd2, 0xff, 0x69, 0x00, 0xd5, 0xff, 0x6e, 0x00, 0xda, 0xff, 0x6f, 0x00, 0xe0, 0xff, 0x71, 0x00, 0xe6, 0xff, 0x73, 0x00, 0xec, 0xff, 0x78, 0x00, 0xf2, 0xff, 0x7f, 0x00, 0xf7, 0xff, 0x86, 0x00, 0xfc, 0xff, 0x8b, 0x00, 0x01, 0x00, 0x8d, 0x00, 0x05, 0x00, 0x89, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x0b, 0x00, 0x74, 0x00, 0x0e, 0x00, 0x6a, 0x00, 0x13, 0x00, 0x64, 0x00, 0x1a, 0x00, 0x61, 0x00, 0x25, 0x00, 0x5f, 0x00, 0x30, 0x00, 0x5a, 0x00, 0x39, 0x00, 0x4f, 0x00, 0x3d, 0x00, 0x3f, 0x00, 0x3d, 0x00, 0x2c, 0x00, 0x3b, 0x00, 0x19, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x41, 0x00, 0xfe, 0xff, 0x48, 0x00, 0xf8, 0xff, 0x52, 0x00, 0xf8, 0xff, 0x5d, 0x00, 0xfa, 0xff, 0x66, 0x00, 0xfa, 0xff, 0x6a, 0x00, 0xf2, 0xff, 0x67, 0x00, 0xe4, 0xff, 0x5e, 0x00, 0xd3, 0xff, 0x53, 0x00, 0xc4, 0xff, 0x4c, 0x00, 0xbb, 0xff, 0x49, 0x00, 0xba, 0xff, 0x4b, 0x00, 0xbe, 0xff, 0x4f, 0x00, 0xc3, 0xff, 0x50, 0x00, 0xc6, 0xff, 0x4e, 0x00, 0xc5, 0xff, 0x49, 0x00, 0xbe, 0xff, 0x42, 0x00, 0xb2, 0xff, 0x39, 0x00, 0xa5, 0xff, 0x30, 0x00, 0x99, 0xff, 0x26, 0x00, 0x94, 0xff, 0x1f, 0x00, 0x95, 0xff, 0x1b, 0x00, 0x9b, 0xff, 0x1c, 0x00, 0xa2, 0xff, 0x1f, 0x00, 0xa4, 0xff, 0x22, 0x00, 0xa0, 0xff, 0x23, 0x00, 0x99, 0xff, 0x21, 0x00, 0x91, 0xff, 0x1c, 0x00, 0x8d, 0xff, 0x12, 0x00, 0x8e, 0xff, 0x07, 0x00, 0x94, 0xff, 0xfe, 0xff, 0x9e, 0xff, 0xfb, 0xff, 0xa9, 0xff, 0xfd, 0xff, 0xb3, 0xff, 0x05, 0x00, 0xbc, 0xff, 0x0d, 0x00, 0xc4, 0xff, 0x13, 0x00, 0xcc, 0xff, 0x14, 0x00, 0xd5, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xeb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf8, 0xff, 0x26, 0x00, 0xfc, 0xff, 0x30, 0x00, 0xfd, 0xff, 0x39, 0x00, 0xfb, 0xff, 0x41, 0x00, 0xf7, 0xff, 0x4a, 0x00, 0xf2, 0xff, 0x53, 0x00, 0xee, 0xff, 0x5b, 0x00, 0xea, 0xff, 0x61, 0x00, 0xe6, 0xff, 0x64, 0x00, 0xe3, 0xff, 0x66, 0x00, 0xe1, 0xff, 0x65, 0x00, 0xe0, 0xff, 0x64, 0x00, 0xde, 0xff, 0x65, 0x00, 0xdc, 0xff, 0x66, 0x00, 0xdb, 0xff, 0x67, 0x00, 0xdb, 0xff, 0x6a, 0x00, 0xdc, 0xff, 0x6c, 0x00, 0xde, 0xff, 0x6c, 0x00, 0xe0, 0xff, 0x68, 0x00, 0xe0, 0xff, 0x61, 0x00, 0xde, 0xff, 0x58, 0x00, 0xda, 0xff, 0x50, 0x00, 0xd8, 0xff, 0x4a, 0x00, 0xd9, 0xff, 0x47, 0x00, 0xdd, 0xff, 0x45, 0x00, 0xe4, 0xff, 0x43, 0x00, 0xea, 0xff, 0x41, 0x00, 0xee, 0xff, 0x3e, 0x00, 0xf0, 0xff, 0x3a, 0x00, 0xf0, 0xff, 0x33, 0x00, 0xef, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x24, 0x00, 0xed, 0xff, 0x1e, 0x00, 0xf0, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x04, 0x00, 0x23, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x16, 0x00, 0x04, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xea, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xcd, 0xff, 0xdc, 0xff, 0xbf, 0xff, 0xd6, 0xff, 0xb1, 0xff, 0xcf, 0xff, 0xa6, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0xcb, 0xff, 0x9e, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0xcd, 0xff, 0xa4, 0xff, 0xcd, 0xff, 0xa7, 0xff, 0xcd, 0xff, 0xa8, 0xff, 0xcd, 0xff, 0xa8, 0xff, 0xcd, 0xff, 0xa8, 0xff, 0xd1, 0xff, 0xa9, 0xff, 0xd7, 0xff, 0xac, 0xff, 0xde, 0xff, 0xb3, 0xff, 0xe5, 0xff, 0xbe, 0xff, 0xe9, 0xff, 0xc8, 0xff, 0xeb, 0xff, 0xd0, 0xff, 0xeb, 0xff, 0xd6, 0xff, 0xed, 0xff, 0xda, 0xff, 0xf1, 0xff, 0xdc, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xfd, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xed, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x15, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x05, 0x00, 0x1c, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x12, 0x00, 0x29, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x25, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x29, 0x00, 0x27, 0x00, 0x29, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x28, 0x00, 0x30, 0x00, 0x24, 0x00, 0x35, 0x00, 0x1f, 0x00, 0x39, 0x00, 0x19, 0x00, 0x3b, 0x00, 0x15, 0x00, 0x3b, 0x00, 0x15, 0x00, 0x39, 0x00, 0x16, 0x00, 0x37, 0x00, 0x17, 0x00, 0x34, 0x00, 0x15, 0x00, 0x33, 0x00, 0x11, 0x00, 0x34, 0x00, 0x0a, 0x00, 0x36, 0x00, 0x02, 0x00, 0x37, 0x00, 0xfb, 0xff, 0x35, 0x00, 0xf5, 0xff, 0x32, 0x00, 0xf1, 0xff, 0x2d, 0x00, 0xef, 0xff, 0x28, 0x00, 0xed, 0xff, 0x25, 0x00, 0xea, 0xff, 0x24, 0x00, 0xe7, 0xff, 0x25, 0x00, 0xe3, 0xff, 0x25, 0x00, 0xde, 0xff, 0x25, 0x00, 0xd7, 0xff, 0x22, 0x00, 0xcf, 0xff, 0x1d, 0x00, 0xc6, 0xff, 0x16, 0x00, 0xbd, 0xff, 0x10, 0x00, 0xb6, 0xff, 0x0b, 0x00, 0xb0, 0xff, 0x08, 0x00, 0xac, 0xff, 0x05, 0x00, 0xab, 0xff, 0x03, 0x00, 0xac, 0xff, 0x02, 0x00, 0xad, 0xff, 0x01, 0x00, 0xab, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xf6, 0xff, 0x9f, 0xff, 0xed, 0xff, 0x9a, 0xff, 0xe4, 0xff, 0x9a, 0xff, 0xdd, 0xff, 0x9e, 0xff, 0xd9, 0xff, 0xa7, 0xff, 0xd9, 0xff, 0xb2, 0xff, 0xdd, 0xff, 0xb9, 0xff, 0xe0, 0xff, 0xbd, 0xff, 0xe1, 0xff, 0xbf, 0xff, 0xe0, 0xff, 0xc1, 0xff, 0xdd, 0xff, 0xc4, 0xff, 0xd8, 0xff, 0xc9, 0xff, 0xd3, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xdd, 0xff, 0xd4, 0xff, 0xe8, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xde, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xfe, 0xff, 0xe1, 0xff, 0x02, 0x00, 0xde, 0xff, 0x07, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xd8, 0xff, 0x13, 0x00, 0xd8, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x24, 0x00, 0xdb, 0xff, 0x2c, 0x00, 0xdc, 0xff, 0x33, 0x00, 0xda, 0xff, 0x38, 0x00, 0xd6, 0xff, 0x3e, 0x00, 0xd1, 0xff, 0x43, 0x00, 0xcb, 0xff, 0x46, 0x00, 0xc6, 0xff, 0x46, 0x00, 0xc2, 0xff, 0x43, 0x00, 0xc1, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0x3d, 0x00, 0xc2, 0xff, 0x3f, 0x00, 0xc5, 0xff, 0x44, 0x00, 0xca, 0xff, 0x49, 0x00, 0xce, 0xff, 0x4c, 0x00, 0xd1, 0xff, 0x4d, 0x00, 0xd5, 0xff, 0x4c, 0x00, 0xda, 0xff, 0x4a, 0x00, 0xe1, 0xff, 0x47, 0x00, 0xe9, 0xff, 0x45, 0x00, 0xf1, 0xff, 0x46, 0x00, 0xfb, 0xff, 0x48, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x48, 0x00, 0x1a, 0x00, 0x43, 0x00, 0x1e, 0x00, 0x3d, 0x00, 0x21, 0x00, 0x36, 0x00, 0x25, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x32, 0x00, 0x29, 0x00, 0x38, 0x00, 0x26, 0x00, 0x3b, 0x00, 0x21, 0x00, 0x3a, 0x00, 0x1c, 0x00, 0x36, 0x00, 0x16, 0x00, 0x33, 0x00, 0x10, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x34, 0x00, 0x05, 0x00, 0x37, 0x00, 0xff, 0xff, 0x3a, 0x00, 0xf9, 0xff, 0x3a, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xef, 0xff, 0x30, 0x00, 0xec, 0xff, 0x29, 0x00, 0xe9, 0xff, 0x23, 0x00, 0xe6, 0xff, 0x1d, 0x00, 0xe0, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x16, 0x00, 0xd3, 0xff, 0x14, 0x00, 0xcc, 0xff, 0x11, 0x00, 0xc7, 0xff, 0x0c, 0x00, 0xc5, 0xff, 0x08, 0x00, 0xc5, 0xff, 0x06, 0x00, 0xc5, 0xff, 0x04, 0x00, 0xc5, 0xff, 0x03, 0x00, 0xc5, 0xff, 0x02, 0x00, 0xc3, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xfa, 0xff, 0xbe, 0xff, 0xf5, 0xff, 0xbd, 0xff, 0xf1, 0xff, 0xbe, 0xff, 0xed, 0xff, 0xc0, 0xff, 0xeb, 0xff, 0xc3, 0xff, 0xe9, 0xff, 0xc8, 0xff, 0xe8, 0xff, 0xcc, 0xff, 0xe6, 0xff, 0xcf, 0xff, 0xe3, 0xff, 0xd3, 0xff, 0xdf, 0xff, 0xd9, 0xff, 0xdd, 0xff, 0xe2, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xe5, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x09, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xee, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0x06, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x13, 0x00, 0x19, 0x00, 0x12, 0x00, 0x14, 0x00, 0x11, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x18, 0x00, 0xfe, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x14, 0x00, 0x09, 0x00, 0x18, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x04, 0x00, 0x25, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x34, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x26, 0x00, 0x42, 0x00, 0x2c, 0x00, 0x46, 0x00, 0x30, 0x00, 0x45, 0x00, 0x32, 0x00, 0x41, 0x00, 0x34, 0x00, 0x3b, 0x00, 0x38, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x32, 0x00, 0x46, 0x00, 0x2f, 0x00, 0x4b, 0x00, 0x2d, 0x00, 0x4e, 0x00, 0x2b, 0x00, 0x4e, 0x00, 0x26, 0x00, 0x4b, 0x00, 0x1f, 0x00, 0x47, 0x00, 0x16, 0x00, 0x43, 0x00, 0x0d, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3c, 0x00, 0xfd, 0xff, 0x38, 0x00, 0xf9, 0xff, 0x32, 0x00, 0xf7, 0xff, 0x27, 0x00, 0xf4, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf2, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xed, 0xff, 0xec, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xed, 0xff, 0xd5, 0xff, 0xf0, 0xff, 0xd3, 0xff, 0xf5, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xfd, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xe1, 0xff, 0xf9, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xf8, 0xff, 0xde, 0xff, 0xf9, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xf5, 0xff, 0xd3, 0xff, 0xf2, 0xff, 0xd0, 0xff, 0xf1, 0xff, 0xcf, 0xff, 0xf0, 0xff, 0xcd, 0xff, 0xf1, 0xff, 0xca, 0xff, 0xf4, 0xff, 0xc6, 0xff, 0xfa, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xbc, 0xff, 0x04, 0x00, 0xb7, 0xff, 0x08, 0x00, 0xb6, 0xff, 0x0c, 0x00, 0xb7, 0xff, 0x10, 0x00, 0xba, 0xff, 0x16, 0x00, 0xbe, 0xff, 0x1c, 0x00, 0xc1, 0xff, 0x1f, 0x00, 0xc2, 0xff, 0x21, 0x00, 0xc1, 0xff, 0x22, 0x00, 0xc0, 0xff, 0x22, 0x00, 0xbf, 0xff, 0x23, 0x00, 0xc0, 0xff, 0x24, 0x00, 0xc2, 0xff, 0x26, 0x00, 0xc8, 0xff, 0x28, 0x00, 0xcf, 0xff, 0x2a, 0x00, 0xd6, 0xff, 0x2b, 0x00, 0xdd, 0xff, 0x2a, 0x00, 0xe2, 0xff, 0x26, 0x00, 0xe5, 0xff, 0x21, 0x00, 0xe6, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x16, 0x00, 0xea, 0xff, 0x12, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0x05, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x13, 0x00, 0x19, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x13, 0x00, 0x10, 0x00, 0x16, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x06, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xf6, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x05, 0x00, 0xe3, 0xff, 0x03, 0x00, 0xde, 0xff, 0x00, 0x00, 0xd9, 0xff, 0x00, 0x00, 0xd6, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfe, 0xff, 0xd1, 0xff, 0xfc, 0xff, 0xd3, 0xff, 0xfa, 0xff, 0xd6, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe3, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xeb, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xd5, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xd3, 0xff, 0xda, 0xff, 0xd3, 0xff, 0xd5, 0xff, 0xd3, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xd2, 0xff, 0xc2, 0xff, 0xd3, 0xff, 0xbe, 0xff, 0xd5, 0xff, 0xbb, 0xff, 0xd8, 0xff, 0xbb, 0xff, 0xde, 0xff, 0xbd, 0xff, 0xe6, 0xff, 0xc1, 0xff, 0xef, 0xff, 0xc6, 0xff, 0xf7, 0xff, 0xca, 0xff, 0xff, 0xff, 0xcd, 0xff, 0x05, 0x00, 0xd0, 0xff, 0x0d, 0x00, 0xd5, 0xff, 0x17, 0x00, 0xdd, 0xff, 0x24, 0x00, 0xe5, 0xff, 0x33, 0x00, 0xeb, 0xff, 0x41, 0x00, 0xee, 0xff, 0x4c, 0x00, 0xf1, 0xff, 0x56, 0x00, 0xf8, 0xff, 0x5e, 0x00, 0x02, 0x00, 0x66, 0x00, 0x0d, 0x00, 0x6e, 0x00, 0x14, 0x00, 0x74, 0x00, 0x15, 0x00, 0x7a, 0x00, 0x12, 0x00, 0x7f, 0x00, 0x0f, 0x00, 0x85, 0x00, 0x0e, 0x00, 0x8c, 0x00, 0x0e, 0x00, 0x91, 0x00, 0x0f, 0x00, 0x92, 0x00, 0x10, 0x00, 0x8d, 0x00, 0x0f, 0x00, 0x86, 0x00, 0x0f, 0x00, 0x7e, 0x00, 0x0d, 0x00, 0x79, 0x00, 0x0a, 0x00, 0x76, 0x00, 0x05, 0x00, 0x76, 0x00, 0x00, 0x00, 0x76, 0x00, 0xfb, 0xff, 0x75, 0x00, 0xf7, 0xff, 0x71, 0x00, 0xf3, 0xff, 0x6a, 0x00, 0xef, 0xff, 0x5d, 0x00, 0xea, 0xff, 0x4f, 0x00, 0xe7, 0xff, 0x41, 0x00, 0xe7, 0xff, 0x37, 0x00, 0xe8, 0xff, 0x33, 0x00, 0xeb, 0xff, 0x31, 0x00, 0xec, 0xff, 0x2f, 0x00, 0xec, 0xff, 0x2b, 0x00, 0xeb, 0xff, 0x22, 0x00, 0xec, 0xff, 0x16, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xdb, 0xff, 0xee, 0xff, 0xd8, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xd4, 0xff, 0xef, 0xff, 0xd2, 0xff, 0xe7, 0xff, 0xcf, 0xff, 0xdd, 0xff, 0xcc, 0xff, 0xd3, 0xff, 0xca, 0xff, 0xcc, 0xff, 0xca, 0xff, 0xc9, 0xff, 0xcc, 0xff, 0xca, 0xff, 0xd3, 0xff, 0xce, 0xff, 0xda, 0xff, 0xd1, 0xff, 0xe2, 0xff, 0xd0, 0xff, 0xe9, 0xff, 0xcc, 0xff, 0xed, 0xff, 0xc6, 0xff, 0xf2, 0xff, 0xc1, 0xff, 0xf7, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0xc2, 0xff, 0x07, 0x00, 0xc8, 0xff, 0x11, 0x00, 0xd1, 0xff, 0x1a, 0x00, 0xdb, 0xff, 0x22, 0x00, 0xe4, 0xff, 0x28, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xed, 0xff, 0x30, 0x00, 0xee, 0xff, 0x32, 0x00, 0xee, 0xff, 0x35, 0x00, 0xef, 0xff, 0x39, 0x00, 0xf3, 0xff, 0x3e, 0x00, 0xfb, 0xff, 0x41, 0x00, 0x04, 0x00, 0x42, 0x00, 0x0e, 0x00, 0x3f, 0x00, 0x17, 0x00, 0x3a, 0x00, 0x1e, 0x00, 0x35, 0x00, 0x21, 0x00, 0x30, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x28, 0x00, 0x27, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x31, 0x00, 0x1a, 0x00, 0x31, 0x00, 0x15, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x24, 0x00, 0x06, 0x00, 0x19, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xd9, 0xff, 0xe8, 0xff, 0xce, 0xff, 0xe5, 0xff, 0xc8, 0xff, 0xe2, 0xff, 0xc7, 0xff, 0xe0, 0xff, 0xc7, 0xff, 0xe1, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xc6, 0xff, 0xe6, 0xff, 0xc1, 0xff, 0xe8, 0xff, 0xba, 0xff, 0xe8, 0xff, 0xb4, 0xff, 0xe6, 0xff, 0xb0, 0xff, 0xe2, 0xff, 0xaf, 0xff, 0xdc, 0xff, 0xae, 0xff, 0xd5, 0xff, 0xae, 0xff, 0xd1, 0xff, 0xad, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xd0, 0xff, 0xaa, 0xff, 0xd2, 0xff, 0xa7, 0xff, 0xd6, 0xff, 0xa4, 0xff, 0xd9, 0xff, 0xa2, 0xff, 0xdc, 0xff, 0xa1, 0xff, 0xde, 0xff, 0xa4, 0xff, 0xe1, 0xff, 0xa9, 0xff, 0xe4, 0xff, 0xae, 0xff, 0xe8, 0xff, 0xb4, 0xff, 0xee, 0xff, 0xb9, 0xff, 0xf6, 0xff, 0xbd, 0xff, 0x00, 0x00, 0xc1, 0xff, 0x0c, 0x00, 0xc5, 0xff, 0x18, 0x00, 0xcb, 0xff, 0x21, 0x00, 0xd2, 0xff, 0x28, 0x00, 0xd9, 0xff, 0x2c, 0x00, 0xe1, 0xff, 0x2f, 0x00, 0xeb, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x39, 0x00, 0xfd, 0xff, 0x41, 0x00, 0x04, 0x00, 0x49, 0x00, 0x08, 0x00, 0x50, 0x00, 0x0b, 0x00, 0x55, 0x00, 0x0f, 0x00, 0x58, 0x00, 0x16, 0x00, 0x5a, 0x00, 0x20, 0x00, 0x5d, 0x00, 0x2c, 0x00, 0x5f, 0x00, 0x35, 0x00, 0x62, 0x00, 0x3c, 0x00, 0x66, 0x00, 0x3f, 0x00, 0x6a, 0x00, 0x41, 0x00, 0x6d, 0x00, 0x41, 0x00, 0x6d, 0x00, 0x40, 0x00, 0x6b, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x40, 0x00, 0x6c, 0x00, 0x40, 0x00, 0x6d, 0x00, 0x3f, 0x00, 0x6e, 0x00, 0x3e, 0x00, 0x6d, 0x00, 0x3c, 0x00, 0x69, 0x00, 0x39, 0x00, 0x65, 0x00, 0x35, 0x00, 0x62, 0x00, 0x30, 0x00, 0x5e, 0x00, 0x2b, 0x00, 0x5c, 0x00, 0x26, 0x00, 0x5b, 0x00, 0x22, 0x00, 0x5c, 0x00, 0x20, 0x00, 0x5d, 0x00, 0x21, 0x00, 0x5e, 0x00, 0x24, 0x00, 0x5f, 0x00, 0x29, 0x00, 0x5e, 0x00, 0x2e, 0x00, 0x5d, 0x00, 0x31, 0x00, 0x5b, 0x00, 0x32, 0x00, 0x58, 0x00, 0x32, 0x00, 0x53, 0x00, 0x30, 0x00, 0x4b, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x2d, 0x00, 0x33, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x17, 0x00, 0x2a, 0x00, 0x0a, 0x00, 0x25, 0x00, 0xfd, 0xff, 0x1f, 0x00, 0xef, 0xff, 0x16, 0x00, 0xe3, 0xff, 0x0f, 0x00, 0xd8, 0xff, 0x09, 0x00, 0xce, 0xff, 0x05, 0x00, 0xc5, 0xff, 0x02, 0x00, 0xbb, 0xff, 0xff, 0xff, 0xb1, 0xff, 0xfb, 0xff, 0xa8, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xec, 0xff, 0x99, 0xff, 0xe5, 0xff, 0x97, 0xff, 0xe0, 0xff, 0x96, 0xff, 0xde, 0xff, 0x96, 0xff, 0xdd, 0xff, 0x97, 0xff, 0xdd, 0xff, 0x97, 0xff, 0xdd, 0xff, 0x98, 0xff, 0xdb, 0xff, 0x99, 0xff, 0xd9, 0xff, 0x9c, 0xff, 0xd5, 0xff, 0xa0, 0xff, 0xd0, 0xff, 0xa4, 0xff, 0xcd, 0xff, 0xa9, 0xff, 0xcd, 0xff, 0xb0, 0xff, 0xcd, 0xff, 0xb7, 0xff, 0xcf, 0xff, 0xbf, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xd6, 0xff, 0xd1, 0xff, 0xda, 0xff, 0xda, 0xff, 0xdf, 0xff, 0xe1, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xff, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xf6, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xdf, 0xff, 0xe3, 0xff, 0xd9, 0xff, 0xdc, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcf, 0xff, 0xcd, 0xff, 0xd4, 0xff, 0xce, 0xff, 0xd7, 0xff, 0xcf, 0xff, 0xd8, 0xff, 0xcf, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd1, 0xff, 0xc7, 0xff, 0xcc, 0xff, 0xc2, 0xff, 0xcb, 0xff, 0xbf, 0xff, 0xcd, 0xff, 0xc0, 0xff, 0xd0, 0xff, 0xc6, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0xd4, 0xff, 0xda, 0xff, 0xd3, 0xff, 0xe2, 0xff, 0xd3, 0xff, 0xe7, 0xff, 0xd2, 0xff, 0xe8, 0xff, 0xd3, 0xff, 0xe8, 0xff, 0xd5, 0xff, 0xe7, 0xff, 0xd6, 0xff, 0xe8, 0xff, 0xd8, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xdb, 0xff, 0xfe, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xff, 0xff, 0xee, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x12, 0x00, 0x04, 0x00, 0x17, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x0c, 0x00, 0x29, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x13, 0x00, 0x2e, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x2f, 0x00, 0x36, 0x00, 0x31, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x3b, 0x00, 0x36, 0x00, 0x38, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x42, 0x00, 0x2d, 0x00, 0x49, 0x00, 0x29, 0x00, 0x4f, 0x00, 0x26, 0x00, 0x54, 0x00, 0x24, 0x00, 0x57, 0x00, 0x22, 0x00, 0x5a, 0x00, 0x20, 0x00, 0x5b, 0x00, 0x1d, 0x00, 0x5c, 0x00, 0x1b, 0x00, 0x5d, 0x00, 0x19, 0x00, 0x5d, 0x00, 0x15, 0x00, 0x5c, 0x00, 0x11, 0x00, 0x58, 0x00, 0x0d, 0x00, 0x54, 0x00, 0x08, 0x00, 0x50, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4c, 0x00, 0xfd, 0xff, 0x4a, 0x00, 0xfa, 0xff, 0x46, 0x00, 0xf8, 0xff, 0x3f, 0x00, 0xf5, 0xff, 0x36, 0x00, 0xf1, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x25, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xdf, 0xff, 0x18, 0x00, 0xdb, 0xff, 0x12, 0x00, 0xd8, 0xff, 0x0a, 0x00, 0xd7, 0xff, 0x01, 0x00, 0xd6, 0xff, 0xf7, 0xff, 0xd5, 0xff, 0xef, 0xff, 0xd2, 0xff, 0xe9, 0xff, 0xce, 0xff, 0xe5, 0xff, 0xcb, 0xff, 0xe4, 0xff, 0xc9, 0xff, 0xe1, 0xff, 0xc9, 0xff, 0xdb, 0xff, 0xca, 0xff, 0xd1, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xcd, 0xff, 0xbd, 0xff, 0xce, 0xff, 0xb7, 0xff, 0xce, 0xff, 0xb4, 0xff, 0xcd, 0xff, 0xb5, 0xff, 0xce, 0xff, 0xb7, 0xff, 0xd1, 0xff, 0xb8, 0xff, 0xd6, 0xff, 0xb7, 0xff, 0xdb, 0xff, 0xb4, 0xff, 0xe1, 0xff, 0xb0, 0xff, 0xe5, 0xff, 0xaf, 0xff, 0xe8, 0xff, 0xb2, 0xff, 0xeb, 0xff, 0xb9, 0xff, 0xef, 0xff, 0xc1, 0xff, 0xf4, 0xff, 0xc7, 0xff, 0xfc, 0xff, 0xcb, 0xff, 0x05, 0x00, 0xce, 0xff, 0x0e, 0x00, 0xd1, 0xff, 0x15, 0x00, 0xd4, 0xff, 0x18, 0x00, 0xda, 0xff, 0x18, 0x00, 0xe1, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x1d, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x21, 0x00, 0x15, 0x00, 0x25, 0x00, 0x13, 0x00, 0x28, 0x00, 0x10, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x09, 0x00, 0x36, 0x00, 0x07, 0x00, 0x36, 0x00, 0x07, 0x00, 0x33, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x11, 0x00, 0x21, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x28, 0x00, 0x07, 0x00, 0x30, 0x00, 0xfe, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x3c, 0x00, 0xf1, 0xff, 0x3d, 0x00, 0xee, 0xff, 0x3b, 0x00, 0xed, 0xff, 0x38, 0x00, 0xec, 0xff, 0x36, 0x00, 0xec, 0xff, 0x37, 0x00, 0xe9, 0xff, 0x3b, 0x00, 0xe5, 0xff, 0x41, 0x00, 0xdf, 0xff, 0x45, 0x00, 0xda, 0xff, 0x47, 0x00, 0xd5, 0xff, 0x45, 0x00, 0xd3, 0xff, 0x40, 0x00, 0xd3, 0xff, 0x3a, 0x00, 0xd3, 0xff, 0x35, 0x00, 0xd2, 0xff, 0x32, 0x00, 0xd0, 0xff, 0x30, 0x00, 0xcc, 0xff, 0x31, 0x00, 0xc6, 0xff, 0x32, 0x00, 0xc1, 0xff, 0x31, 0x00, 0xbd, 0xff, 0x2d, 0x00, 0xbc, 0xff, 0x27, 0x00, 0xbc, 0xff, 0x20, 0x00, 0xbf, 0xff, 0x18, 0x00, 0xc2, 0xff, 0x12, 0x00, 0xc5, 0xff, 0x0d, 0x00, 0xc6, 0xff, 0x09, 0x00, 0xc5, 0xff, 0x08, 0x00, 0xc3, 0xff, 0x07, 0x00, 0xc2, 0xff, 0x06, 0x00, 0xc2, 0xff, 0x04, 0x00, 0xc4, 0xff, 0x01, 0x00, 0xc9, 0xff, 0xfd, 0xff, 0xcf, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xd9, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xfb, 0xff, 0xdc, 0xff, 0x01, 0x00, 0xdd, 0xff, 0x08, 0x00, 0xe0, 0xff, 0x0d, 0x00, 0xe4, 0xff, 0x0e, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x25, 0x00, 0xff, 0xff, 0x29, 0x00, 0xfc, 0xff, 0x2c, 0x00, 0xf8, 0xff, 0x2e, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xee, 0xff, 0x37, 0x00, 0xeb, 0xff, 0x3c, 0x00, 0xe9, 0xff, 0x41, 0x00, 0xe9, 0xff, 0x44, 0x00, 0xea, 0xff, 0x46, 0x00, 0xe9, 0xff, 0x46, 0x00, 0xe6, 0xff, 0x45, 0x00, 0xe1, 0xff, 0x45, 0x00, 0xdb, 0xff, 0x44, 0x00, 0xd7, 0xff, 0x43, 0x00, 0xd5, 0xff, 0x44, 0x00, 0xd6, 0xff, 0x46, 0x00, 0xd8, 0xff, 0x48, 0x00, 0xdb, 0xff, 0x4a, 0x00, 0xdc, 0xff, 0x49, 0x00, 0xdb, 0xff, 0x46, 0x00, 0xd9, 0xff, 0x41, 0x00, 0xd7, 0xff, 0x3c, 0x00, 0xd6, 0xff, 0x37, 0x00, 0xd7, 0xff, 0x34, 0x00, 0xda, 0xff, 0x31, 0x00, 0xdc, 0xff, 0x30, 0x00, 0xde, 0xff, 0x2e, 0x00, 0xdf, 0xff, 0x2c, 0x00, 0xde, 0xff, 0x2a, 0x00, 0xdd, 0xff, 0x27, 0x00, 0xdc, 0xff, 0x23, 0x00, 0xdc, 0xff, 0x1e, 0x00, 0xdc, 0xff, 0x18, 0x00, 0xdc, 0xff, 0x13, 0x00, 0xdc, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x09, 0x00, 0xda, 0xff, 0x04, 0x00, 0xdb, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xfa, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf4, 0xff, 0xd9, 0xff, 0xf2, 0xff, 0xd8, 0xff, 0xf0, 0xff, 0xd7, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xef, 0xff, 0xda, 0xff, 0xef, 0xff, 0xde, 0xff, 0xef, 0xff, 0xe3, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xed, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0x02, 0x00, 0xff, 0xff, 0x08, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x12, 0x00, 0x05, 0x00, 0x15, 0x00, 0x04, 0x00, 0x19, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x21, 0x00, 0x10, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x1f, 0x00, 0x04, 0x00, 0x22, 0x00, 0xff, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x2a, 0x00, 0xf5, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x31, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xf2, 0xff, 0x31, 0x00, 0xf2, 0xff, 0x2f, 0x00, 0xf2, 0xff, 0x2f, 0x00, 0xf3, 0xff, 0x30, 0x00, 0xf4, 0xff, 0x32, 0x00, 0xf5, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x2f, 0x00, 0xf4, 0xff, 0x29, 0x00, 0xf4, 0xff, 0x1f, 0x00, 0xf5, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x03, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xc8, 0xff, 0x0e, 0x00, 0xc1, 0xff, 0x13, 0x00, 0xbc, 0xff, 0x16, 0x00, 0xb9, 0xff, 0x17, 0x00, 0xb7, 0xff, 0x16, 0x00, 0xb3, 0xff, 0x15, 0x00, 0xaf, 0xff, 0x16, 0x00, 0xaa, 0xff, 0x17, 0x00, 0xa8, 0xff, 0x1a, 0x00, 0xa8, 0xff, 0x1d, 0x00, 0xab, 0xff, 0x1d, 0x00, 0xb0, 0xff, 0x1c, 0x00, 0xb3, 0xff, 0x1a, 0x00, 0xb3, 0xff, 0x18, 0x00, 0xb1, 0xff, 0x17, 0x00, 0xb0, 0xff, 0x17, 0x00, 0xb0, 0xff, 0x17, 0x00, 0xb3, 0xff, 0x18, 0x00, 0xb5, 0xff, 0x1a, 0x00, 0xb7, 0xff, 0x1c, 0x00, 0xb6, 0xff, 0x20, 0x00, 0xb5, 0xff, 0x23, 0x00, 0xb3, 0xff, 0x27, 0x00, 0xb1, 0xff, 0x29, 0x00, 0xb0, 0xff, 0x2b, 0x00, 0xb1, 0xff, 0x2c, 0x00, 0xb5, 0xff, 0x2e, 0x00, 0xb9, 0xff, 0x2f, 0x00, 0xbe, 0xff, 0x32, 0x00, 0xc0, 0xff, 0x35, 0x00, 0xc2, 0xff, 0x3a, 0x00, 0xc3, 0xff, 0x3f, 0x00, 0xc5, 0xff, 0x43, 0x00, 0xca, 0xff, 0x43, 0x00, 0xd2, 0xff, 0x3e, 0x00, 0xdb, 0xff, 0x37, 0x00, 0xe6, 0xff, 0x30, 0x00, 0xf1, 0xff, 0x2a, 0x00, 0xfc, 0xff, 0x26, 0x00, 0x06, 0x00, 0x23, 0x00, 0x10, 0x00, 0x20, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x17, 0x00, 0x31, 0x00, 0x10, 0x00, 0x3d, 0x00, 0x08, 0x00, 0x49, 0x00, 0xff, 0xff, 0x53, 0x00, 0xf8, 0xff, 0x5c, 0x00, 0xf1, 0xff, 0x64, 0x00, 0xed, 0xff, 0x6b, 0x00, 0xea, 0xff, 0x71, 0x00, 0xe6, 0xff, 0x74, 0x00, 0xe1, 0xff, 0x75, 0x00, 0xdb, 0xff, 0x75, 0x00, 0xd6, 0xff, 0x75, 0x00, 0xd2, 0xff, 0x77, 0x00, 0xce, 0xff, 0x79, 0x00, 0xcb, 0xff, 0x7a, 0x00, 0xc9, 0xff, 0x77, 0x00, 0xc8, 0xff, 0x72, 0x00, 0xc9, 0xff, 0x6b, 0x00, 0xcc, 0xff, 0x63, 0x00, 0xd0, 0xff, 0x5b, 0x00, 0xd3, 0xff, 0x54, 0x00, 0xd5, 0xff, 0x4e, 0x00, 0xd6, 0xff, 0x49, 0x00, 0xd5, 0xff, 0x45, 0x00, 0xd3, 0xff, 0x3f, 0x00, 0xd3, 0xff, 0x35, 0x00, 0xd5, 0xff, 0x2a, 0x00, 0xd8, 0xff, 0x1f, 0x00, 0xdc, 0xff, 0x17, 0x00, 0xe0, 0xff, 0x13, 0x00, 0xe2, 0xff, 0x11, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xe0, 0xff, 0x08, 0x00, 0xde, 0xff, 0x00, 0x00, 0xde, 0xff, 0xf6, 0xff, 0xe0, 0xff, 0xed, 0xff, 0xe3, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe5, 0xff, 0xeb, 0xff, 0xe4, 0xff, 0xef, 0xff, 0xe4, 0xff, 0xf3, 0xff, 0xe2, 0xff, 0xf5, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xc9, 0xff, 0xfc, 0xff, 0xbf, 0xff, 0x01, 0x00, 0xb8, 0xff, 0x06, 0x00, 0xb5, 0xff, 0x0a, 0x00, 0xb4, 0xff, 0x0d, 0x00, 0xb5, 0xff, 0x10, 0x00, 0xb6, 0xff, 0x12, 0x00, 0xb5, 0xff, 0x13, 0x00, 0xb3, 0xff, 0x14, 0x00, 0xaf, 0xff, 0x14, 0x00, 0xaa, 0xff, 0x15, 0x00, 0xa5, 0xff, 0x14, 0x00, 0xa2, 0xff, 0x14, 0x00, 0xa2, 0xff, 0x12, 0x00, 0xa4, 0xff, 0x11, 0x00, 0xa8, 0xff, 0x10, 0x00, 0xad, 0xff, 0x0e, 0x00, 0xb4, 0xff, 0x0b, 0x00, 0xba, 0xff, 0x08, 0x00, 0xbe, 0xff, 0x03, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xfc, 0xff, 0xbe, 0xff, 0xfb, 0xff, 0xc0, 0xff, 0xfa, 0xff, 0xc7, 0xff, 0xf8, 0xff, 0xd2, 0xff, 0xf4, 0xff, 0xdf, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xe5, 0xff, 0xf1, 0xff, 0xe2, 0xff, 0xf1, 0xff, 0xe2, 0xff, 0xf2, 0xff, 0xe3, 0xff, 0xf7, 0xff, 0xe5, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x0f, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe2, 0xff, 0x28, 0x00, 0xdf, 0xff, 0x2f, 0x00, 0xdd, 0xff, 0x32, 0x00, 0xdd, 0xff, 0x31, 0x00, 0xde, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x33, 0x00, 0xe0, 0xff, 0x39, 0x00, 0xde, 0xff, 0x42, 0x00, 0xda, 0xff, 0x4a, 0x00, 0xd5, 0xff, 0x4f, 0x00, 0xd2, 0xff, 0x4f, 0x00, 0xd0, 0xff, 0x4b, 0x00, 0xd0, 0xff, 0x46, 0x00, 0xd2, 0xff, 0x42, 0x00, 0xd3, 0xff, 0x41, 0x00, 0xd4, 0xff, 0x41, 0x00, 0xd4, 0xff, 0x41, 0x00, 0xd4, 0xff, 0x41, 0x00, 0xd5, 0xff, 0x3f, 0x00, 0xd8, 0xff, 0x3c, 0x00, 0xdc, 0xff, 0x37, 0x00, 0xe1, 0xff, 0x32, 0x00, 0xe6, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x27, 0x00, 0xf1, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x17, 0x00, 0x07, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x09, 0x00, 0x14, 0x00, 0x02, 0x00, 0x16, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xee, 0xff, 0x19, 0x00, 0xe2, 0xff, 0x1d, 0x00, 0xd7, 0xff, 0x24, 0x00, 0xce, 0xff, 0x2b, 0x00, 0xc7, 0xff, 0x2f, 0x00, 0xc4, 0xff, 0x30, 0x00, 0xc3, 0xff, 0x2f, 0x00, 0xc1, 0xff, 0x2d, 0x00, 0xbd, 0xff, 0x2b, 0x00, 0xb7, 0xff, 0x2a, 0x00, 0xae, 0xff, 0x2b, 0x00, 0xa7, 0xff, 0x2d, 0x00, 0xa4, 0xff, 0x2f, 0x00, 0xa6, 0xff, 0x31, 0x00, 0xac, 0xff, 0x31, 0x00, 0xb4, 0xff, 0x30, 0x00, 0xb9, 0xff, 0x2f, 0x00, 0xbb, 0xff, 0x2c, 0x00, 0xba, 0xff, 0x29, 0x00, 0xb9, 0xff, 0x24, 0x00, 0xb9, 0xff, 0x1e, 0x00, 0xbb, 0xff, 0x18, 0x00, 0xc1, 0xff, 0x12, 0x00, 0xc8, 0xff, 0x0d, 0x00, 0xd1, 0xff, 0x0a, 0x00, 0xd8, 0xff, 0x08, 0x00, 0xdd, 0xff, 0x05, 0x00, 0xdf, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xe5, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xed, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x14, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf5, 0xff, 0x22, 0x00, 0xf1, 0xff, 0x28, 0x00, 0xed, 0xff, 0x2f, 0x00, 0xeb, 0xff, 0x38, 0x00, 0xec, 0xff, 0x41, 0x00, 0xf1, 0xff, 0x4a, 0x00, 0xf8, 0xff, 0x52, 0x00, 0xfe, 0xff, 0x58, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x03, 0x00, 0x5e, 0x00, 0x03, 0x00, 0x5f, 0x00, 0x01, 0x00, 0x61, 0x00, 0xff, 0xff, 0x64, 0x00, 0xff, 0xff, 0x69, 0x00, 0x01, 0x00, 0x70, 0x00, 0x06, 0x00, 0x76, 0x00, 0x0d, 0x00, 0x7a, 0x00, 0x14, 0x00, 0x7a, 0x00, 0x1b, 0x00, 0x75, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x23, 0x00, 0x65, 0x00, 0x25, 0x00, 0x5f, 0x00, 0x26, 0x00, 0x5c, 0x00, 0x28, 0x00, 0x5b, 0x00, 0x2b, 0x00, 0x5a, 0x00, 0x2e, 0x00, 0x57, 0x00, 0x31, 0x00, 0x52, 0x00, 0x33, 0x00, 0x48, 0x00, 0x32, 0x00, 0x3b, 0x00, 0x2f, 0x00, 0x2d, 0x00, 0x2a, 0x00, 0x21, 0x00, 0x24, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0xf7, 0xff, 0x17, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x13, 0x00, 0xd2, 0xff, 0x11, 0x00, 0xc8, 0xff, 0x11, 0x00, 0xbf, 0xff, 0x15, 0x00, 0xb7, 0xff, 0x1b, 0x00, 0xb1, 0xff, 0x20, 0x00, 0xac, 0xff, 0x24, 0x00, 0xa8, 0xff, 0x25, 0x00, 0xa4, 0xff, 0x24, 0x00, 0x9e, 0xff, 0x22, 0x00, 0x98, 0xff, 0x1f, 0x00, 0x90, 0xff, 0x1c, 0x00, 0x89, 0xff, 0x19, 0x00, 0x84, 0xff, 0x16, 0x00, 0x82, 0xff, 0x13, 0x00, 0x84, 0xff, 0x0f, 0x00, 0x88, 0xff, 0x0a, 0x00, 0x8d, 0xff, 0x04, 0x00, 0x90, 0xff, 0xfe, 0xff, 0x92, 0xff, 0xf7, 0xff, 0x92, 0xff, 0xf0, 0xff, 0x92, 0xff, 0xe9, 0xff, 0x94, 0xff, 0xe3, 0xff, 0x98, 0xff, 0xdf, 0xff, 0xa1, 0xff, 0xdb, 0xff, 0xab, 0xff, 0xd7, 0xff, 0xb7, 0xff, 0xd1, 0xff, 0xc1, 0xff, 0xcb, 0xff, 0xc7, 0xff, 0xc5, 0xff, 0xcc, 0xff, 0xbf, 0xff, 0xd0, 0xff, 0xba, 0xff, 0xd5, 0xff, 0xb8, 0xff, 0xdd, 0xff, 0xb8, 0xff, 0xe6, 0xff, 0xbb, 0xff, 0xf0, 0xff, 0xbd, 0xff, 0xfb, 0xff, 0xbd, 0xff, 0x04, 0x00, 0xbd, 0xff, 0x0d, 0x00, 0xbb, 0xff, 0x16, 0x00, 0xbb, 0xff, 0x1e, 0x00, 0xbd, 0xff, 0x27, 0x00, 0xc1, 0xff, 0x31, 0x00, 0xc7, 0xff, 0x3b, 0x00, 0xcf, 0xff, 0x43, 0x00, 0xd6, 0xff, 0x4b, 0x00, 0xdc, 0xff, 0x52, 0x00, 0xe1, 0xff, 0x5a, 0x00, 0xe4, 0xff, 0x63, 0x00, 0xe7, 0xff, 0x6b, 0x00, 0xea, 0xff, 0x70, 0x00, 0xed, 0xff, 0x72, 0x00, 0xef, 0xff, 0x71, 0x00, 0xee, 0xff, 0x6f, 0x00, 0xed, 0xff, 0x6d, 0x00, 0xec, 0xff, 0x6b, 0x00, 0xeb, 0xff, 0x68, 0x00, 0xea, 0xff, 0x64, 0x00, 0xea, 0xff, 0x60, 0x00, 0xea, 0xff, 0x5a, 0x00, 0xea, 0xff, 0x51, 0x00, 0xe9, 0xff, 0x46, 0x00, 0xe9, 0xff, 0x3b, 0x00, 0xe9, 0xff, 0x32, 0x00, 0xed, 0xff, 0x2a, 0x00, 0xf5, 0xff, 0x23, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x14, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x1c, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x32, 0x00, 0xff, 0xff, 0x38, 0x00, 0xfc, 0xff, 0x3b, 0x00, 0xfa, 0xff, 0x39, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xf4, 0xff, 0x31, 0x00, 0xf2, 0xff, 0x2d, 0x00, 0xf1, 0xff, 0x29, 0x00, 0xef, 0xff, 0x26, 0x00, 0xed, 0xff, 0x25, 0x00, 0xea, 0xff, 0x24, 0x00, 0xe6, 0xff, 0x23, 0x00, 0xe3, 0xff, 0x21, 0x00, 0xdf, 0xff, 0x1f, 0x00, 0xda, 0xff, 0x1c, 0x00, 0xd6, 0xff, 0x18, 0x00, 0xd1, 0xff, 0x12, 0x00, 0xcc, 0xff, 0x0c, 0x00, 0xc8, 0xff, 0x05, 0x00, 0xc5, 0xff, 0x00, 0x00, 0xc2, 0xff, 0xfe, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xfd, 0xff, 0xb7, 0xff, 0xf8, 0xff, 0xb4, 0xff, 0xf1, 0xff, 0xb2, 0xff, 0xe7, 0xff, 0xb4, 0xff, 0xde, 0xff, 0xb8, 0xff, 0xd8, 0xff, 0xbe, 0xff, 0xd6, 0xff, 0xc4, 0xff, 0xd9, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xe0, 0xff, 0xcd, 0xff, 0xdb, 0xff, 0xd0, 0xff, 0xd7, 0xff, 0xd5, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xe9, 0xff, 0xd8, 0xff, 0xf5, 0xff, 0xdd, 0xff, 0x00, 0x00, 0xe2, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe6, 0xff, 0x15, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x20, 0x00, 0xe5, 0xff, 0x27, 0x00, 0xe5, 0xff, 0x2f, 0x00, 0xe7, 0xff, 0x37, 0x00, 0xeb, 0xff, 0x3f, 0x00, 0xef, 0xff, 0x45, 0x00, 0xf2, 0xff, 0x49, 0x00, 0xf6, 0xff, 0x4b, 0x00, 0xf8, 0xff, 0x4c, 0x00, 0xfb, 0xff, 0x4d, 0x00, 0xfe, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x07, 0x00, 0x4b, 0x00, 0x0b, 0x00, 0x47, 0x00, 0x10, 0x00, 0x43, 0x00, 0x15, 0x00, 0x3d, 0x00, 0x18, 0x00, 0x36, 0x00, 0x19, 0x00, 0x2f, 0x00, 0x18, 0x00, 0x29, 0x00, 0x17, 0x00, 0x22, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x19, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x11, 0x00, 0x25, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x07, 0x00, 0x34, 0x00, 0x01, 0x00, 0x39, 0x00, 0xfa, 0xff, 0x3c, 0x00, 0xf2, 0xff, 0x3e, 0x00, 0xec, 0xff, 0x40, 0x00, 0xe7, 0xff, 0x44, 0x00, 0xe3, 0xff, 0x49, 0x00, 0xe1, 0xff, 0x4f, 0x00, 0xe0, 0xff, 0x54, 0x00, 0xde, 0xff, 0x57, 0x00, 0xdd, 0xff, 0x56, 0x00, 0xda, 0xff, 0x54, 0x00, 0xd5, 0xff, 0x51, 0x00, 0xcf, 0xff, 0x4e, 0x00, 0xc9, 0xff, 0x4a, 0x00, 0xc4, 0xff, 0x45, 0x00, 0xc1, 0xff, 0x3e, 0x00, 0xc1, 0xff, 0x37, 0x00, 0xc4, 0xff, 0x2f, 0x00, 0xc7, 0xff, 0x26, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0xc7, 0xff, 0x12, 0x00, 0xc4, 0xff, 0x06, 0x00, 0xc0, 0xff, 0xfa, 0xff, 0xbc, 0xff, 0xed, 0xff, 0xbb, 0xff, 0xe1, 0xff, 0xbd, 0xff, 0xd7, 0xff, 0xc1, 0xff, 0xcf, 0xff, 0xc6, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc8, 0xff, 0xcd, 0xff, 0xc5, 0xff, 0xcc, 0xff, 0xc0, 0xff, 0xcb, 0xff, 0xba, 0xff, 0xcb, 0xff, 0xb3, 0xff, 0xd0, 0xff, 0xb0, 0xff, 0xd9, 0xff, 0xb0, 0xff, 0xe4, 0xff, 0xb5, 0xff, 0xf0, 0xff, 0xbc, 0xff, 0xfa, 0xff, 0xc3, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x03, 0x00, 0xc9, 0xff, 0x04, 0x00, 0xca, 0xff, 0x07, 0x00, 0xca, 0xff, 0x0d, 0x00, 0xcd, 0xff, 0x16, 0x00, 0xd3, 0xff, 0x22, 0x00, 0xdd, 0xff, 0x2e, 0x00, 0xe8, 0xff, 0x39, 0x00, 0xf2, 0xff, 0x40, 0x00, 0xf9, 0xff, 0x43, 0x00, 0xfd, 0xff, 0x44, 0x00, 0xfe, 0xff, 0x43, 0x00, 0xfd, 0xff, 0x43, 0x00, 0xfe, 0xff, 0x45, 0x00, 0x01, 0x00, 0x48, 0x00, 0x06, 0x00, 0x4c, 0x00, 0x0b, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x14, 0x00, 0x4d, 0x00, 0x16, 0x00, 0x4a, 0x00, 0x16, 0x00, 0x47, 0x00, 0x15, 0x00, 0x45, 0x00, 0x13, 0x00, 0x44, 0x00, 0x13, 0x00, 0x45, 0x00, 0x14, 0x00, 0x46, 0x00, 0x18, 0x00, 0x47, 0x00, 0x1e, 0x00, 0x48, 0x00, 0x25, 0x00, 0x48, 0x00, 0x29, 0x00, 0x47, 0x00, 0x2b, 0x00, 0x46, 0x00, 0x2b, 0x00, 0x43, 0x00, 0x2a, 0x00, 0x3f, 0x00, 0x29, 0x00, 0x3b, 0x00, 0x2a, 0x00, 0x37, 0x00, 0x30, 0x00, 0x33, 0x00, 0x38, 0x00, 0x30, 0x00, 0x40, 0x00, 0x2d, 0x00, 0x46, 0x00, 0x2a, 0x00, 0x48, 0x00, 0x26, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x18, 0x00, 0x40, 0x00, 0x0e, 0x00, 0x3f, 0x00, 0x04, 0x00, 0x40, 0x00, 0xfa, 0xff, 0x43, 0x00, 0xf1, 0xff, 0x44, 0x00, 0xea, 0xff, 0x42, 0x00, 0xe4, 0xff, 0x3c, 0x00, 0xde, 0xff, 0x32, 0x00, 0xd7, 0xff, 0x27, 0x00, 0xcf, 0xff, 0x1d, 0x00, 0xc6, 0xff, 0x17, 0x00, 0xbe, 0xff, 0x13, 0x00, 0xb5, 0xff, 0x10, 0x00, 0xad, 0xff, 0x0c, 0x00, 0xa6, 0xff, 0x07, 0x00, 0xa1, 0xff, 0xff, 0xff, 0x9d, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xf0, 0xff, 0x9a, 0xff, 0xea, 0xff, 0x99, 0xff, 0xe7, 0xff, 0x9a, 0xff, 0xe4, 0xff, 0x9b, 0xff, 0xe1, 0xff, 0x9f, 0xff, 0xdd, 0xff, 0xa4, 0xff, 0xd8, 0xff, 0xab, 0xff, 0xd3, 0xff, 0xb0, 0xff, 0xcf, 0xff, 0xb5, 0xff, 0xcb, 0xff, 0xb8, 0xff, 0xc8, 0xff, 0xba, 0xff, 0xc4, 0xff, 0xbb, 0xff, 0xc0, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc0, 0xff, 0xbb, 0xff, 0xc4, 0xff, 0xba, 0xff, 0xcb, 0xff, 0xb9, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xd6, 0xff, 0xba, 0xff, 0xd7, 0xff, 0xbb, 0xff, 0xd5, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xd1, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xbd, 0xff, 0xd6, 0xff, 0xc2, 0xff, 0xdd, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xce, 0xff, 0xeb, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0xd8, 0xff, 0xf7, 0xff, 0xd9, 0xff, 0xf9, 0xff, 0xdb, 0xff, 0xfc, 0xff, 0xdf, 0xff, 0x00, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x17, 0x00, 0xe9, 0xff, 0x1b, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1e, 0x00, 0xe9, 0xff, 0x1e, 0x00, 0xea, 0xff, 0x20, 0x00, 0xec, 0xff, 0x23, 0x00, 0xef, 0xff, 0x28, 0x00, 0xf3, 0xff, 0x2e, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xfd, 0xff, 0x3d, 0x00, 0x02, 0x00, 0x41, 0x00, 0x06, 0x00, 0x44, 0x00, 0x09, 0x00, 0x46, 0x00, 0x0b, 0x00, 0x48, 0x00, 0x0b, 0x00, 0x4a, 0x00, 0x0c, 0x00, 0x4d, 0x00, 0x0e, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x18, 0x00, 0x4e, 0x00, 0x1d, 0x00, 0x4b, 0x00, 0x21, 0x00, 0x45, 0x00, 0x21, 0x00, 0x3d, 0x00, 0x1f, 0x00, 0x36, 0x00, 0x1b, 0x00, 0x2f, 0x00, 0x18, 0x00, 0x29, 0x00, 0x18, 0x00, 0x22, 0x00, 0x19, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xf4, 0xff, 0x14, 0x00, 0xeb, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xdb, 0xff, 0x03, 0x00, 0xd3, 0xff, 0xff, 0xff, 0xcc, 0xff, 0xfd, 0xff, 0xc6, 0xff, 0xfd, 0xff, 0xc1, 0xff, 0xfc, 0xff, 0xbc, 0xff, 0xf9, 0xff, 0xb6, 0xff, 0xf5, 0xff, 0xb1, 0xff, 0xf0, 0xff, 0xad, 0xff, 0xec, 0xff, 0xab, 0xff, 0xeb, 0xff, 0xaa, 0xff, 0xeb, 0xff, 0xad, 0xff, 0xee, 0xff, 0xb2, 0xff, 0xf2, 0xff, 0xba, 0xff, 0xf6, 0xff, 0xc2, 0xff, 0xfa, 0xff, 0xca, 0xff, 0xfc, 0xff, 0xcf, 0xff, 0xfd, 0xff, 0xd4, 0xff, 0xfe, 0xff, 0xd7, 0xff, 0x00, 0x00, 0xdd, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xee, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0x06, 0x00, 0x11, 0x00, 0x10, 0x00, 0x12, 0x00, 0x17, 0x00, 0x11, 0x00, 0x19, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x21, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x30, 0x00, 0x06, 0x00, 0x35, 0x00, 0x04, 0x00, 0x38, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x44, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x07, 0x00, 0x55, 0x00, 0x0a, 0x00, 0x5d, 0x00, 0x0b, 0x00, 0x63, 0x00, 0x09, 0x00, 0x69, 0x00, 0x07, 0x00, 0x6f, 0x00, 0x04, 0x00, 0x75, 0x00, 0x03, 0x00, 0x79, 0x00, 0x04, 0x00, 0x7c, 0x00, 0x06, 0x00, 0x7e, 0x00, 0x08, 0x00, 0x80, 0x00, 0x09, 0x00, 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x05, 0x00, 0x7e, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x02, 0x00, 0x69, 0x00, 0x04, 0x00, 0x61, 0x00, 0x04, 0x00, 0x59, 0x00, 0x02, 0x00, 0x51, 0x00, 0xfe, 0xff, 0x49, 0x00, 0xf8, 0xff, 0x40, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xf0, 0xff, 0x2c, 0x00, 0xef, 0xff, 0x20, 0x00, 0xee, 0xff, 0x15, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xe9, 0xff, 0x04, 0x00, 0xe5, 0xff, 0xfd, 0xff, 0xe0, 0xff, 0xf5, 0xff, 0xdc, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xe0, 0xff, 0xdb, 0xff, 0xd5, 0xff, 0xdd, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xc2, 0xff, 0xe3, 0xff, 0xbc, 0xff, 0xe2, 0xff, 0xb7, 0xff, 0xe1, 0xff, 0xb2, 0xff, 0xe0, 0xff, 0xac, 0xff, 0xe1, 0xff, 0xa4, 0xff, 0xe6, 0xff, 0x9c, 0xff, 0xed, 0xff, 0x96, 0xff, 0xf5, 0xff, 0x91, 0xff, 0xfd, 0xff, 0x8e, 0xff, 0x02, 0x00, 0x8d, 0xff, 0x04, 0x00, 0x8c, 0xff, 0x06, 0x00, 0x8b, 0xff, 0x07, 0x00, 0x8a, 0xff, 0x0a, 0x00, 0x8a, 0xff, 0x0c, 0x00, 0x8c, 0xff, 0x0e, 0x00, 0x92, 0xff, 0x0f, 0x00, 0x9a, 0xff, 0x0e, 0x00, 0xa2, 0xff, 0x0c, 0x00, 0xaa, 0xff, 0x0a, 0x00, 0xb1, 0xff, 0x0a, 0x00, 0xb7, 0xff, 0x0c, 0x00, 0xbd, 0xff, 0x11, 0x00, 0xc4, 0xff, 0x15, 0x00, 0xcc, 0xff, 0x18, 0x00, 0xd5, 0xff, 0x19, 0x00, 0xdf, 0xff, 0x17, 0x00, 0xe8, 0xff, 0x14, 0x00, 0xf0, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x14, 0x00, 0x01, 0x00, 0x18, 0x00, 0x06, 0x00, 0x1b, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x17, 0x00, 0x19, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x0a, 0x00, 0x2c, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x12, 0x00, 0x28, 0x00, 0x12, 0x00, 0x25, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x09, 0x00, 0x2e, 0x00, 0x08, 0x00, 0x33, 0x00, 0x0c, 0x00, 0x36, 0x00, 0x11, 0x00, 0x36, 0x00, 0x17, 0x00, 0x34, 0x00, 0x1a, 0x00, 0x30, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x15, 0x00, 0x2e, 0x00, 0x0f, 0x00, 0x2f, 0x00, 0x09, 0x00, 0x30, 0x00, 0x07, 0x00, 0x30, 0x00, 0x09, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xec, 0xff, 0x10, 0x00, 0xe4, 0xff, 0x16, 0x00, 0xdc, 0xff, 0x1c, 0x00, 0xd3, 0xff, 0x1f, 0x00, 0xca, 0xff, 0x20, 0x00, 0xc1, 0xff, 0x21, 0x00, 0xba, 0xff, 0x23, 0x00, 0xb5, 0xff, 0x26, 0x00, 0xb2, 0xff, 0x29, 0x00, 0xb1, 0xff, 0x28, 0x00, 0xb2, 0xff, 0x25, 0x00, 0xb5, 0xff, 0x1f, 0x00, 0xb9, 0xff, 0x18, 0x00, 0xbd, 0xff, 0x12, 0x00, 0xbf, 0xff, 0x10, 0x00, 0xbe, 0xff, 0x10, 0x00, 0xbd, 0xff, 0x12, 0x00, 0xbd, 0xff, 0x14, 0x00, 0xc0, 0xff, 0x13, 0x00, 0xc5, 0xff, 0x0e, 0x00, 0xcb, 0xff, 0x07, 0x00, 0xd0, 0xff, 0x01, 0x00, 0xd4, 0xff, 0xfd, 0xff, 0xd5, 0xff, 0xfd, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xd9, 0xff, 0x02, 0x00, 0xdc, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x01, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xef, 0xff, 0xed, 0xff, 0xed, 0xff, 0xef, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe1, 0xff, 0x04, 0x00, 0xdb, 0xff, 0x06, 0x00, 0xd4, 0xff, 0x05, 0x00, 0xce, 0xff, 0x04, 0x00, 0xc9, 0xff, 0x03, 0x00, 0xc5, 0xff, 0x05, 0x00, 0xc1, 0xff, 0x09, 0x00, 0xbe, 0xff, 0x0e, 0x00, 0xbd, 0xff, 0x14, 0x00, 0xbc, 0xff, 0x1a, 0x00, 0xbc, 0xff, 0x1e, 0x00, 0xbb, 0xff, 0x22, 0x00, 0xb8, 0xff, 0x24, 0x00, 0xb5, 0xff, 0x25, 0x00, 0xb2, 0xff, 0x25, 0x00, 0xaf, 0xff, 0x24, 0x00, 0xad, 0xff, 0x24, 0x00, 0xac, 0xff, 0x23, 0x00, 0xaa, 0xff, 0x22, 0x00, 0xa9, 0xff, 0x22, 0x00, 0xa7, 0xff, 0x23, 0x00, 0xa6, 0xff, 0x23, 0x00, 0xa7, 0xff, 0x23, 0x00, 0xab, 0xff, 0x21, 0x00, 0xb2, 0xff, 0x1d, 0x00, 0xbb, 0xff, 0x17, 0x00, 0xc4, 0xff, 0x11, 0x00, 0xcd, 0xff, 0x0e, 0x00, 0xd4, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x10, 0x00, 0xe2, 0xff, 0x14, 0x00, 0xec, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x14, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x07, 0x00, 0x21, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xfb, 0xff, 0x31, 0x00, 0xfb, 0xff, 0x35, 0x00, 0xff, 0xff, 0x3b, 0x00, 0x03, 0x00, 0x43, 0x00, 0x06, 0x00, 0x4e, 0x00, 0x06, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x64, 0x00, 0xfc, 0xff, 0x6a, 0x00, 0xf5, 0xff, 0x6a, 0x00, 0xf0, 0xff, 0x66, 0x00, 0xed, 0xff, 0x62, 0x00, 0xee, 0xff, 0x5e, 0x00, 0xf2, 0xff, 0x5e, 0x00, 0xf6, 0xff, 0x61, 0x00, 0xf9, 0xff, 0x64, 0x00, 0xfa, 0xff, 0x66, 0x00, 0xfa, 0xff, 0x65, 0x00, 0xf7, 0xff, 0x61, 0x00, 0xf3, 0xff, 0x5a, 0x00, 0xef, 0xff, 0x51, 0x00, 0xed, 0xff, 0x48, 0x00, 0xed, 0xff, 0x41, 0x00, 0xf0, 0xff, 0x3a, 0x00, 0xf5, 0xff, 0x35, 0x00, 0xfb, 0xff, 0x31, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x03, 0x00, 0x27, 0x00, 0x03, 0x00, 0x20, 0x00, 0x03, 0x00, 0x19, 0x00, 0x03, 0x00, 0x12, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xfd, 0xff, 0x23, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf3, 0xff, 0x29, 0x00, 0xeb, 0xff, 0x2a, 0x00, 0xe2, 0xff, 0x2c, 0x00, 0xda, 0xff, 0x31, 0x00, 0xd4, 0xff, 0x36, 0x00, 0xd0, 0xff, 0x3b, 0x00, 0xcd, 0xff, 0x3e, 0x00, 0xca, 0xff, 0x3d, 0x00, 0xc5, 0xff, 0x3a, 0x00, 0xbe, 0xff, 0x36, 0x00, 0xb4, 0xff, 0x34, 0x00, 0xa8, 0xff, 0x34, 0x00, 0x9d, 0xff, 0x34, 0x00, 0x94, 0xff, 0x34, 0x00, 0x8e, 0xff, 0x32, 0x00, 0x8d, 0xff, 0x2d, 0x00, 0x8f, 0xff, 0x27, 0x00, 0x92, 0xff, 0x22, 0x00, 0x94, 0xff, 0x1d, 0x00, 0x95, 0xff, 0x1b, 0x00, 0x96, 0xff, 0x19, 0x00, 0x98, 0xff, 0x18, 0x00, 0x9c, 0xff, 0x16, 0x00, 0xa2, 0xff, 0x12, 0x00, 0xab, 0xff, 0x0d, 0x00, 0xb4, 0xff, 0x07, 0x00, 0xbd, 0xff, 0x00, 0x00, 0xc6, 0xff, 0xfb, 0xff, 0xce, 0xff, 0xf6, 0xff, 0xd5, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xe2, 0xff, 0x05, 0x00, 0xd8, 0xff, 0x0b, 0x00, 0xd1, 0xff, 0x10, 0x00, 0xce, 0xff, 0x13, 0x00, 0xce, 0xff, 0x16, 0x00, 0xd1, 0xff, 0x19, 0x00, 0xd5, 0xff, 0x1e, 0x00, 0xd8, 0xff, 0x25, 0x00, 0xd8, 0xff, 0x2d, 0x00, 0xd5, 0xff, 0x36, 0x00, 0xd0, 0xff, 0x3e, 0x00, 0xca, 0xff, 0x46, 0x00, 0xc7, 0xff, 0x4d, 0x00, 0xc7, 0xff, 0x51, 0x00, 0xcd, 0xff, 0x53, 0x00, 0xd6, 0xff, 0x53, 0x00, 0xdf, 0xff, 0x55, 0x00, 0xe7, 0xff, 0x58, 0x00, 0xec, 0xff, 0x5e, 0x00, 0xed, 0xff, 0x65, 0x00, 0xec, 0xff, 0x6b, 0x00, 0xeb, 0xff, 0x6d, 0x00, 0xec, 0xff, 0x6d, 0x00, 0xf0, 0xff, 0x6a, 0x00, 0xf6, 0xff, 0x65, 0x00, 0xfe, 0xff, 0x61, 0x00, 0x05, 0x00, 0x5e, 0x00, 0x0a, 0x00, 0x5d, 0x00, 0x0b, 0x00, 0x5b, 0x00, 0x08, 0x00, 0x58, 0x00, 0x04, 0x00, 0x50, 0x00, 0xff, 0xff, 0x46, 0x00, 0xfe, 0xff, 0x39, 0x00, 0xff, 0xff, 0x2b, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x15, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xe7, 0xff, 0xf2, 0xff, 0xd6, 0xff, 0xee, 0xff, 0xc6, 0xff, 0xee, 0xff, 0xba, 0xff, 0xf1, 0xff, 0xb2, 0xff, 0xf8, 0xff, 0xae, 0xff, 0xff, 0xff, 0xac, 0xff, 0x05, 0x00, 0xab, 0xff, 0x08, 0x00, 0xa9, 0xff, 0x09, 0x00, 0xa5, 0xff, 0x09, 0x00, 0xa1, 0xff, 0x0b, 0x00, 0x9c, 0xff, 0x0d, 0x00, 0x97, 0xff, 0x10, 0x00, 0x94, 0xff, 0x15, 0x00, 0x95, 0xff, 0x1b, 0x00, 0x99, 0xff, 0x21, 0x00, 0x9f, 0xff, 0x25, 0x00, 0xa4, 0xff, 0x26, 0x00, 0xa8, 0xff, 0x24, 0x00, 0xa8, 0xff, 0x1f, 0x00, 0xa6, 0xff, 0x1a, 0x00, 0xa3, 0xff, 0x15, 0x00, 0xa2, 0xff, 0x10, 0x00, 0xa3, 0xff, 0x0c, 0x00, 0xa8, 0xff, 0x08, 0x00, 0xaf, 0xff, 0x04, 0x00, 0xb6, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xf8, 0xff, 0xc0, 0xff, 0xf1, 0xff, 0xc4, 0xff, 0xea, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xcd, 0xff, 0xe1, 0xff, 0xd4, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xde, 0xff, 0xf8, 0xff, 0xdc, 0xff, 0x07, 0x00, 0xda, 0xff, 0x14, 0x00, 0xd8, 0xff, 0x20, 0x00, 0xd8, 0xff, 0x29, 0x00, 0xdb, 0xff, 0x30, 0x00, 0xdf, 0xff, 0x38, 0x00, 0xe3, 0xff, 0x41, 0x00, 0xe6, 0xff, 0x4b, 0x00, 0xe9, 0xff, 0x55, 0x00, 0xea, 0xff, 0x5e, 0x00, 0xeb, 0xff, 0x67, 0x00, 0xeb, 0xff, 0x6e, 0x00, 0xed, 0xff, 0x74, 0x00, 0xf2, 0xff, 0x76, 0x00, 0xf8, 0xff, 0x75, 0x00, 0xff, 0xff, 0x72, 0x00, 0x04, 0x00, 0x70, 0x00, 0x07, 0x00, 0x6f, 0x00, 0x08, 0x00, 0x71, 0x00, 0x08, 0x00, 0x73, 0x00, 0x08, 0x00, 0x73, 0x00, 0x08, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0d, 0x00, 0x68, 0x00, 0x10, 0x00, 0x61, 0x00, 0x15, 0x00, 0x5b, 0x00, 0x18, 0x00, 0x55, 0x00, 0x19, 0x00, 0x50, 0x00, 0x18, 0x00, 0x4c, 0x00, 0x15, 0x00, 0x4a, 0x00, 0x12, 0x00, 0x45, 0x00, 0x0f, 0x00, 0x3f, 0x00, 0x0f, 0x00, 0x35, 0x00, 0x13, 0x00, 0x2a, 0x00, 0x19, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x25, 0x00, 0x13, 0x00, 0x26, 0x00, 0x0e, 0x00, 0x24, 0x00, 0x0a, 0x00, 0x20, 0x00, 0x05, 0x00, 0x1b, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xed, 0xff, 0x16, 0x00, 0xe5, 0xff, 0x18, 0x00, 0xde, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x17, 0x00, 0xd5, 0xff, 0x12, 0x00, 0xcf, 0xff, 0x09, 0x00, 0xc8, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xf8, 0xff, 0xb7, 0xff, 0xf3, 0xff, 0xb0, 0xff, 0xf2, 0xff, 0xa9, 0xff, 0xf2, 0xff, 0xa4, 0xff, 0xf2, 0xff, 0xa1, 0xff, 0xf2, 0xff, 0x9e, 0xff, 0xf0, 0xff, 0x9b, 0xff, 0xee, 0xff, 0x98, 0xff, 0xeb, 0xff, 0x97, 0xff, 0xe8, 0xff, 0x97, 0xff, 0xe6, 0xff, 0x99, 0xff, 0xe5, 0xff, 0x9c, 0xff, 0xe8, 0xff, 0xa0, 0xff, 0xeb, 0xff, 0xa3, 0xff, 0xed, 0xff, 0xa7, 0xff, 0xee, 0xff, 0xac, 0xff, 0xec, 0xff, 0xb4, 0xff, 0xea, 0xff, 0xbd, 0xff, 0xe9, 0xff, 0xc7, 0xff, 0xe8, 0xff, 0xd0, 0xff, 0xe6, 0xff, 0xd9, 0xff, 0xe4, 0xff, 0xe0, 0xff, 0xe1, 0xff, 0xe6, 0xff, 0xe0, 0xff, 0xec, 0xff, 0xdf, 0xff, 0xf3, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xdc, 0xff, 0x04, 0x00, 0xdb, 0xff, 0x0e, 0x00, 0xda, 0xff, 0x19, 0x00, 0xda, 0xff, 0x23, 0x00, 0xdc, 0xff, 0x2a, 0x00, 0xdd, 0xff, 0x30, 0x00, 0xdd, 0xff, 0x34, 0x00, 0xdc, 0xff, 0x39, 0x00, 0xdb, 0xff, 0x41, 0x00, 0xdb, 0xff, 0x4a, 0x00, 0xdd, 0xff, 0x55, 0x00, 0xe1, 0xff, 0x60, 0x00, 0xe6, 0xff, 0x69, 0x00, 0xeb, 0xff, 0x6e, 0x00, 0xee, 0xff, 0x71, 0x00, 0xf2, 0xff, 0x73, 0x00, 0xf4, 0xff, 0x76, 0x00, 0xf6, 0xff, 0x7a, 0x00, 0xf9, 0xff, 0x7e, 0x00, 0xfc, 0xff, 0x82, 0x00, 0x00, 0x00, 0x84, 0x00, 0x05, 0x00, 0x84, 0x00, 0x0c, 0x00, 0x82, 0x00, 0x14, 0x00, 0x7e, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x24, 0x00, 0x71, 0x00, 0x2b, 0x00, 0x6a, 0x00, 0x32, 0x00, 0x64, 0x00, 0x39, 0x00, 0x5e, 0x00, 0x40, 0x00, 0x56, 0x00, 0x45, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x30, 0x00, 0x4d, 0x00, 0x22, 0x00, 0x4f, 0x00, 0x15, 0x00, 0x52, 0x00, 0x09, 0x00, 0x56, 0x00, 0x00, 0x00, 0x5a, 0x00, 0xf7, 0xff, 0x5c, 0x00, 0xef, 0xff, 0x5e, 0x00, 0xe4, 0xff, 0x60, 0x00, 0xd7, 0xff, 0x60, 0x00, 0xc8, 0xff, 0x60, 0x00, 0xba, 0xff, 0x5f, 0x00, 0xad, 0xff, 0x5e, 0x00, 0xa4, 0xff, 0x5d, 0x00, 0x9f, 0xff, 0x5a, 0x00, 0x9c, 0xff, 0x56, 0x00, 0x9a, 0xff, 0x52, 0x00, 0x96, 0xff, 0x4d, 0x00, 0x90, 0xff, 0x48, 0x00, 0x88, 0xff, 0x42, 0x00, 0x7e, 0xff, 0x3c, 0x00, 0x75, 0xff, 0x35, 0x00, 0x71, 0xff, 0x2d, 0x00, 0x71, 0xff, 0x25, 0x00, 0x74, 0xff, 0x1b, 0x00, 0x7a, 0xff, 0x11, 0x00, 0x7e, 0xff, 0x07, 0x00, 0x81, 0xff, 0xfe, 0xff, 0x82, 0xff, 0xf7, 0xff, 0x81, 0xff, 0xf3, 0xff, 0x81, 0xff, 0xf1, 0xff, 0x83, 0xff, 0xef, 0xff, 0x87, 0xff, 0xec, 0xff, 0x8f, 0xff, 0xe8, 0xff, 0x99, 0xff, 0xe4, 0xff, 0xa2, 0xff, 0xdf, 0xff, 0xa9, 0xff, 0xdb, 0xff, 0xaf, 0xff, 0xd9, 0xff, 0xb4, 0xff, 0xda, 0xff, 0xbb, 0xff, 0xdd, 0xff, 0xc4, 0xff, 0xe1, 0xff, 0xce, 0xff, 0xe4, 0xff, 0xd9, 0xff, 0xe5, 0xff, 0xe3, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xfb, 0xff, 0xe4, 0xff, 0x04, 0x00, 0xe8, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x19, 0x00, 0xef, 0xff, 0x24, 0x00, 0xf0, 0xff, 0x2d, 0x00, 0xf1, 0xff, 0x34, 0x00, 0xf2, 0xff, 0x38, 0x00, 0xf5, 0xff, 0x3c, 0x00, 0xf9, 0xff, 0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0x07, 0x00, 0x49, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0x13, 0x00, 0x4f, 0x00, 0x15, 0x00, 0x4d, 0x00, 0x13, 0x00, 0x48, 0x00, 0x10, 0x00, 0x42, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x0b, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x3d, 0x00, 0x09, 0x00, 0x3c, 0x00, 0x08, 0x00, 0x38, 0x00, 0x05, 0x00, 0x34, 0x00, 0x01, 0x00, 0x2f, 0x00, 0xff, 0xff, 0x2d, 0x00, 0xfe, 0xff, 0x2d, 0x00, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0xfe, 0xff, 0x2b, 0x00, 0xfb, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x10, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xe3, 0xff, 0xec, 0xff, 0xda, 0xff, 0xe7, 0xff, 0xd1, 0xff, 0xe2, 0xff, 0xca, 0xff, 0xdd, 0xff, 0xc5, 0xff, 0xd7, 0xff, 0xc0, 0xff, 0xd1, 0xff, 0xba, 0xff, 0xcb, 0xff, 0xb5, 0xff, 0xc7, 0xff, 0xaf, 0xff, 0xc3, 0xff, 0xab, 0xff, 0xc1, 0xff, 0xa6, 0xff, 0xbc, 0xff, 0xa2, 0xff, 0xb6, 0xff, 0x9e, 0xff, 0xaf, 0xff, 0x9a, 0xff, 0xa8, 0xff, 0x97, 0xff, 0xa2, 0xff, 0x96, 0xff, 0x9e, 0xff, 0x97, 0xff, 0x9b, 0xff, 0x9a, 0xff, 0x98, 0xff, 0x9d, 0xff, 0x95, 0xff, 0xa1, 0xff, 0x91, 0xff, 0xa5, 0xff, 0x8e, 0xff, 0xa9, 0xff, 0x8c, 0xff, 0xae, 0xff, 0x8c, 0xff, 0xb6, 0xff, 0x8e, 0xff, 0xc2, 0xff, 0x90, 0xff, 0xd0, 0xff, 0x93, 0xff, 0xe0, 0xff, 0x94, 0xff, 0xef, 0xff, 0x96, 0xff, 0xfc, 0xff, 0x98, 0xff, 0x07, 0x00, 0x9e, 0xff, 0x11, 0x00, 0xa6, 0xff, 0x1a, 0x00, 0xb1, 0xff, 0x25, 0x00, 0xbd, 0xff, 0x31, 0x00, 0xc9, 0xff, 0x3e, 0x00, 0xd4, 0xff, 0x49, 0x00, 0xdd, 0xff, 0x53, 0x00, 0xe3, 0xff, 0x5c, 0x00, 0xe7, 0xff, 0x62, 0x00, 0xec, 0xff, 0x67, 0x00, 0xf1, 0xff, 0x6b, 0x00, 0xf9, 0xff, 0x6f, 0x00, 0x00, 0x00, 0x72, 0x00, 0x07, 0x00, 0x75, 0x00, 0x0c, 0x00, 0x77, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x11, 0x00, 0x79, 0x00, 0x13, 0x00, 0x7a, 0x00, 0x16, 0x00, 0x7b, 0x00, 0x1a, 0x00, 0x7b, 0x00, 0x1f, 0x00, 0x78, 0x00, 0x26, 0x00, 0x75, 0x00, 0x2e, 0x00, 0x71, 0x00, 0x35, 0x00, 0x6f, 0x00, 0x3a, 0x00, 0x6e, 0x00, 0x3f, 0x00, 0x6d, 0x00, 0x42, 0x00, 0x6b, 0x00, 0x43, 0x00, 0x67, 0x00, 0x45, 0x00, 0x61, 0x00, 0x46, 0x00, 0x59, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x51, 0x00, 0x3c, 0x00, 0x55, 0x00, 0x34, 0x00, 0x57, 0x00, 0x2f, 0x00, 0x56, 0x00, 0x2a, 0x00, 0x52, 0x00, 0x25, 0x00, 0x4a, 0x00, 0x1f, 0x00, 0x41, 0x00, 0x17, 0x00, 0x3a, 0x00, 0x0e, 0x00, 0x37, 0x00, 0x04, 0x00, 0x37, 0x00, 0xfb, 0xff, 0x38, 0x00, 0xf3, 0xff, 0x39, 0x00, 0xec, 0xff, 0x37, 0x00, 0xe6, 0xff, 0x33, 0x00, 0xe2, 0xff, 0x2b, 0x00, 0xde, 0xff, 0x23, 0x00, 0xd9, 0xff, 0x1a, 0x00, 0xd4, 0xff, 0x14, 0x00, 0xcd, 0xff, 0x10, 0x00, 0xc4, 0xff, 0x0d, 0x00, 0xba, 0xff, 0x0b, 0x00, 0xb1, 0xff, 0x06, 0x00, 0xa9, 0xff, 0x01, 0x00, 0xa3, 0xff, 0xf9, 0xff, 0xa0, 0xff, 0xf2, 0xff, 0x9f, 0xff, 0xea, 0xff, 0x9e, 0xff, 0xe4, 0xff, 0x9d, 0xff, 0xdf, 0xff, 0x9a, 0xff, 0xda, 0xff, 0x96, 0xff, 0xd7, 0xff, 0x92, 0xff, 0xd3, 0xff, 0x8f, 0xff, 0xd1, 0xff, 0x8f, 0xff, 0xcf, 0xff, 0x92, 0xff, 0xcd, 0xff, 0x98, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0xcb, 0xff, 0xa9, 0xff, 0xcb, 0xff, 0xb0, 0xff, 0xcb, 0xff, 0xb6, 0xff, 0xce, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xbf, 0xff, 0xd8, 0xff, 0xc4, 0xff, 0xdf, 0xff, 0xcb, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xef, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0x03, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x19, 0x00, 0x26, 0x00, 0x1d, 0x00, 0x30, 0x00, 0x1f, 0x00, 0x3a, 0x00, 0x22, 0x00, 0x41, 0x00, 0x26, 0x00, 0x47, 0x00, 0x2b, 0x00, 0x4a, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x3e, 0x00, 0x51, 0x00, 0x40, 0x00, 0x52, 0x00, 0x44, 0x00, 0x51, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, 0x49, 0x00, 0x56, 0x00, 0x48, 0x00, 0x59, 0x00, 0x47, 0x00, 0x5c, 0x00, 0x48, 0x00, 0x5c, 0x00, 0x49, 0x00, 0x5b, 0x00, 0x4a, 0x00, 0x5a, 0x00, 0x4a, 0x00, 0x59, 0x00, 0x47, 0x00, 0x5a, 0x00, 0x44, 0x00, 0x5b, 0x00, 0x3f, 0x00, 0x5b, 0x00, 0x3b, 0x00, 0x5a, 0x00, 0x37, 0x00, 0x58, 0x00, 0x33, 0x00, 0x54, 0x00, 0x2e, 0x00, 0x4d, 0x00, 0x29, 0x00, 0x46, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x37, 0x00, 0x16, 0x00, 0x32, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2b, 0x00, 0xf5, 0xff, 0x26, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xdd, 0xff, 0x11, 0x00, 0xd5, 0xff, 0x04, 0x00, 0xcf, 0xff, 0xf7, 0xff, 0xcc, 0xff, 0xee, 0xff, 0xca, 0xff, 0xe8, 0xff, 0xc7, 0xff, 0xe5, 0xff, 0xc2, 0xff, 0xe3, 0xff, 0xbc, 0xff, 0xe0, 0xff, 0xb5, 0xff, 0xd9, 0xff, 0xb0, 0xff, 0xcf, 0xff, 0xab, 0xff, 0xc2, 0xff, 0xaa, 0xff, 0xb6, 0xff, 0xa9, 0xff, 0xad, 0xff, 0xa8, 0xff, 0xa7, 0xff, 0xa6, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa1, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x9d, 0xff, 0x97, 0xff, 0x9e, 0xff, 0x90, 0xff, 0xa1, 0xff, 0x8b, 0xff, 0xa4, 0xff, 0x88, 0xff, 0xa7, 0xff, 0x87, 0xff, 0xab, 0xff, 0x89, 0xff, 0xb1, 0xff, 0x8b, 0xff, 0xb8, 0xff, 0x8e, 0xff, 0xc2, 0xff, 0x92, 0xff, 0xcc, 0xff, 0x95, 0xff, 0xd5, 0xff, 0x98, 0xff, 0xdd, 0xff, 0x9a, 0xff, 0xe2, 0xff, 0x9c, 0xff, 0xe5, 0xff, 0x9e, 0xff, 0xe9, 0xff, 0xa3, 0xff, 0xee, 0xff, 0xaa, 0xff, 0xf4, 0xff, 0xb3, 0xff, 0xfc, 0xff, 0xbd, 0xff, 0x03, 0x00, 0xc9, 0xff, 0x08, 0x00, 0xd5, 0xff, 0x0b, 0x00, 0xde, 0xff, 0x0d, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x11, 0x00, 0x05, 0x00, 0x13, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x1f, 0x00, 0x35, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x29, 0x00, 0x40, 0x00, 0x2d, 0x00, 0x43, 0x00, 0x30, 0x00, 0x45, 0x00, 0x30, 0x00, 0x48, 0x00, 0x2f, 0x00, 0x4c, 0x00, 0x2d, 0x00, 0x50, 0x00, 0x2d, 0x00, 0x54, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x2f, 0x00, 0x5a, 0x00, 0x30, 0x00, 0x5a, 0x00, 0x30, 0x00, 0x57, 0x00, 0x2e, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x53, 0x00, 0x27, 0x00, 0x53, 0x00, 0x23, 0x00, 0x52, 0x00, 0x21, 0x00, 0x50, 0x00, 0x1e, 0x00, 0x4d, 0x00, 0x1b, 0x00, 0x4b, 0x00, 0x17, 0x00, 0x4a, 0x00, 0x11, 0x00, 0x48, 0x00, 0x0c, 0x00, 0x45, 0x00, 0x07, 0x00, 0x3f, 0x00, 0x02, 0x00, 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x24, 0x00, 0xff, 0xff, 0x21, 0x00, 0xfb, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x17, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x03, 0x00, 0xe3, 0xff, 0xf7, 0xff, 0xe5, 0xff, 0xed, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xdf, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xd5, 0xff, 0xda, 0xff, 0xd0, 0xff, 0xe0, 0xff, 0xcc, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xeb, 0xff, 0xc8, 0xff, 0xed, 0xff, 0xc7, 0xff, 0xec, 0xff, 0xc7, 0xff, 0xe8, 0xff, 0xc8, 0xff, 0xe6, 0xff, 0xc8, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xe9, 0xff, 0xcb, 0xff, 0xf1, 0xff, 0xce, 0xff, 0xf9, 0xff, 0xd2, 0xff, 0x01, 0x00, 0xd6, 0xff, 0x06, 0x00, 0xda, 0xff, 0x09, 0x00, 0xdc, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x06, 0x00, 0xee, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x11, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x05, 0x00, 0x24, 0x00, 0x09, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x32, 0x00, 0x15, 0x00, 0x34, 0x00, 0x1d, 0x00, 0x33, 0x00, 0x26, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x34, 0x00, 0x37, 0x00, 0x38, 0x00, 0x3d, 0x00, 0x3a, 0x00, 0x45, 0x00, 0x3c, 0x00, 0x4c, 0x00, 0x40, 0x00, 0x51, 0x00, 0x43, 0x00, 0x52, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x4a, 0x00, 0x48, 0x00, 0x46, 0x00, 0x47, 0x00, 0x44, 0x00, 0x46, 0x00, 0x45, 0x00, 0x47, 0x00, 0x49, 0x00, 0x48, 0x00, 0x4d, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x38, 0x00, 0x36, 0x00, 0x32, 0x00, 0x34, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x23, 0x00, 0x26, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x11, 0x00, 0x18, 0x00, 0x05, 0x00, 0x11, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xea, 0xff, 0xfe, 0xff, 0xe7, 0xff, 0xf6, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xe5, 0xff, 0xe7, 0xff, 0xe3, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd9, 0xff, 0xda, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcb, 0xff, 0xca, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xba, 0xff, 0xc0, 0xff, 0xb2, 0xff, 0xc0, 0xff, 0xac, 0xff, 0xc2, 0xff, 0xa7, 0xff, 0xc4, 0xff, 0xa4, 0xff, 0xc5, 0xff, 0xa1, 0xff, 0xc5, 0xff, 0x9d, 0xff, 0xc2, 0xff, 0x99, 0xff, 0xbf, 0xff, 0x94, 0xff, 0xbd, 0xff, 0x8f, 0xff, 0xbc, 0xff, 0x8c, 0xff, 0xbd, 0xff, 0x8c, 0xff, 0xbf, 0xff, 0x8e, 0xff, 0xc3, 0xff, 0x93, 0xff, 0xc7, 0xff, 0x97, 0xff, 0xcc, 0xff, 0x9b, 0xff, 0xd2, 0xff, 0x9e, 0xff, 0xd8, 0xff, 0xa0, 0xff, 0xde, 0xff, 0xa3, 0xff, 0xe6, 0xff, 0xa7, 0xff, 0xee, 0xff, 0xad, 0xff, 0xf5, 0xff, 0xb5, 0xff, 0xfa, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xc8, 0xff, 0x05, 0x00, 0xd2, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x24, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf9, 0xff, 0x32, 0x00, 0xfd, 0xff, 0x33, 0x00, 0x01, 0x00, 0x33, 0x00, 0x06, 0x00, 0x33, 0x00, 0x0b, 0x00, 0x34, 0x00, 0x10, 0x00, 0x36, 0x00, 0x15, 0x00, 0x37, 0x00, 0x19, 0x00, 0x39, 0x00, 0x1a, 0x00, 0x3b, 0x00, 0x19, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x18, 0x00, 0x3a, 0x00, 0x19, 0x00, 0x37, 0x00, 0x1a, 0x00, 0x35, 0x00, 0x1a, 0x00, 0x32, 0x00, 0x18, 0x00, 0x30, 0x00, 0x16, 0x00, 0x2f, 0x00, 0x12, 0x00, 0x2f, 0x00, 0x0e, 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x06, 0x00, 0x2a, 0x00, 0x03, 0x00, 0x25, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xf6, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xcf, 0xff, 0xec, 0xff, 0xc4, 0xff, 0xe7, 0xff, 0xbc, 0xff, 0xe3, 0xff, 0xb8, 0xff, 0xe1, 0xff, 0xb9, 0xff, 0xe1, 0xff, 0xbb, 0xff, 0xe0, 0xff, 0xbd, 0xff, 0xde, 0xff, 0xbb, 0xff, 0xda, 0xff, 0xb7, 0xff, 0xd4, 0xff, 0xb2, 0xff, 0xcf, 0xff, 0xaf, 0xff, 0xcc, 0xff, 0xae, 0xff, 0xcb, 0xff, 0xb2, 0xff, 0xcd, 0xff, 0xb9, 0xff, 0xd1, 0xff, 0xc1, 0xff, 0xd7, 0xff, 0xc7, 0xff, 0xdc, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xcd, 0xff, 0xe4, 0xff, 0xcf, 0xff, 0xe6, 0xff, 0xd0, 0xff, 0xe9, 0xff, 0xd4, 0xff, 0xed, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xe0, 0xff, 0xfd, 0xff, 0xe7, 0xff, 0x08, 0x00, 0xec, 0xff, 0x12, 0x00, 0xef, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x23, 0x00, 0xf1, 0xff, 0x28, 0x00, 0xf2, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2f, 0x00, 0xf6, 0xff, 0x32, 0x00, 0xf9, 0xff, 0x35, 0x00, 0xfd, 0xff, 0x3a, 0x00, 0x01, 0x00, 0x40, 0x00, 0x06, 0x00, 0x45, 0x00, 0x0c, 0x00, 0x49, 0x00, 0x10, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x49, 0x00, 0x15, 0x00, 0x47, 0x00, 0x15, 0x00, 0x46, 0x00, 0x16, 0x00, 0x46, 0x00, 0x18, 0x00, 0x49, 0x00, 0x1d, 0x00, 0x4c, 0x00, 0x24, 0x00, 0x4f, 0x00, 0x2d, 0x00, 0x51, 0x00, 0x35, 0x00, 0x4f, 0x00, 0x3b, 0x00, 0x4c, 0x00, 0x3f, 0x00, 0x49, 0x00, 0x40, 0x00, 0x48, 0x00, 0x40, 0x00, 0x49, 0x00, 0x40, 0x00, 0x4c, 0x00, 0x42, 0x00, 0x51, 0x00, 0x46, 0x00, 0x55, 0x00, 0x48, 0x00, 0x58, 0x00, 0x48, 0x00, 0x57, 0x00, 0x45, 0x00, 0x53, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x46, 0x00, 0x2f, 0x00, 0x40, 0x00, 0x28, 0x00, 0x3b, 0x00, 0x22, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x34, 0x00, 0x15, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x26, 0x00, 0xf3, 0xff, 0x20, 0x00, 0xe6, 0xff, 0x18, 0x00, 0xd9, 0xff, 0x10, 0x00, 0xce, 0xff, 0x0a, 0x00, 0xc6, 0xff, 0x06, 0x00, 0xbf, 0xff, 0x04, 0x00, 0xb9, 0xff, 0x01, 0x00, 0xb4, 0xff, 0xfe, 0xff, 0xae, 0xff, 0xf9, 0xff, 0xa8, 0xff, 0xf3, 0xff, 0xa3, 0xff, 0xec, 0xff, 0x9e, 0xff, 0xe4, 0xff, 0x9b, 0xff, 0xdd, 0xff, 0x99, 0xff, 0xd7, 0xff, 0x97, 0xff, 0xd2, 0xff, 0x96, 0xff, 0xcf, 0xff, 0x95, 0xff, 0xcf, 0xff, 0x96, 0xff, 0xcf, 0xff, 0x97, 0xff, 0xcf, 0xff, 0x99, 0xff, 0xcd, 0xff, 0x9a, 0xff, 0xc9, 0xff, 0x9b, 0xff, 0xc5, 0xff, 0x9b, 0xff, 0xc2, 0xff, 0x9b, 0xff, 0xc1, 0xff, 0x9c, 0xff, 0xc1, 0xff, 0x9f, 0xff, 0xc5, 0xff, 0xa2, 0xff, 0xcc, 0xff, 0xa7, 0xff, 0xd2, 0xff, 0xaa, 0xff, 0xd6, 0xff, 0xac, 0xff, 0xd8, 0xff, 0xad, 0xff, 0xd7, 0xff, 0xaf, 0xff, 0xd6, 0xff, 0xb2, 0xff, 0xd6, 0xff, 0xb7, 0xff, 0xd8, 0xff, 0xbe, 0xff, 0xdb, 0xff, 0xc5, 0xff, 0xdf, 0xff, 0xcd, 0xff, 0xe3, 0xff, 0xd3, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xe1, 0xff, 0xe9, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x0a, 0x00, 0x04, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x2a, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x12, 0x00, 0x33, 0x00, 0x17, 0x00, 0x39, 0x00, 0x1d, 0x00, 0x3f, 0x00, 0x20, 0x00, 0x43, 0x00, 0x20, 0x00, 0x43, 0x00, 0x1c, 0x00, 0x3f, 0x00, 0x16, 0x00, 0x39, 0x00, 0x10, 0x00, 0x33, 0x00, 0x0d, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x2b, 0x00, 0x12, 0x00, 0x2a, 0x00, 0x17, 0x00, 0x2c, 0x00, 0x1d, 0x00, 0x2e, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x29, 0x00, 0x1d, 0x00, 0x23, 0x00, 0x19, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x11, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x10, 0x00, 0x16, 0x00, 0x13, 0x00, 0x15, 0x00, 0x15, 0x00, 0x12, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0f, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xef, 0xff, 0x01, 0x00, 0xea, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x01, 0x00, 0xdd, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xfc, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd0, 0xff, 0xf7, 0xff, 0xce, 0xff, 0xf5, 0xff, 0xcb, 0xff, 0xf4, 0xff, 0xc9, 0xff, 0xf4, 0xff, 0xc8, 0xff, 0xf5, 0xff, 0xc7, 0xff, 0xf6, 0xff, 0xc8, 0xff, 0xf7, 0xff, 0xc9, 0xff, 0xf7, 0xff, 0xca, 0xff, 0xf5, 0xff, 0xcc, 0xff, 0xf4, 0xff, 0xcd, 0xff, 0xf4, 0xff, 0xce, 0xff, 0xf6, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xd5, 0xff, 0xfe, 0xff, 0xd9, 0xff, 0x04, 0x00, 0xde, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x07, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x13, 0x00, 0x26, 0x00, 0x13, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x31, 0x00, 0x17, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x38, 0x00, 0x37, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x44, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x43, 0x00, 0x40, 0x00, 0x47, 0x00, 0x3d, 0x00, 0x4b, 0x00, 0x3c, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x50, 0x00, 0x42, 0x00, 0x52, 0x00, 0x47, 0x00, 0x53, 0x00, 0x4c, 0x00, 0x56, 0x00, 0x50, 0x00, 0x58, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x51, 0x00, 0x5b, 0x00, 0x50, 0x00, 0x5b, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x4b, 0x00, 0x57, 0x00, 0x48, 0x00, 0x56, 0x00, 0x47, 0x00, 0x54, 0x00, 0x46, 0x00, 0x52, 0x00, 0x48, 0x00, 0x51, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x4c, 0x00, 0x4e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x47, 0x00, 0x46, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x38, 0x00, 0x37, 0x00, 0x30, 0x00, 0x34, 0x00, 0x29, 0x00, 0x33, 0x00, 0x24, 0x00, 0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x1d, 0x00, 0x2c, 0x00, 0x18, 0x00, 0x25, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x02, 0x00, 0x10, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x09, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe5, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xf8, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xe2, 0xff, 0xeb, 0xff, 0xe2, 0xff, 0xe9, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xe5, 0xff, 0xd8, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xe5, 0xff, 0xca, 0xff, 0xe5, 0xff, 0xc6, 0xff, 0xe5, 0xff, 0xc5, 0xff, 0xe4, 0xff, 0xc4, 0xff, 0xe2, 0xff, 0xc4, 0xff, 0xdf, 0xff, 0xc4, 0xff, 0xdd, 0xff, 0xc3, 0xff, 0xdd, 0xff, 0xc2, 0xff, 0xdf, 0xff, 0xc0, 0xff, 0xe1, 0xff, 0xbd, 0xff, 0xe3, 0xff, 0xbb, 0xff, 0xe4, 0xff, 0xbb, 0xff, 0xe2, 0xff, 0xbb, 0xff, 0xde, 0xff, 0xbe, 0xff, 0xda, 0xff, 0xc3, 0xff, 0xd8, 0xff, 0xc8, 0xff, 0xd8, 0xff, 0xcd, 0xff, 0xdb, 0xff, 0xd0, 0xff, 0xe0, 0xff, 0xd1, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xe8, 0xff, 0xce, 0xff, 0xe9, 0xff, 0xcf, 0xff, 0xe7, 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xe3, 0xff, 0xe7, 0xff, 0xe5, 0xff, 0xec, 0xff, 0xea, 0xff, 0xed, 0xff, 0xee, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x13, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x07, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xf6, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0b, 0x00, 0xec, 0xff, 0x09, 0x00, 0xed, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xce, 0xff, 0xf8, 0xff, 0xca, 0xff, 0xf7, 0xff, 0xca, 0xff, 0xf5, 0xff, 0xcd, 0xff, 0xf0, 0xff, 0xd0, 0xff, 0xea, 0xff, 0xd0, 0xff, 0xe4, 0xff, 0xcb, 0xff, 0xe0, 0xff, 0xc2, 0xff, 0xde, 0xff, 0xb8, 0xff, 0xdf, 0xff, 0xb0, 0xff, 0xe2, 0xff, 0xae, 0xff, 0xe5, 0xff, 0xb1, 0xff, 0xe6, 0xff, 0xb8, 0xff, 0xe4, 0xff, 0xc1, 0xff, 0xdf, 0xff, 0xc8, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xd1, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd3, 0xff, 0xd2, 0xff, 0xda, 0xff, 0xd3, 0xff, 0xe2, 0xff, 0xd7, 0xff, 0xe7, 0xff, 0xdf, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xf1, 0xff, 0xdc, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd6, 0xff, 0xfd, 0xff, 0xdb, 0xff, 0xfd, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0x01, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xec, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe9, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0x09, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x08, 0x00, 0x26, 0x00, 0x08, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x15, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x30, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x24, 0x00, 0x36, 0x00, 0x1a, 0x00, 0x38, 0x00, 0x14, 0x00, 0x3a, 0x00, 0x14, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x1d, 0x00, 0x39, 0x00, 0x22, 0x00, 0x35, 0x00, 0x22, 0x00, 0x30, 0x00, 0x1d, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x29, 0x00, 0x09, 0x00, 0x27, 0x00, 0x02, 0x00, 0x25, 0x00, 0x01, 0x00, 0x21, 0x00, 0x05, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x07, 0x00, 0x18, 0x00, 0x06, 0x00, 0x13, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x01, 0x00, 0x0b, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x02, 0x00, 0x07, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x08, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf0, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x02, 0x00, 0xea, 0xff, 0x06, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe8, 0xff, 0x03, 0x00, 0xe8, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xf0, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xee, 0xff, 0x07, 0x00, 0xec, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x16, 0x00, 0xe7, 0xff, 0x1a, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1d, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf7, 0xff, 0x22, 0x00, 0xf7, 0xff, 0x27, 0x00, 0xf4, 0xff, 0x2b, 0x00, 0xf3, 0xff, 0x2d, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x27, 0x00, 0xf9, 0xff, 0x21, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x17, 0x00, 0xfc, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1b, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xed, 0xff, 0x19, 0x00, 0xec, 0xff, 0x14, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x08, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xe6, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x1b, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xec, 0xff, 0x14, 0x00, 0xee, 0xff, 0x10, 0x00, 0xef, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x11, 0x00, 0xea, 0xff, 0x15, 0x00, 0xe8, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x1e, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe4, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x11, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe5, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe3, 0xff, 0xf6, 0xff, 0xe2, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf2, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xd7, 0xff, 0xea, 0xff, 0xd6, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xee, 0xff, 0xdf, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xea, 0xff, 0xef, 0xff, 0xea, 0xff, 0xef, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x11, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x19, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xfc, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf9, 0xff, 0x2c, 0x00, 0xfb, 0xff, 0x31, 0x00, 0xfd, 0xff, 0x36, 0x00, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x46, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x04, 0x00, 0x48, 0x00, 0x08, 0x00, 0x46, 0x00, 0x0c, 0x00, 0x45, 0x00, 0x0f, 0x00, 0x45, 0x00, 0x10, 0x00, 0x44, 0x00, 0x0f, 0x00, 0x41, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x08, 0x00, 0x33, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x20, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf6, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xee, 0xff, 0x05, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x09, 0x00, 0xde, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x08, 0x00, 0xda, 0xff, 0x03, 0x00, 0xd9, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xfb, 0xff, 0xd5, 0xff, 0xfa, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xcb, 0xff, 0xfb, 0xff, 0xc5, 0xff, 0xfd, 0xff, 0xc2, 0xff, 0xfd, 0xff, 0xc2, 0xff, 0xfd, 0xff, 0xc5, 0xff, 0xfb, 0xff, 0xcb, 0xff, 0xfa, 0xff, 0xd0, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf8, 0xff, 0xd6, 0xff, 0xf7, 0xff, 0xd6, 0xff, 0xf6, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0xd8, 0xff, 0xf3, 0xff, 0xdc, 0xff, 0xf1, 0xff, 0xe4, 0xff, 0xef, 0xff, 0xec, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xfd, 0xff, 0xec, 0xff, 0x02, 0x00, 0xec, 0xff, 0x06, 0x00, 0xed, 0xff, 0x08, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf4, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x20, 0x00, 0xff, 0xff, 0x22, 0x00, 0x04, 0x00, 0x22, 0x00, 0x07, 0x00, 0x20, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x18, 0x00, 0x02, 0x00, 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0xff, 0xff, 0x1e, 0x00, 0x04, 0x00, 0x22, 0x00, 0x09, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, 0x06, 0x00, 0x21, 0x00, 0x05, 0x00, 0x24, 0x00, 0x06, 0x00, 0x27, 0x00, 0x07, 0x00, 0x28, 0x00, 0x07, 0x00, 0x28, 0x00, 0x06, 0x00, 0x27, 0x00, 0x04, 0x00, 0x25, 0x00, 0xff, 0xff, 0x23, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xf7, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x1e, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xef, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x17, 0x00, 0xe3, 0xff, 0x16, 0x00, 0xdd, 0xff, 0x16, 0x00, 0xd8, 0xff, 0x15, 0x00, 0xd4, 0xff, 0x14, 0x00, 0xd2, 0xff, 0x11, 0x00, 0xd1, 0xff, 0x0d, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xcf, 0xff, 0x04, 0x00, 0xcd, 0xff, 0x03, 0x00, 0xcc, 0xff, 0x03, 0x00, 0xcc, 0xff, 0x05, 0x00, 0xce, 0xff, 0x06, 0x00, 0xcf, 0xff, 0x06, 0x00, 0xd0, 0xff, 0x03, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xce, 0xff, 0xfa, 0xff, 0xcd, 0xff, 0xf6, 0xff, 0xcd, 0xff, 0xf3, 0xff, 0xce, 0xff, 0xf3, 0xff, 0xd0, 0xff, 0xf4, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf9, 0xff, 0xd0, 0xff, 0xfa, 0xff, 0xcd, 0xff, 0xf9, 0xff, 0xcb, 0xff, 0xf7, 0xff, 0xc9, 0xff, 0xf3, 0xff, 0xc9, 0xff, 0xf0, 0xff, 0xca, 0xff, 0xed, 0xff, 0xcc, 0xff, 0xec, 0xff, 0xce, 0xff, 0xee, 0xff, 0xd0, 0xff, 0xf2, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd3, 0xff, 0xfb, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xed, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x12, 0x00, 0x16, 0x00, 0x13, 0x00, 0x17, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x19, 0x00, 0x14, 0x00, 0x19, 0x00, 0x15, 0x00, 0x19, 0x00, 0x13, 0x00, 0x18, 0x00, 0x12, 0x00, 0x15, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x09, 0x00, 0x17, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x21, 0x00, 0x04, 0x00, 0x27, 0x00, 0xff, 0xff, 0x2c, 0x00, 0xf9, 0xff, 0x2e, 0x00, 0xf4, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x27, 0x00, 0xf8, 0xff, 0x22, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x20, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xf8, 0xff, 0x22, 0x00, 0xf3, 0xff, 0x1e, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xef, 0xff, 0x11, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x06, 0x00, 0xef, 0xff, 0x04, 0x00, 0xed, 0xff, 0x04, 0x00, 0xeb, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe2, 0xff, 0x04, 0x00, 0xde, 0xff, 0x00, 0x00, 0xdb, 0xff, 0xfb, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xd7, 0xff, 0xf4, 0xff, 0xd5, 0xff, 0xf4, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0xcf, 0xff, 0xfa, 0xff, 0xcd, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0x00, 0x00, 0xcc, 0xff, 0x00, 0x00, 0xcf, 0xff, 0xfe, 0xff, 0xd3, 0xff, 0xfa, 0xff, 0xd8, 0xff, 0xf7, 0xff, 0xdd, 0xff, 0xf5, 0xff, 0xe0, 0xff, 0xf6, 0xff, 0xe3, 0xff, 0xf9, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x04, 0x00, 0xec, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x05, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x07, 0x00, 0x19, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x22, 0x00, 0x08, 0x00, 0x25, 0x00, 0x06, 0x00, 0x27, 0x00, 0x06, 0x00, 0x26, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x19, 0x00, 0x23, 0x00, 0x18, 0x00, 0x26, 0x00, 0x19, 0x00, 0x26, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x16, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x00, 0x01, 0x00, 0x09, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xed, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xe6, 0xff, 0xf9, 0xff, 0xe4, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xe7, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xda, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd8, 0xff, 0xf4, 0xff, 0xdb, 0xff, 0xf1, 0xff, 0xdb, 0xff, 0xf0, 0xff, 0xd8, 0xff, 0xf0, 0xff, 0xd2, 0xff, 0xf3, 0xff, 0xca, 0xff, 0xf6, 0xff, 0xc3, 0xff, 0xfa, 0xff, 0xbf, 0xff, 0xfb, 0xff, 0xc0, 0xff, 0xf9, 0xff, 0xc4, 0xff, 0xf5, 0xff, 0xca, 0xff, 0xf2, 0xff, 0xd1, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xfb, 0xff, 0xd6, 0xff, 0xfe, 0xff, 0xd5, 0xff, 0x00, 0x00, 0xd6, 0xff, 0x00, 0x00, 0xdb, 0xff, 0xfd, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x19, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x22, 0x00, 0x16, 0x00, 0x24, 0x00, 0x19, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x23, 0x00, 0x1f, 0x00, 0x28, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x29, 0x00, 0x32, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x33, 0x00, 0x38, 0x00, 0x32, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x26, 0x00, 0x38, 0x00, 0x1f, 0x00, 0x37, 0x00, 0x1a, 0x00, 0x36, 0x00, 0x18, 0x00, 0x36, 0x00, 0x18, 0x00, 0x35, 0x00, 0x19, 0x00, 0x35, 0x00, 0x19, 0x00, 0x34, 0x00, 0x17, 0x00, 0x32, 0x00, 0x13, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x07, 0x00, 0x20, 0x00, 0x02, 0x00, 0x18, 0x00, 0xff, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe2, 0xff, 0xef, 0xff, 0xdd, 0xff, 0xf1, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xf7, 0xff, 0xe7, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xef, 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x22, 0x00, 0xe8, 0xff, 0x25, 0x00, 0xe7, 0xff, 0x26, 0x00, 0xe9, 0xff, 0x26, 0x00, 0xeb, 0xff, 0x26, 0x00, 0xec, 0xff, 0x26, 0x00, 0xec, 0xff, 0x28, 0x00, 0xe8, 0xff, 0x2a, 0x00, 0xe3, 0xff, 0x2c, 0x00, 0xde, 0xff, 0x2e, 0x00, 0xda, 0xff, 0x2d, 0x00, 0xd8, 0xff, 0x2a, 0x00, 0xd8, 0xff, 0x25, 0x00, 0xda, 0xff, 0x20, 0x00, 0xdc, 0xff, 0x1a, 0x00, 0xde, 0xff, 0x14, 0x00, 0xde, 0xff, 0x10, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xd9, 0xff, 0x08, 0x00, 0xd6, 0xff, 0x04, 0x00, 0xd5, 0xff, 0x00, 0x00, 0xd7, 0xff, 0xfa, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xe0, 0xff, 0xed, 0xff, 0xe5, 0xff, 0xe6, 0xff, 0xe9, 0xff, 0xe0, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xd9, 0xff, 0xe7, 0xff, 0xd9, 0xff, 0xe6, 0xff, 0xda, 0xff, 0xe8, 0xff, 0xda, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd6, 0xff, 0xfa, 0xff, 0xd2, 0xff, 0x01, 0x00, 0xce, 0xff, 0x05, 0x00, 0xcb, 0xff, 0x06, 0x00, 0xcb, 0xff, 0x05, 0x00, 0xce, 0xff, 0x03, 0x00, 0xd2, 0xff, 0x03, 0x00, 0xd4, 0xff, 0x05, 0x00, 0xd4, 0xff, 0x09, 0x00, 0xd0, 0xff, 0x0f, 0x00, 0xcc, 0xff, 0x13, 0x00, 0xc7, 0xff, 0x16, 0x00, 0xc5, 0xff, 0x17, 0x00, 0xc7, 0xff, 0x17, 0x00, 0xcb, 0xff, 0x17, 0x00, 0xd1, 0xff, 0x18, 0x00, 0xd4, 0xff, 0x1b, 0x00, 0xd6, 0xff, 0x1e, 0x00, 0xd6, 0xff, 0x21, 0x00, 0xd6, 0xff, 0x21, 0x00, 0xd8, 0xff, 0x1e, 0x00, 0xde, 0xff, 0x1a, 0x00, 0xe7, 0xff, 0x17, 0x00, 0xf1, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x16, 0x00, 0x02, 0x00, 0x18, 0x00, 0x06, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x0b, 0x00, 0x35, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x05, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3b, 0x00, 0xfb, 0xff, 0x3f, 0x00, 0xf6, 0xff, 0x44, 0x00, 0xf3, 0xff, 0x49, 0x00, 0xf0, 0xff, 0x4c, 0x00, 0xee, 0xff, 0x4c, 0x00, 0xed, 0xff, 0x49, 0x00, 0xed, 0xff, 0x43, 0x00, 0xec, 0xff, 0x3c, 0x00, 0xea, 0xff, 0x36, 0x00, 0xe6, 0xff, 0x32, 0x00, 0xe0, 0xff, 0x30, 0x00, 0xd9, 0xff, 0x2f, 0x00, 0xd2, 0xff, 0x2e, 0x00, 0xcc, 0xff, 0x2c, 0x00, 0xca, 0xff, 0x28, 0x00, 0xcb, 0xff, 0x23, 0x00, 0xce, 0xff, 0x1c, 0x00, 0xd1, 0xff, 0x16, 0x00, 0xd1, 0xff, 0x10, 0x00, 0xce, 0xff, 0x0c, 0x00, 0xc9, 0xff, 0x09, 0x00, 0xc4, 0xff, 0x07, 0x00, 0xc1, 0xff, 0x05, 0x00, 0xc2, 0xff, 0x04, 0x00, 0xc7, 0xff, 0x02, 0x00, 0xce, 0xff, 0xfe, 0xff, 0xd6, 0xff, 0xfa, 0xff, 0xdb, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xdd, 0xff, 0xed, 0xff, 0xdc, 0xff, 0xea, 0xff, 0xdb, 0xff, 0xe8, 0xff, 0xdf, 0xff, 0xe5, 0xff, 0xe7, 0xff, 0xe1, 0xff, 0xf2, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xd7, 0xff, 0x07, 0x00, 0xd0, 0xff, 0x0f, 0x00, 0xc9, 0xff, 0x13, 0x00, 0xc3, 0xff, 0x14, 0x00, 0xbf, 0xff, 0x14, 0x00, 0xbd, 0xff, 0x14, 0x00, 0xbf, 0xff, 0x14, 0x00, 0xc2, 0xff, 0x17, 0x00, 0xc6, 0xff, 0x1d, 0x00, 0xc8, 0xff, 0x23, 0x00, 0xc9, 0xff, 0x2a, 0x00, 0xca, 0xff, 0x30, 0x00, 0xca, 0xff, 0x32, 0x00, 0xcc, 0xff, 0x31, 0x00, 0xd0, 0xff, 0x2e, 0x00, 0xd5, 0xff, 0x2b, 0x00, 0xde, 0xff, 0x2a, 0x00, 0xe7, 0xff, 0x2c, 0x00, 0xf1, 0xff, 0x30, 0x00, 0xf9, 0xff, 0x34, 0x00, 0xfd, 0xff, 0x38, 0x00, 0xff, 0xff, 0x39, 0x00, 0xff, 0xff, 0x37, 0x00, 0xff, 0xff, 0x31, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x28, 0x00, 0x0a, 0x00, 0x27, 0x00, 0x10, 0x00, 0x29, 0x00, 0x14, 0x00, 0x2c, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x14, 0x00, 0x2b, 0x00, 0x13, 0x00, 0x28, 0x00, 0x14, 0x00, 0x26, 0x00, 0x17, 0x00, 0x25, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x22, 0x00, 0x27, 0x00, 0x27, 0x00, 0x28, 0x00, 0x28, 0x00, 0x27, 0x00, 0x28, 0x00, 0x25, 0x00, 0x26, 0x00, 0x21, 0x00, 0x25, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x1b, 0x00, 0x2b, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x19, 0x00, 0x32, 0x00, 0x15, 0x00, 0x32, 0x00, 0x11, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x26, 0x00, 0x06, 0x00, 0x22, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd3, 0xff, 0xfd, 0xff, 0xd0, 0xff, 0xfd, 0xff, 0xce, 0xff, 0xfd, 0xff, 0xcc, 0xff, 0xfb, 0xff, 0xcc, 0xff, 0xf9, 0xff, 0xcc, 0xff, 0xf8, 0xff, 0xce, 0xff, 0xf9, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfb, 0xff, 0xd6, 0xff, 0xfd, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xd6, 0xff, 0x00, 0x00, 0xd6, 0xff, 0x01, 0x00, 0xd7, 0xff, 0x00, 0x00, 0xd9, 0xff, 0xff, 0xff, 0xde, 0xff, 0xfe, 0xff, 0xe3, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x00, 0x00, 0xed, 0xff, 0x01, 0x00, 0xec, 0xff, 0x01, 0x00, 0xec, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x13, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x01, 0x00, 0x21, 0x00, 0x03, 0x00, 0x24, 0x00, 0x05, 0x00, 0x26, 0x00, 0x07, 0x00, 0x25, 0x00, 0x07, 0x00, 0x24, 0x00, 0x06, 0x00, 0x23, 0x00, 0x03, 0x00, 0x26, 0x00, 0x00, 0x00, 0x2b, 0x00, 0xfd, 0xff, 0x33, 0x00, 0xfc, 0xff, 0x3a, 0x00, 0xfb, 0xff, 0x3f, 0x00, 0xfb, 0xff, 0x41, 0x00, 0xf9, 0xff, 0x40, 0x00, 0xf6, 0xff, 0x3c, 0x00, 0xf1, 0xff, 0x38, 0x00, 0xeb, 0xff, 0x34, 0x00, 0xe6, 0xff, 0x31, 0x00, 0xe2, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x32, 0x00, 0xdf, 0xff, 0x34, 0x00, 0xdf, 0xff, 0x34, 0x00, 0xde, 0xff, 0x34, 0x00, 0xda, 0xff, 0x31, 0x00, 0xd6, 0xff, 0x2b, 0x00, 0xd1, 0xff, 0x25, 0x00, 0xcd, 0xff, 0x1f, 0x00, 0xcb, 0xff, 0x1a, 0x00, 0xcb, 0xff, 0x19, 0x00, 0xcc, 0xff, 0x19, 0x00, 0xce, 0xff, 0x1a, 0x00, 0xd0, 0xff, 0x1a, 0x00, 0xd3, 0xff, 0x18, 0x00, 0xd6, 0xff, 0x13, 0x00, 0xd9, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x07, 0x00, 0xdd, 0xff, 0x02, 0x00, 0xdf, 0xff, 0xfc, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xe5, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf9, 0xff, 0xd9, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfc, 0xff, 0xd1, 0xff, 0xfe, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xd0, 0xff, 0x01, 0x00, 0xd1, 0xff, 0x02, 0x00, 0xd2, 0xff, 0x02, 0x00, 0xd1, 0xff, 0x02, 0x00, 0xce, 0xff, 0x03, 0x00, 0xca, 0xff, 0x04, 0x00, 0xc6, 0xff, 0x05, 0x00, 0xc4, 0xff, 0x07, 0x00, 0xc3, 0xff, 0x08, 0x00, 0xc5, 0xff, 0x09, 0x00, 0xc8, 0xff, 0x0a, 0x00, 0xcc, 0xff, 0x0b, 0x00, 0xcf, 0xff, 0x0d, 0x00, 0xd0, 0xff, 0x10, 0x00, 0xcf, 0xff, 0x13, 0x00, 0xcd, 0xff, 0x15, 0x00, 0xcc, 0xff, 0x16, 0x00, 0xce, 0xff, 0x16, 0x00, 0xd2, 0xff, 0x15, 0x00, 0xd7, 0xff, 0x14, 0x00, 0xdd, 0xff, 0x15, 0x00, 0xe1, 0xff, 0x18, 0x00, 0xe4, 0xff, 0x1d, 0x00, 0xe4, 0xff, 0x22, 0x00, 0xe3, 0xff, 0x25, 0x00, 0xe2, 0xff, 0x25, 0x00, 0xe1, 0xff, 0x23, 0x00, 0xe3, 0xff, 0x1f, 0x00, 0xe7, 0xff, 0x1a, 0x00, 0xed, 0xff, 0x16, 0x00, 0xf2, 0xff, 0x13, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x16, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0x02, 0x00, 0x08, 0x00, 0x06, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x1f, 0x00, 0xfb, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x20, 0x00, 0xf1, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x17, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xf2, 0xff, 0x15, 0x00, 0xee, 0xff, 0x16, 0x00, 0xe9, 0xff, 0x17, 0x00, 0xe5, 0xff, 0x18, 0x00, 0xe4, 0xff, 0x16, 0x00, 0xe6, 0xff, 0x13, 0x00, 0xea, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x19, 0x00, 0x00, 0x00, 0x18, 0x00, 0x05, 0x00, 0x16, 0x00, 0x08, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x06, 0x00, 0x18, 0x00, 0x03, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x18, 0x00, 0x04, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x11, 0x00, 0x10, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x13, 0x00, 0x14, 0x00, 0x17, 0x00, 0x14, 0x00, 0x19, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x16, 0x00, 0x13, 0x00, 0x14, 0x00, 0x12, 0x00, 0x13, 0x00, 0x11, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x23, 0x00, 0x05, 0x00, 0x25, 0x00, 0x01, 0x00, 0x24, 0x00, 0xfd, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf6, 0xff, 0x1d, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x1e, 0x00, 0xec, 0xff, 0x1f, 0x00, 0xe7, 0xff, 0x20, 0x00, 0xe3, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1d, 0x00, 0xe1, 0xff, 0x18, 0x00, 0xe2, 0xff, 0x14, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x02, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe1, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xf2, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xe0, 0xff, 0xf2, 0xff, 0xdd, 0xff, 0xf1, 0xff, 0xdb, 0xff, 0xf0, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf4, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xd4, 0xff, 0xfb, 0xff, 0xd1, 0xff, 0xfd, 0xff, 0xcd, 0xff, 0xfe, 0xff, 0xc9, 0xff, 0xfe, 0xff, 0xc7, 0xff, 0xfd, 0xff, 0xc7, 0xff, 0xfc, 0xff, 0xc9, 0xff, 0xfc, 0xff, 0xcc, 0xff, 0xfd, 0xff, 0xce, 0xff, 0xfe, 0xff, 0xd0, 0xff, 0x00, 0x00, 0xd0, 0xff, 0x01, 0x00, 0xcf, 0xff, 0x01, 0x00, 0xce, 0xff, 0x01, 0x00, 0xcd, 0xff, 0x01, 0x00, 0xcc, 0xff, 0x02, 0x00, 0xcc, 0xff, 0x04, 0x00, 0xcd, 0xff, 0x06, 0x00, 0xcf, 0xff, 0x07, 0x00, 0xd1, 0xff, 0x09, 0x00, 0xd3, 0xff, 0x0b, 0x00, 0xd4, 0xff, 0x0d, 0x00, 0xd4, 0xff, 0x11, 0x00, 0xd4, 0xff, 0x14, 0x00, 0xd4, 0xff, 0x16, 0x00, 0xd7, 0xff, 0x17, 0x00, 0xdb, 0xff, 0x18, 0x00, 0xe0, 0xff, 0x1a, 0x00, 0xe5, 0xff, 0x1c, 0x00, 0xea, 0xff, 0x1f, 0x00, 0xef, 0xff, 0x22, 0x00, 0xf4, 0xff, 0x24, 0x00, 0xf8, 0xff, 0x24, 0x00, 0xfd, 0xff, 0x22, 0x00, 0x02, 0x00, 0x20, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x18, 0x00, 0x23, 0x00, 0x14, 0x00, 0x24, 0x00, 0x10, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x21, 0x00, 0xfe, 0xff, 0x22, 0x00, 0xfa, 0xff, 0x21, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf4, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x16, 0x00, 0xef, 0xff, 0x13, 0x00, 0xed, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe5, 0xff, 0x13, 0x00, 0xe1, 0xff, 0x13, 0x00, 0xde, 0xff, 0x12, 0x00, 0xdb, 0xff, 0x0f, 0x00, 0xd9, 0xff, 0x0b, 0x00, 0xd8, 0xff, 0x06, 0x00, 0xd6, 0xff, 0x03, 0x00, 0xd5, 0xff, 0x01, 0x00, 0xd4, 0xff, 0x01, 0x00, 0xd3, 0xff, 0x01, 0x00, 0xd3, 0xff, 0x01, 0x00, 0xd3, 0xff, 0x00, 0x00, 0xd2, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xfd, 0xff, 0xd3, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xf5, 0xff, 0xd6, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xe9, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xd9, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xe5, 0xff, 0xda, 0xff, 0xea, 0xff, 0xd8, 0xff, 0xed, 0xff, 0xd6, 0xff, 0xef, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0xd5, 0xff, 0xf2, 0xff, 0xd7, 0xff, 0xf5, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xde, 0xff, 0x00, 0x00, 0xe1, 0xff, 0x06, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe9, 0xff, 0x0b, 0x00, 0xee, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x17, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x22, 0x00, 0x02, 0x00, 0x23, 0x00, 0x02, 0x00, 0x22, 0x00, 0x04, 0x00, 0x20, 0x00, 0x05, 0x00, 0x1f, 0x00, 0x06, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x03, 0x00, 0x26, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x25, 0x00, 0x03, 0x00, 0x20, 0x00, 0x06, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x06, 0x00, 0x16, 0x00, 0x02, 0x00, 0x19, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x1d, 0x00, 0xe9, 0xff, 0x1d, 0x00, 0xe7, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xe5, 0xff, 0x1f, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe4, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1f, 0x00, 0xdd, 0xff, 0x1f, 0x00, 0xd9, 0xff, 0x20, 0x00, 0xd5, 0xff, 0x21, 0x00, 0xd4, 0xff, 0x22, 0x00, 0xd4, 0xff, 0x23, 0x00, 0xd5, 0xff, 0x23, 0x00, 0xd6, 0xff, 0x22, 0x00, 0xd7, 0xff, 0x21, 0x00, 0xd8, 0xff, 0x1f, 0x00, 0xd9, 0xff, 0x1d, 0x00, 0xd9, 0xff, 0x1a, 0x00, 0xd9, 0xff, 0x19, 0x00, 0xda, 0xff, 0x18, 0x00, 0xdd, 0xff, 0x17, 0x00, 0xe1, 0xff, 0x14, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xec, 0xff, 0x0a, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xeb, 0xff, 0x30, 0x00, 0xe6, 0xff, 0x32, 0x00, 0xe1, 0xff, 0x33, 0x00, 0xdf, 0xff, 0x32, 0x00, 0xde, 0xff, 0x32, 0x00, 0xde, 0xff, 0x33, 0x00, 0xdd, 0xff, 0x36, 0x00, 0xdb, 0xff, 0x3b, 0x00, 0xd9, 0xff, 0x41, 0x00, 0xd6, 0xff, 0x44, 0x00, 0xd4, 0xff, 0x45, 0x00, 0xd3, 0xff, 0x43, 0x00, 0xd3, 0xff, 0x3e, 0x00, 0xd6, 0xff, 0x3a, 0x00, 0xda, 0xff, 0x37, 0x00, 0xdf, 0xff, 0x37, 0x00, 0xe4, 0xff, 0x38, 0x00, 0xe8, 0xff, 0x3a, 0x00, 0xec, 0xff, 0x3b, 0x00, 0xf1, 0xff, 0x3b, 0x00, 0xf6, 0xff, 0x39, 0x00, 0xfd, 0xff, 0x37, 0x00, 0x04, 0x00, 0x35, 0x00, 0x0b, 0x00, 0x36, 0x00, 0x11, 0x00, 0x37, 0x00, 0x17, 0x00, 0x38, 0x00, 0x1b, 0x00, 0x36, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x25, 0x00, 0x29, 0x00, 0x28, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x13, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x03, 0x00, 0x1f, 0x00, 0xfd, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xea, 0xff, 0x12, 0x00, 0xe5, 0xff, 0x11, 0x00, 0xe0, 0xff, 0x10, 0x00, 0xdd, 0xff, 0x0f, 0x00, 0xdb, 0xff, 0x0d, 0x00, 0xdb, 0xff, 0x0b, 0x00, 0xda, 0xff, 0x08, 0x00, 0xda, 0xff, 0x06, 0x00, 0xd9, 0xff, 0x04, 0x00, 0xd8, 0xff, 0x04, 0x00, 0xd6, 0xff, 0x04, 0x00, 0xd3, 0xff, 0x03, 0x00, 0xd1, 0xff, 0x02, 0x00, 0xce, 0xff, 0x00, 0x00, 0xcc, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xfb, 0xff, 0xca, 0xff, 0xfb, 0xff, 0xcc, 0xff, 0xfb, 0xff, 0xce, 0xff, 0xfc, 0xff, 0xd1, 0xff, 0xfb, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xd2, 0xff, 0xf2, 0xff, 0xcf, 0xff, 0xee, 0xff, 0xcd, 0xff, 0xeb, 0xff, 0xcb, 0xff, 0xea, 0xff, 0xcd, 0xff, 0xe9, 0xff, 0xd2, 0xff, 0xe8, 0xff, 0xd9, 0xff, 0xe7, 0xff, 0xe1, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xde, 0xff, 0xf2, 0xff, 0xdb, 0xff, 0xf4, 0xff, 0xd8, 0xff, 0xf7, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd8, 0xff, 0x01, 0x00, 0xda, 0xff, 0x08, 0x00, 0xdd, 0xff, 0x0d, 0x00, 0xe0, 0xff, 0x12, 0x00, 0xe1, 0xff, 0x15, 0x00, 0xe0, 0xff, 0x17, 0x00, 0xdd, 0xff, 0x1a, 0x00, 0xda, 0xff, 0x1c, 0x00, 0xd8, 0xff, 0x1d, 0x00, 0xd8, 0xff, 0x1e, 0x00, 0xdb, 0xff, 0x1f, 0x00, 0xe1, 0xff, 0x21, 0x00, 0xe7, 0xff, 0x23, 0x00, 0xed, 0xff, 0x24, 0x00, 0xf0, 0xff, 0x25, 0x00, 0xf0, 0xff, 0x24, 0x00, 0xef, 0xff, 0x21, 0x00, 0xed, 0xff, 0x1d, 0x00, 0xee, 0xff, 0x19, 0x00, 0xf1, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x07, 0x00, 0x16, 0x00, 0x04, 0x00, 0x19, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x20, 0x00, 0x03, 0x00, 0x22, 0x00, 0x02, 0x00, 0x22, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xfe, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x18, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf8, 0xff, 0x13, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xee, 0xff, 0x10, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x09, 0x00, 0xed, 0xff, 0x04, 0x00, 0xec, 0xff, 0x01, 0x00, 0xeb, 0xff, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xea, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfc, 0xff, 0xeb, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfd, 0xff, 0xea, 0xff, 0x00, 0x00, 0xea, 0xff, 0x01, 0x00, 0xec, 0xff, 0x01, 0x00, 0xee, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xff, 0xff, 0x16, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x12, 0x00, 0x21, 0x00, 0x15, 0x00, 0x22, 0x00, 0x16, 0x00, 0x23, 0x00, 0x17, 0x00, 0x23, 0x00, 0x16, 0x00, 0x22, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x20, 0x00, 0x08, 0x00, 0x22, 0x00, 0x05, 0x00, 0x23, 0x00, 0x01, 0x00, 0x22, 0x00, 0xfc, 0xff, 0x21, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0x1e, 0x00, 0xeb, 0xff, 0x1f, 0x00, 0xe8, 0xff, 0x21, 0x00, 0xe6, 0xff, 0x24, 0x00, 0xe5, 0xff, 0x28, 0x00, 0xe4, 0xff, 0x29, 0x00, 0xe3, 0xff, 0x27, 0x00, 0xe0, 0xff, 0x23, 0x00, 0xdd, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x15, 0x00, 0xd5, 0xff, 0x0e, 0x00, 0xd2, 0xff, 0x0a, 0x00, 0xd1, 0xff, 0x08, 0x00, 0xd1, 0xff, 0x06, 0x00, 0xd2, 0xff, 0x04, 0x00, 0xd3, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xf9, 0xff, 0xd5, 0xff, 0xef, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xd7, 0xff, 0xda, 0xff, 0xd7, 0xff, 0xd1, 0xff, 0xd8, 0xff, 0xcb, 0xff, 0xda, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xc8, 0xff, 0xe2, 0xff, 0xc9, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xea, 0xff, 0xc6, 0xff, 0xed, 0xff, 0xc2, 0xff, 0xee, 0xff, 0xbd, 0xff, 0xef, 0xff, 0xb9, 0xff, 0xf0, 0xff, 0xb7, 0xff, 0xf2, 0xff, 0xb8, 0xff, 0xf5, 0xff, 0xbc, 0xff, 0xf9, 0xff, 0xc3, 0xff, 0xfe, 0xff, 0xc9, 0xff, 0x03, 0x00, 0xcf, 0xff, 0x07, 0x00, 0xd2, 0xff, 0x0a, 0x00, 0xd4, 0xff, 0x0b, 0x00, 0xd5, 0xff, 0x0b, 0x00, 0xd7, 0xff, 0x0c, 0x00, 0xd9, 0xff, 0x0f, 0x00, 0xdd, 0xff, 0x13, 0x00, 0xe3, 0xff, 0x17, 0x00, 0xe8, 0xff, 0x1c, 0x00, 0xed, 0xff, 0x20, 0x00, 0xef, 0xff, 0x23, 0x00, 0xef, 0xff, 0x25, 0x00, 0xed, 0xff, 0x25, 0x00, 0xec, 0xff, 0x24, 0x00, 0xec, 0xff, 0x24, 0x00, 0xee, 0xff, 0x25, 0x00, 0xf2, 0xff, 0x27, 0x00, 0xf8, 0xff, 0x29, 0x00, 0xfd, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x25, 0x00, 0xff, 0xff, 0x22, 0x00, 0xfe, 0xff, 0x20, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x02, 0x00, 0x20, 0x00, 0x07, 0x00, 0x21, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x10, 0x00, 0x20, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x15, 0x00, 0x1c, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x13, 0x00, 0x19, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x18, 0x00, 0x12, 0x00, 0x17, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf3, 0xff, 0x08, 0x00, 0xee, 0xff, 0x06, 0x00, 0xea, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x00, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe2, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xf8, 0xff, 0xd8, 0xff, 0xf8, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xd0, 0xff, 0xf3, 0xff, 0xcd, 0xff, 0xf0, 0xff, 0xcd, 0xff, 0xef, 0xff, 0xce, 0xff, 0xf1, 0xff, 0xd1, 0xff, 0xf4, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xd5, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd2, 0xff, 0xf7, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0xd5, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x05, 0x00, 0xea, 0xff, 0x08, 0x00, 0xed, 0xff, 0x09, 0x00, 0xed, 0xff, 0x07, 0x00, 0xed, 0xff, 0x05, 0x00, 0xed, 0xff, 0x02, 0x00, 0xef, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0c, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x13, 0x00, 0x02, 0x00, 0x14, 0x00, 0x09, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x17, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x20, 0x00, 0x11, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x24, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x0b, 0x00, 0x41, 0x00, 0x0a, 0x00, 0x47, 0x00, 0x08, 0x00, 0x4b, 0x00, 0x04, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4d, 0x00, 0xfc, 0xff, 0x4d, 0x00, 0xfa, 0xff, 0x4c, 0x00, 0xf8, 0xff, 0x4b, 0x00, 0xf9, 0xff, 0x4a, 0x00, 0xf9, 0xff, 0x4a, 0x00, 0xf9, 0xff, 0x49, 0x00, 0xf7, 0xff, 0x47, 0x00, 0xf2, 0xff, 0x44, 0x00, 0xed, 0xff, 0x41, 0x00, 0xe9, 0xff, 0x3e, 0x00, 0xe6, 0xff, 0x3a, 0x00, 0xe5, 0xff, 0x35, 0x00, 0xe4, 0xff, 0x2f, 0x00, 0xe4, 0xff, 0x2a, 0x00, 0xe3, 0xff, 0x24, 0x00, 0xe1, 0xff, 0x20, 0x00, 0xde, 0xff, 0x1d, 0x00, 0xdb, 0xff, 0x1b, 0x00, 0xd9, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x17, 0x00, 0xd9, 0xff, 0x13, 0x00, 0xdb, 0xff, 0x0d, 0x00, 0xdc, 0xff, 0x06, 0x00, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xf9, 0xff, 0xde, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfe, 0xff, 0xe0, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x02, 0x00, 0xe2, 0xff, 0x00, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xee, 0xff, 0x02, 0x00, 0xee, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x15, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1e, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xfd, 0xff, 0x25, 0x00, 0xfd, 0xff, 0x26, 0x00, 0xfc, 0xff, 0x26, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xfb, 0xff, 0x29, 0x00, 0xfe, 0xff, 0x2c, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x07, 0x00, 0x29, 0x00, 0x08, 0x00, 0x25, 0x00, 0x09, 0x00, 0x22, 0x00, 0x09, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf6, 0xff, 0xe7, 0xff, 0xf6, 0xff, 0xe5, 0xff, 0xf7, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xde, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xda, 0xff, 0xf3, 0xff, 0xd9, 0xff, 0xf2, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd8, 0xff, 0xf5, 0xff, 0xd7, 0xff, 0xf8, 0xff, 0xd5, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0xd5, 0xff, 0xfa, 0xff, 0xd8, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xe2, 0xff, 0xfa, 0xff, 0xe5, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x02, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe7, 0xff, 0x05, 0x00, 0xeb, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xed, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe7, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0e, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe6, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x05, 0x00, 0xec, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xef, 0xff, 0x15, 0x00, 0xed, 0xff, 0x16, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xeb, 0xff, 0x13, 0x00, 0xea, 0xff, 0x10, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x07, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xfc, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x20, 0x00, 0xff, 0xff, 0x22, 0x00, 0x00, 0x00, 0x24, 0x00, 0xfe, 0xff, 0x25, 0x00, 0xfc, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf7, 0xff, 0x29, 0x00, 0xf7, 0xff, 0x2b, 0x00, 0xf9, 0xff, 0x2e, 0x00, 0xfa, 0xff, 0x30, 0x00, 0xfb, 0xff, 0x31, 0x00, 0xf9, 0xff, 0x32, 0x00, 0xf6, 0xff, 0x32, 0x00, 0xf1, 0xff, 0x31, 0x00, 0xec, 0xff, 0x30, 0x00, 0xea, 0xff, 0x2e, 0x00, 0xeb, 0xff, 0x2c, 0x00, 0xec, 0xff, 0x2b, 0x00, 0xee, 0xff, 0x2a, 0x00, 0xef, 0xff, 0x28, 0x00, 0xed, 0xff, 0x25, 0x00, 0xe9, 0xff, 0x22, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xe2, 0xff, 0x1a, 0x00, 0xe0, 0xff, 0x15, 0x00, 0xe1, 0xff, 0x10, 0x00, 0xe3, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x02, 0x00, 0xe5, 0xff, 0xfe, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xe2, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xf2, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xf4, 0xff, 0xde, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0x02, 0x00, 0xdc, 0xff, 0x07, 0x00, 0xdc, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xd8, 0xff, 0x10, 0x00, 0xd5, 0xff, 0x14, 0x00, 0xd2, 0xff, 0x1a, 0x00, 0xd1, 0xff, 0x22, 0x00, 0xd0, 0xff, 0x29, 0x00, 0xd2, 0xff, 0x2f, 0x00, 0xd4, 0xff, 0x31, 0x00, 0xd5, 0xff, 0x30, 0x00, 0xd7, 0xff, 0x2d, 0x00, 0xd7, 0xff, 0x28, 0x00, 0xd7, 0xff, 0x24, 0x00, 0xd7, 0xff, 0x23, 0x00, 0xd7, 0xff, 0x25, 0x00, 0xd8, 0xff, 0x27, 0x00, 0xda, 0xff, 0x28, 0x00, 0xdd, 0xff, 0x26, 0x00, 0xe1, 0xff, 0x21, 0x00, 0xe3, 0xff, 0x1a, 0x00, 0xe4, 0xff, 0x13, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe1, 0xff, 0x0a, 0x00, 0xdf, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x0a, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x08, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x13, 0x00, 0x07, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xfc, 0xff, 0x20, 0x00, 0xfb, 0xff, 0x23, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xfb, 0xff, 0x2a, 0x00, 0xfc, 0xff, 0x2d, 0x00, 0xfb, 0xff, 0x2e, 0x00, 0xf8, 0xff, 0x2f, 0x00, 0xf4, 0xff, 0x2e, 0x00, 0xef, 0xff, 0x2c, 0x00, 0xeb, 0xff, 0x2a, 0x00, 0xe8, 0xff, 0x29, 0x00, 0xe6, 0xff, 0x28, 0x00, 0xe5, 0xff, 0x27, 0x00, 0xe4, 0xff, 0x27, 0x00, 0xe3, 0xff, 0x26, 0x00, 0xe1, 0xff, 0x25, 0x00, 0xe0, 0xff, 0x23, 0x00, 0xe0, 0xff, 0x20, 0x00, 0xe0, 0xff, 0x1c, 0x00, 0xe0, 0xff, 0x18, 0x00, 0xe1, 0xff, 0x14, 0x00, 0xe2, 0xff, 0x11, 0x00, 0xe3, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe3, 0xff, 0x0a, 0x00, 0xe5, 0xff, 0x06, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xee, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xed, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe1, 0xff, 0x13, 0x00, 0xde, 0xff, 0x18, 0x00, 0xd9, 0xff, 0x1d, 0x00, 0xd3, 0xff, 0x22, 0x00, 0xcf, 0xff, 0x26, 0x00, 0xcc, 0xff, 0x28, 0x00, 0xca, 0xff, 0x28, 0x00, 0xc8, 0xff, 0x27, 0x00, 0xc6, 0xff, 0x27, 0x00, 0xc5, 0xff, 0x26, 0x00, 0xc3, 0xff, 0x25, 0x00, 0xc0, 0xff, 0x25, 0x00, 0xbe, 0xff, 0x25, 0x00, 0xbc, 0xff, 0x25, 0x00, 0xbc, 0xff, 0x26, 0x00, 0xbd, 0xff, 0x26, 0x00, 0xc0, 0xff, 0x25, 0x00, 0xc4, 0xff, 0x23, 0x00, 0xc9, 0xff, 0x20, 0x00, 0xce, 0xff, 0x1d, 0x00, 0xd3, 0xff, 0x1a, 0x00, 0xd8, 0xff, 0x19, 0x00, 0xdb, 0xff, 0x18, 0x00, 0xdd, 0xff, 0x18, 0x00, 0xdf, 0xff, 0x18, 0x00, 0xe3, 0xff, 0x17, 0x00, 0xe8, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x11, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x09, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x15, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x20, 0x00, 0xfa, 0xff, 0x21, 0x00, 0xf7, 0xff, 0x1f, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xef, 0xff, 0x1d, 0x00, 0xec, 0xff, 0x21, 0x00, 0xe9, 0xff, 0x27, 0x00, 0xe6, 0xff, 0x2c, 0x00, 0xe2, 0xff, 0x30, 0x00, 0xdd, 0xff, 0x30, 0x00, 0xd9, 0xff, 0x2f, 0x00, 0xd4, 0xff, 0x2d, 0x00, 0xd2, 0xff, 0x2c, 0x00, 0xd0, 0xff, 0x2d, 0x00, 0xd1, 0xff, 0x30, 0x00, 0xd2, 0xff, 0x33, 0x00, 0xd4, 0xff, 0x36, 0x00, 0xd5, 0xff, 0x38, 0x00, 0xd5, 0xff, 0x38, 0x00, 0xd5, 0xff, 0x36, 0x00, 0xd5, 0xff, 0x33, 0x00, 0xd6, 0xff, 0x31, 0x00, 0xd9, 0xff, 0x2f, 0x00, 0xdd, 0xff, 0x2e, 0x00, 0xe2, 0xff, 0x2e, 0x00, 0xe7, 0xff, 0x2c, 0x00, 0xec, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x28, 0x00, 0xf3, 0xff, 0x25, 0x00, 0xf6, 0xff, 0x21, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x05, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xef, 0xff, 0x07, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xea, 0xff, 0x07, 0x00, 0xea, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x11, 0x00, 0xec, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x13, 0x00, 0xea, 0xff, 0x13, 0x00, 0xe8, 0xff, 0x11, 0x00, 0xe8, 0xff, 0x11, 0x00, 0xea, 0xff, 0x12, 0x00, 0xed, 0xff, 0x15, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xf9, 0xff, 0x1e, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xff, 0xff, 0x16, 0x00, 0x01, 0x00, 0x14, 0x00, 0x02, 0x00, 0x12, 0x00, 0x03, 0x00, 0x11, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0b, 0x00, 0xed, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0f, 0x00, 0xe2, 0xff, 0x11, 0x00, 0xe3, 0xff, 0x12, 0x00, 0xe4, 0xff, 0x12, 0x00, 0xe3, 0xff, 0x10, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xde, 0xff, 0x0c, 0x00, 0xdd, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x0b, 0x00, 0xdc, 0xff, 0x0a, 0x00, 0xdd, 0xff, 0x08, 0x00, 0xde, 0xff, 0x04, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xf7, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xe6, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xf3, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xee, 0xff, 0xe6, 0xff, 0xf1, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xdb, 0xff, 0xfe, 0xff, 0xda, 0xff, 0x02, 0x00, 0xda, 0xff, 0x05, 0x00, 0xda, 0xff, 0x07, 0x00, 0xdb, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0d, 0x00, 0xda, 0xff, 0x11, 0x00, 0xd9, 0xff, 0x15, 0x00, 0xd9, 0xff, 0x19, 0x00, 0xda, 0xff, 0x1d, 0x00, 0xdb, 0xff, 0x1f, 0x00, 0xdc, 0xff, 0x21, 0x00, 0xde, 0xff, 0x22, 0x00, 0xe1, 0xff, 0x24, 0x00, 0xe3, 0xff, 0x27, 0x00, 0xe5, 0xff, 0x29, 0x00, 0xe7, 0xff, 0x2b, 0x00, 0xe8, 0xff, 0x2c, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x2d, 0x00, 0xec, 0xff, 0x2e, 0x00, 0xee, 0xff, 0x30, 0x00, 0xf0, 0xff, 0x32, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xf4, 0xff, 0x34, 0x00, 0xf4, 0xff, 0x34, 0x00, 0xf5, 0xff, 0x32, 0x00, 0xf7, 0xff, 0x30, 0x00, 0xf9, 0xff, 0x2e, 0x00, 0xfc, 0xff, 0x2d, 0x00, 0xff, 0xff, 0x2d, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x2e, 0x00, 0x0b, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x2b, 0x00, 0x10, 0x00, 0x28, 0x00, 0x13, 0x00, 0x25, 0x00, 0x16, 0x00, 0x21, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x19, 0x00, 0x26, 0x00, 0x16, 0x00, 0x29, 0x00, 0x14, 0x00, 0x2b, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x2e, 0x00, 0xfd, 0xff, 0x2e, 0x00, 0xf9, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2b, 0x00, 0xf1, 0xff, 0x29, 0x00, 0xee, 0xff, 0x27, 0x00, 0xea, 0xff, 0x24, 0x00, 0xe7, 0xff, 0x21, 0x00, 0xe4, 0xff, 0x1e, 0x00, 0xe1, 0xff, 0x1b, 0x00, 0xde, 0xff, 0x17, 0x00, 0xdb, 0xff, 0x13, 0x00, 0xd7, 0xff, 0x0e, 0x00, 0xd5, 0xff, 0x08, 0x00, 0xd5, 0xff, 0x02, 0x00, 0xd6, 0xff, 0xfc, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xef, 0xff, 0xd6, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xea, 0xff, 0xd2, 0xff, 0xe6, 0xff, 0xd2, 0xff, 0xe1, 0xff, 0xd5, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xd0, 0xff, 0xdf, 0xff, 0xcc, 0xff, 0xe1, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xca, 0xff, 0xe1, 0xff, 0xca, 0xff, 0xe1, 0xff, 0xca, 0xff, 0xe4, 0xff, 0xc8, 0xff, 0xe8, 0xff, 0xc6, 0xff, 0xec, 0xff, 0xc5, 0xff, 0xf0, 0xff, 0xc4, 0xff, 0xf3, 0xff, 0xc6, 0xff, 0xf6, 0xff, 0xc9, 0xff, 0xf7, 0xff, 0xcd, 0xff, 0xfa, 0xff, 0xd3, 0xff, 0xfd, 0xff, 0xd8, 0xff, 0x00, 0x00, 0xde, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x0b, 0x00, 0xe5, 0xff, 0x0e, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x1b, 0x00, 0xf6, 0xff, 0x1e, 0x00, 0xfc, 0xff, 0x21, 0x00, 0x02, 0x00, 0x22, 0x00, 0x05, 0x00, 0x23, 0x00, 0x08, 0x00, 0x23, 0x00, 0x09, 0x00, 0x23, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x25, 0x00, 0x10, 0x00, 0x26, 0x00, 0x16, 0x00, 0x26, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x24, 0x00, 0x21, 0x00, 0x2a, 0x00, 0x1d, 0x00, 0x2e, 0x00, 0x19, 0x00, 0x2f, 0x00, 0x16, 0x00, 0x2f, 0x00, 0x14, 0x00, 0x2f, 0x00, 0x13, 0x00, 0x2f, 0x00, 0x11, 0x00, 0x31, 0x00, 0x0f, 0x00, 0x34, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x06, 0x00, 0x3a, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00, 0x36, 0x00, 0xfe, 0xff, 0x33, 0x00, 0xfc, 0xff, 0x31, 0x00, 0xfb, 0xff, 0x30, 0x00, 0xfb, 0xff, 0x30, 0x00, 0xfb, 0xff, 0x2f, 0x00, 0xfa, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2a, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xec, 0xff, 0x24, 0x00, 0xe6, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1d, 0x00, 0xde, 0xff, 0x19, 0x00, 0xdd, 0xff, 0x15, 0x00, 0xdd, 0xff, 0x11, 0x00, 0xdd, 0xff, 0x0c, 0x00, 0xdb, 0xff, 0x08, 0x00, 0xd8, 0xff, 0x03, 0x00, 0xd4, 0xff, 0xfe, 0xff, 0xd2, 0xff, 0xfa, 0xff, 0xd1, 0xff, 0xf6, 0xff, 0xd2, 0xff, 0xf4, 0xff, 0xd5, 0xff, 0xf3, 0xff, 0xd8, 0xff, 0xf2, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xdb, 0xff, 0xee, 0xff, 0xda, 0xff, 0xec, 0xff, 0xda, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xea, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xf3, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xfe, 0xff, 0xe3, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x09, 0x00, 0xe2, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x15, 0x00, 0xe3, 0xff, 0x19, 0x00, 0xe4, 0xff, 0x1c, 0x00, 0xe3, 0xff, 0x20, 0x00, 0xe3, 0xff, 0x23, 0x00, 0xe4, 0xff, 0x27, 0x00, 0xe5, 0xff, 0x2b, 0x00, 0xe8, 0xff, 0x2e, 0x00, 0xeb, 0xff, 0x2f, 0x00, 0xef, 0xff, 0x2f, 0x00, 0xf2, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x2b, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf8, 0xff, 0x2b, 0x00, 0xfb, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x29, 0x00, 0x05, 0x00, 0x27, 0x00, 0x09, 0x00, 0x25, 0x00, 0x0d, 0x00, 0x24, 0x00, 0x0e, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x19, 0x00, 0x18, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x1d, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xf1, 0xff, 0x22, 0x00, 0xee, 0xff, 0x21, 0x00, 0xeb, 0xff, 0x20, 0x00, 0xe7, 0xff, 0x1d, 0x00, 0xe4, 0xff, 0x1a, 0x00, 0xe2, 0xff, 0x19, 0x00, 0xe0, 0xff, 0x18, 0x00, 0xde, 0xff, 0x18, 0x00, 0xdc, 0xff, 0x18, 0x00, 0xdb, 0xff, 0x18, 0x00, 0xda, 0xff, 0x17, 0x00, 0xda, 0xff, 0x15, 0x00, 0xd9, 0xff, 0x13, 0x00, 0xd8, 0xff, 0x0f, 0x00, 0xd6, 0xff, 0x0b, 0x00, 0xd3, 0xff, 0x07, 0x00, 0xd1, 0xff, 0x04, 0x00, 0xd0, 0xff, 0x02, 0x00, 0xd0, 0xff, 0x01, 0x00, 0xd2, 0xff, 0x00, 0x00, 0xd5, 0xff, 0x00, 0x00, 0xd8, 0xff, 0xfe, 0xff, 0xda, 0xff, 0xfc, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xdb, 0xff, 0xf3, 0xff, 0xdb, 0xff, 0xef, 0xff, 0xdd, 0xff, 0xec, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xe8, 0xff, 0xfb, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xe3, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe2, 0xff, 0x10, 0x00, 0xe3, 0xff, 0x15, 0x00, 0xe4, 0xff, 0x18, 0x00, 0xe5, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe4, 0xff, 0x23, 0x00, 0xe2, 0xff, 0x27, 0x00, 0xe1, 0xff, 0x2a, 0x00, 0xe0, 0xff, 0x2c, 0x00, 0xdf, 0xff, 0x2b, 0x00, 0xde, 0xff, 0x2a, 0x00, 0xde, 0xff, 0x29, 0x00, 0xdd, 0xff, 0x29, 0x00, 0xdd, 0xff, 0x29, 0x00, 0xdc, 0xff, 0x2a, 0x00, 0xdc, 0xff, 0x2b, 0x00, 0xdc, 0xff, 0x2a, 0x00, 0xdd, 0xff, 0x27, 0x00, 0xdd, 0xff, 0x23, 0x00, 0xdf, 0xff, 0x1e, 0x00, 0xe2, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x18, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xf5, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x10, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xec, 0xff, 0x08, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe7, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe1, 0xff, 0x05, 0x00, 0xdf, 0xff, 0x01, 0x00, 0xdb, 0xff, 0xfc, 0xff, 0xd7, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf7, 0xff, 0xd2, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf5, 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xd7, 0xff, 0xf3, 0xff, 0xdc, 0xff, 0xf4, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x17, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x04, 0x00, 0x21, 0x00, 0x05, 0x00, 0x22, 0x00, 0x06, 0x00, 0x24, 0x00, 0x04, 0x00, 0x26, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x29, 0x00, 0x08, 0x00, 0x27, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x0d, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x21, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x13, 0x00, 0x15, 0x00, 0x17, 0x00, 0x13, 0x00, 0x19, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x09, 0x00, 0x18, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe5, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xdf, 0xff, 0xf9, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xde, 0xff, 0x01, 0x00, 0xde, 0xff, 0x03, 0x00, 0xdd, 0xff, 0x03, 0x00, 0xde, 0xff, 0x01, 0x00, 0xdf, 0xff, 0xfe, 0xff, 0xe1, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xf9, 0xff, 0xe5, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xed, 0xff, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x07, 0x00, 0x16, 0x00, 0x02, 0x00, 0x15, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x18, 0x00, 0xf5, 0xff, 0x16, 0x00, 0xf4, 0xff, 0x14, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0b, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0c, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xf0, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x0e, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xe5, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xdb, 0xff, 0x07, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd8, 0xff, 0x09, 0x00, 0xda, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x0c, 0x00, 0xd8, 0xff, 0x0c, 0x00, 0xd6, 0xff, 0x0c, 0x00, 0xd3, 0xff, 0x0e, 0x00, 0xd2, 0xff, 0x10, 0x00, 0xd3, 0xff, 0x13, 0x00, 0xd5, 0xff, 0x16, 0x00, 0xd8, 0xff, 0x19, 0x00, 0xdb, 0xff, 0x1c, 0x00, 0xdc, 0xff, 0x1e, 0x00, 0xdc, 0xff, 0x21, 0x00, 0xda, 0xff, 0x22, 0x00, 0xd9, 0xff, 0x23, 0x00, 0xda, 0xff, 0x22, 0x00, 0xdd, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1f, 0x00, 0xe6, 0xff, 0x1f, 0x00, 0xea, 0xff, 0x1f, 0x00, 0xed, 0xff, 0x1f, 0x00, 0xee, 0xff, 0x1e, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x17, 0x00, 0x08, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x20, 0x00, 0xfd, 0xff, 0x24, 0x00, 0xfb, 0xff, 0x28, 0x00, 0xfa, 0xff, 0x2c, 0x00, 0xfa, 0xff, 0x2f, 0x00, 0xf9, 0xff, 0x30, 0x00, 0xf8, 0xff, 0x2f, 0x00, 0xf7, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2a, 0x00, 0xf3, 0xff, 0x2a, 0x00, 0xf3, 0xff, 0x2b, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xf3, 0xff, 0x2d, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xf2, 0xff, 0x28, 0x00, 0xf2, 0xff, 0x25, 0x00, 0xf2, 0xff, 0x21, 0x00, 0xf1, 0xff, 0x1e, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xef, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xec, 0xff, 0x19, 0x00, 0xea, 0xff, 0x17, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe8, 0xff, 0x09, 0x00, 0xe7, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x00, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe3, 0xff, 0xea, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xde, 0xff, 0xea, 0xff, 0xdd, 0xff, 0xeb, 0xff, 0xdd, 0xff, 0xed, 0xff, 0xdb, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf5, 0xff, 0xd4, 0xff, 0xf8, 0xff, 0xd0, 0xff, 0xf9, 0xff, 0xcd, 0xff, 0xfa, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xcc, 0xff, 0xf9, 0xff, 0xcd, 0xff, 0xfa, 0xff, 0xcf, 0xff, 0xfb, 0xff, 0xd0, 0xff, 0xfe, 0xff, 0xd1, 0xff, 0x00, 0x00, 0xd2, 0xff, 0x03, 0x00, 0xd3, 0xff, 0x05, 0x00, 0xd4, 0xff, 0x06, 0x00, 0xd6, 0xff, 0x08, 0x00, 0xd8, 0xff, 0x09, 0x00, 0xd9, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xde, 0xff, 0x0d, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x11, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x11, 0x00, 0x05, 0x00, 0x16, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x20, 0x00, 0xfc, 0xff, 0x23, 0x00, 0xf9, 0xff, 0x26, 0x00, 0xf6, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf4, 0xff, 0x35, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xf3, 0xff, 0x37, 0x00, 0xf2, 0xff, 0x35, 0x00, 0xf0, 0xff, 0x32, 0x00, 0xef, 0xff, 0x2e, 0x00, 0xed, 0xff, 0x2b, 0x00, 0xec, 0xff, 0x2a, 0x00, 0xed, 0xff, 0x2a, 0x00, 0xee, 0xff, 0x2a, 0x00, 0xf0, 0xff, 0x29, 0x00, 0xf1, 0xff, 0x28, 0x00, 0xf2, 0xff, 0x24, 0x00, 0xf4, 0xff, 0x1e, 0x00, 0xf7, 0xff, 0x16, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x07, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf2, 0xff, 0x0a, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0a, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe3, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x07, 0x00, 0xe1, 0xff, 0x07, 0x00, 0xde, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x09, 0x00, 0xd4, 0xff, 0x09, 0x00, 0xd1, 0xff, 0x08, 0x00, 0xcf, 0xff, 0x08, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xd0, 0xff, 0x09, 0x00, 0xd0, 0xff, 0x0c, 0x00, 0xd0, 0xff, 0x0f, 0x00, 0xce, 0xff, 0x12, 0x00, 0xcd, 0xff, 0x13, 0x00, 0xcd, 0xff, 0x14, 0x00, 0xcf, 0xff, 0x14, 0x00, 0xd2, 0xff, 0x13, 0x00, 0xd5, 0xff, 0x12, 0x00, 0xd7, 0xff, 0x11, 0x00, 0xda, 0xff, 0x10, 0x00, 0xdc, 0xff, 0x0f, 0x00, 0xdf, 0xff, 0x0c, 0x00, 0xe3, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x03, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x1d, 0x00, 0xed, 0xff, 0x23, 0x00, 0xeb, 0xff, 0x2a, 0x00, 0xeb, 0xff, 0x2f, 0x00, 0xeb, 0xff, 0x34, 0x00, 0xeb, 0xff, 0x38, 0x00, 0xea, 0xff, 0x3b, 0x00, 0xe8, 0xff, 0x3d, 0x00, 0xe7, 0xff, 0x3f, 0x00, 0xe7, 0xff, 0x40, 0x00, 0xe6, 0xff, 0x40, 0x00, 0xe6, 0xff, 0x40, 0x00, 0xe5, 0xff, 0x40, 0x00, 0xe3, 0xff, 0x40, 0x00, 0xe2, 0xff, 0x41, 0x00, 0xe1, 0xff, 0x41, 0x00, 0xe2, 0xff, 0x41, 0x00, 0xe4, 0xff, 0x40, 0x00, 0xe6, 0xff, 0x3d, 0x00, 0xe9, 0xff, 0x3a, 0x00, 0xea, 0xff, 0x36, 0x00, 0xeb, 0xff, 0x32, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xea, 0xff, 0x2a, 0x00, 0xeb, 0xff, 0x26, 0x00, 0xed, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x20, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xf3, 0xff, 0x18, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf2, 0xff, 0x0b, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe2, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xd5, 0xff, 0xff, 0xff, 0xce, 0xff, 0x02, 0x00, 0xc8, 0xff, 0x06, 0x00, 0xc5, 0xff, 0x0a, 0x00, 0xc3, 0xff, 0x0d, 0x00, 0xc2, 0xff, 0x0f, 0x00, 0xc2, 0xff, 0x11, 0x00, 0xc0, 0xff, 0x12, 0x00, 0xbc, 0xff, 0x12, 0x00, 0xb7, 0xff, 0x13, 0x00, 0xb3, 0xff, 0x13, 0x00, 0xaf, 0xff, 0x12, 0x00, 0xae, 0xff, 0x10, 0x00, 0xb0, 0xff, 0x0e, 0x00, 0xb4, 0xff, 0x0c, 0x00, 0xb9, 0xff, 0x0a, 0x00, 0xbd, 0xff, 0x0a, 0x00, 0xc0, 0xff, 0x0b, 0x00, 0xc2, 0xff, 0x0b, 0x00, 0xc3, 0xff, 0x0b, 0x00, 0xc5, 0xff, 0x0b, 0x00, 0xc8, 0xff, 0x0b, 0x00, 0xcc, 0xff, 0x0b, 0x00, 0xd3, 0xff, 0x0d, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x10, 0x00, 0xee, 0xff, 0x10, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x09, 0x00, 0x21, 0x00, 0x07, 0x00, 0x28, 0x00, 0x04, 0x00, 0x2f, 0x00, 0x02, 0x00, 0x36, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x46, 0x00, 0x01, 0x00, 0x46, 0x00, 0x02, 0x00, 0x46, 0x00, 0x04, 0x00, 0x48, 0x00, 0x05, 0x00, 0x49, 0x00, 0x05, 0x00, 0x4a, 0x00, 0x06, 0x00, 0x4a, 0x00, 0x07, 0x00, 0x49, 0x00, 0x08, 0x00, 0x46, 0x00, 0x0b, 0x00, 0x40, 0x00, 0x0e, 0x00, 0x3a, 0x00, 0x10, 0x00, 0x34, 0x00, 0x12, 0x00, 0x2f, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x14, 0x00, 0x28, 0x00, 0x13, 0x00, 0x25, 0x00, 0x12, 0x00, 0x21, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x11, 0x00, 0x18, 0x00, 0x13, 0x00, 0x12, 0x00, 0x16, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x07, 0x00, 0x19, 0x00, 0x02, 0x00, 0x19, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xfa, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1d, 0x00, 0xed, 0xff, 0x1e, 0x00, 0xe9, 0xff, 0x1e, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xe0, 0xff, 0x1d, 0x00, 0xdc, 0xff, 0x1b, 0x00, 0xd7, 0xff, 0x19, 0x00, 0xd4, 0xff, 0x18, 0x00, 0xd1, 0xff, 0x17, 0x00, 0xcf, 0xff, 0x17, 0x00, 0xcc, 0xff, 0x16, 0x00, 0xca, 0xff, 0x15, 0x00, 0xc7, 0xff, 0x13, 0x00, 0xc5, 0xff, 0x11, 0x00, 0xc3, 0xff, 0x10, 0x00, 0xc2, 0xff, 0x0f, 0x00, 0xc1, 0xff, 0x0e, 0x00, 0xc0, 0xff, 0x0d, 0x00, 0xc0, 0xff, 0x0a, 0x00, 0xc1, 0xff, 0x06, 0x00, 0xc2, 0xff, 0x01, 0x00, 0xc3, 0xff, 0xfe, 0xff, 0xc5, 0xff, 0xfc, 0xff, 0xc7, 0xff, 0xfc, 0xff, 0xcb, 0xff, 0xfe, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xfd, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xe1, 0xff, 0xf4, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf6, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf5, 0xff, 0x25, 0x00, 0xf5, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x31, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xfa, 0xff, 0x3a, 0x00, 0xfc, 0xff, 0x3b, 0x00, 0xfe, 0xff, 0x3c, 0x00, 0xff, 0xff, 0x3d, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0xfc, 0xff, 0x41, 0x00, 0xfa, 0xff, 0x44, 0x00, 0xf8, 0xff, 0x47, 0x00, 0xf6, 0xff, 0x4a, 0x00, 0xf5, 0xff, 0x4b, 0x00, 0xf6, 0xff, 0x4c, 0x00, 0xf6, 0xff, 0x4b, 0x00, 0xf5, 0xff, 0x4a, 0x00, 0xf3, 0xff, 0x4a, 0x00, 0xef, 0xff, 0x49, 0x00, 0xeb, 0xff, 0x48, 0x00, 0xe8, 0xff, 0x46, 0x00, 0xe6, 0xff, 0x43, 0x00, 0xe6, 0xff, 0x40, 0x00, 0xe7, 0xff, 0x3c, 0x00, 0xe9, 0xff, 0x38, 0x00, 0xea, 0xff, 0x34, 0x00, 0xeb, 0xff, 0x30, 0x00, 0xeb, 0xff, 0x2c, 0x00, 0xeb, 0xff, 0x27, 0x00, 0xec, 0xff, 0x22, 0x00, 0xee, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf7, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xde, 0xff, 0xec, 0xff, 0xd9, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xee, 0xff, 0xcd, 0xff, 0xed, 0xff, 0xc7, 0xff, 0xea, 0xff, 0xc4, 0xff, 0xe5, 0xff, 0xc2, 0xff, 0xe2, 0xff, 0xc3, 0xff, 0xe0, 0xff, 0xc6, 0xff, 0xdf, 0xff, 0xca, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xe3, 0xff, 0xcd, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xe5, 0xff, 0xcb, 0xff, 0xe4, 0xff, 0xcb, 0xff, 0xe3, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xce, 0xff, 0xe0, 0xff, 0xd2, 0xff, 0xe1, 0xff, 0xd7, 0xff, 0xe3, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe6, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xe9, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xed, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xee, 0xff, 0x02, 0x00, 0xee, 0xff, 0x08, 0x00, 0xef, 0xff, 0x0d, 0x00, 0xf0, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfb, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x22, 0x00, 0x01, 0x00, 0x25, 0x00, 0x03, 0x00, 0x27, 0x00, 0x06, 0x00, 0x28, 0x00, 0x09, 0x00, 0x29, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x11, 0x00, 0x29, 0x00, 0x17, 0x00, 0x2a, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x2b, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x24, 0x00, 0x31, 0x00, 0x23, 0x00, 0x34, 0x00, 0x21, 0x00, 0x37, 0x00, 0x1f, 0x00, 0x38, 0x00, 0x1b, 0x00, 0x37, 0x00, 0x16, 0x00, 0x34, 0x00, 0x10, 0x00, 0x30, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x2c, 0x00, 0xfe, 0xff, 0x2c, 0x00, 0xf8, 0xff, 0x2c, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xeb, 0xff, 0x29, 0x00, 0xe4, 0xff, 0x25, 0x00, 0xdc, 0xff, 0x21, 0x00, 0xd4, 0xff, 0x1d, 0x00, 0xcd, 0xff, 0x1b, 0x00, 0xc8, 0xff, 0x19, 0x00, 0xc4, 0xff, 0x18, 0x00, 0xc1, 0xff, 0x17, 0x00, 0xbd, 0xff, 0x16, 0x00, 0xba, 0xff, 0x13, 0x00, 0xb6, 0xff, 0x10, 0x00, 0xb2, 0xff, 0x0e, 0x00, 0xb0, 0xff, 0x0c, 0x00, 0xae, 0xff, 0x0a, 0x00, 0xac, 0xff, 0x08, 0x00, 0xac, 0xff, 0x05, 0x00, 0xad, 0xff, 0x02, 0x00, 0xae, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xfd, 0xff, 0xb2, 0xff, 0xfc, 0xff, 0xb5, 0xff, 0xfc, 0xff, 0xb8, 0xff, 0xfd, 0xff, 0xbc, 0xff, 0xfd, 0xff, 0xc0, 0xff, 0xfc, 0xff, 0xc5, 0xff, 0xfa, 0xff, 0xca, 0xff, 0xf7, 0xff, 0xcf, 0xff, 0xf3, 0xff, 0xd4, 0xff, 0xf1, 0xff, 0xd9, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe6, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x11, 0x00, 0xeb, 0xff, 0x14, 0x00, 0xed, 0xff, 0x17, 0x00, 0xef, 0xff, 0x1a, 0x00, 0xef, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x1f, 0x00, 0xf1, 0xff, 0x21, 0x00, 0xf3, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x27, 0x00, 0xfa, 0xff, 0x2a, 0x00, 0xff, 0xff, 0x2e, 0x00, 0x04, 0x00, 0x32, 0x00, 0x09, 0x00, 0x35, 0x00, 0x0d, 0x00, 0x37, 0x00, 0x10, 0x00, 0x37, 0x00, 0x12, 0x00, 0x37, 0x00, 0x14, 0x00, 0x37, 0x00, 0x16, 0x00, 0x38, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x1b, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x40, 0x00, 0x21, 0x00, 0x41, 0x00, 0x23, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x3a, 0x00, 0x23, 0x00, 0x35, 0x00, 0x21, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x03, 0x00, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x05, 0x00, 0xe3, 0xff, 0x02, 0x00, 0xe0, 0xff, 0xfd, 0xff, 0xdd, 0xff, 0xf9, 0xff, 0xda, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xf3, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0xd1, 0xff, 0xed, 0xff, 0xcf, 0xff, 0xe9, 0xff, 0xcd, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xdd, 0xff, 0xcd, 0xff, 0xda, 0xff, 0xcd, 0xff, 0xd8, 0xff, 0xcd, 0xff, 0xd7, 0xff, 0xcc, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xd1, 0xff, 0xcd, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xd4, 0xff, 0xc8, 0xff, 0xd7, 0xff, 0xc6, 0xff, 0xdb, 0xff, 0xc5, 0xff, 0xde, 0xff, 0xc4, 0xff, 0xe1, 0xff, 0xc3, 0xff, 0xe4, 0xff, 0xc2, 0xff, 0xe7, 0xff, 0xc2, 0xff, 0xeb, 0xff, 0xc2, 0xff, 0xef, 0xff, 0xc3, 0xff, 0xf4, 0xff, 0xc5, 0xff, 0xf9, 0xff, 0xc7, 0xff, 0xfe, 0xff, 0xc9, 0xff, 0x02, 0x00, 0xcc, 0xff, 0x07, 0x00, 0xce, 0xff, 0x0c, 0x00, 0xd1, 0xff, 0x11, 0x00, 0xd5, 0xff, 0x16, 0x00, 0xdb, 0xff, 0x1b, 0x00, 0xe0, 0xff, 0x1f, 0x00, 0xe5, 0xff, 0x23, 0x00, 0xea, 0xff, 0x27, 0x00, 0xed, 0xff, 0x2a, 0x00, 0xf0, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x31, 0x00, 0xf8, 0xff, 0x34, 0x00, 0xfd, 0xff, 0x37, 0x00, 0x03, 0x00, 0x39, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x0d, 0x00, 0x3a, 0x00, 0x10, 0x00, 0x3a, 0x00, 0x13, 0x00, 0x3a, 0x00, 0x16, 0x00, 0x39, 0x00, 0x1a, 0x00, 0x37, 0x00, 0x1f, 0x00, 0x34, 0x00, 0x24, 0x00, 0x30, 0x00, 0x2a, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x31, 0x00, 0x2b, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x29, 0x00, 0x37, 0x00, 0x26, 0x00, 0x38, 0x00, 0x23, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x3c, 0x00, 0x1d, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x40, 0x00, 0x1c, 0x00, 0x41, 0x00, 0x1c, 0x00, 0x42, 0x00, 0x1c, 0x00, 0x42, 0x00, 0x1a, 0x00, 0x42, 0x00, 0x18, 0x00, 0x41, 0x00, 0x14, 0x00, 0x3f, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x06, 0x00, 0x38, 0x00, 0x02, 0x00, 0x38, 0x00, 0xff, 0xff, 0x38, 0x00, 0xfc, 0xff, 0x37, 0x00, 0xf8, 0xff, 0x35, 0x00, 0xf4, 0xff, 0x31, 0x00, 0xef, 0xff, 0x2d, 0x00, 0xea, 0xff, 0x28, 0x00, 0xe6, 0xff, 0x23, 0x00, 0xe3, 0xff, 0x1e, 0x00, 0xe1, 0xff, 0x1a, 0x00, 0xe0, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x12, 0x00, 0xdf, 0xff, 0x0d, 0x00, 0xdf, 0xff, 0x06, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xf2, 0xff, 0xe0, 0xff, 0xee, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xeb, 0xff, 0xe8, 0xff, 0xe9, 0xff, 0xed, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe0, 0xff, 0xfe, 0xff, 0xdd, 0xff, 0x02, 0x00, 0xdb, 0xff, 0x05, 0x00, 0xda, 0xff, 0x07, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xda, 0xff, 0x12, 0x00, 0xda, 0xff, 0x17, 0x00, 0xda, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x20, 0x00, 0xd9, 0xff, 0x23, 0x00, 0xd9, 0xff, 0x24, 0x00, 0xda, 0xff, 0x25, 0x00, 0xdc, 0xff, 0x24, 0x00, 0xdf, 0xff, 0x23, 0x00, 0xe2, 0xff, 0x24, 0x00, 0xe5, 0xff, 0x24, 0x00, 0xe8, 0xff, 0x25, 0x00, 0xe9, 0xff, 0x26, 0x00, 0xeb, 0xff, 0x25, 0x00, 0xed, 0xff, 0x24, 0x00, 0xf1, 0xff, 0x23, 0x00, 0xf5, 0xff, 0x22, 0x00, 0xfa, 0xff, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x05, 0x00, 0x22, 0x00, 0x08, 0x00, 0x23, 0x00, 0x09, 0x00, 0x23, 0x00, 0x09, 0x00, 0x23, 0x00, 0x08, 0x00, 0x23, 0x00, 0x08, 0x00, 0x23, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x14, 0x00, 0x20, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x17, 0x00, 0x14, 0x00, 0x13, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xf8, 0xff, 0x1b, 0x00, 0xf3, 0xff, 0x17, 0x00, 0xee, 0xff, 0x12, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe0, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd3, 0xff, 0x06, 0x00, 0xcd, 0xff, 0x03, 0x00, 0xca, 0xff, 0x00, 0x00, 0xc9, 0xff, 0xfb, 0xff, 0xc8, 0xff, 0xf6, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0xc8, 0xff, 0xee, 0xff, 0xc7, 0xff, 0xea, 0xff, 0xc5, 0xff, 0xe8, 0xff, 0xc4, 0xff, 0xe6, 0xff, 0xc3, 0xff, 0xe5, 0xff, 0xc3, 0xff, 0xe4, 0xff, 0xc6, 0xff, 0xe3, 0xff, 0xca, 0xff, 0xe0, 0xff, 0xce, 0xff, 0xdd, 0xff, 0xd1, 0xff, 0xd9, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xcf, 0xff, 0xd3, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xd5, 0xff, 0xda, 0xff, 0xd4, 0xff, 0xdd, 0xff, 0xd3, 0xff, 0xdf, 0xff, 0xd2, 0xff, 0xe0, 0xff, 0xd1, 0xff, 0xe0, 0xff, 0xd2, 0xff, 0xe0, 0xff, 0xd3, 0xff, 0xe1, 0xff, 0xd5, 0xff, 0xe5, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xdb, 0xff, 0xf0, 0xff, 0xdd, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xe1, 0xff, 0xfe, 0xff, 0xe4, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xef, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x17, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x21, 0x00, 0x08, 0x00, 0x24, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x0e, 0x00, 0x25, 0x00, 0x11, 0x00, 0x24, 0x00, 0x14, 0x00, 0x24, 0x00, 0x18, 0x00, 0x24, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x20, 0x00, 0x28, 0x00, 0x20, 0x00, 0x27, 0x00, 0x1f, 0x00, 0x25, 0x00, 0x1f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1c, 0x00, 0x23, 0x00, 0x17, 0x00, 0x26, 0x00, 0x14, 0x00, 0x29, 0x00, 0x11, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x07, 0x00, 0x22, 0x00, 0x03, 0x00, 0x21, 0x00, 0xff, 0xff, 0x23, 0x00, 0xfc, 0xff, 0x25, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf8, 0xff, 0x28, 0x00, 0xf7, 0xff, 0x25, 0x00, 0xf5, 0xff, 0x21, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xed, 0xff, 0x15, 0x00, 0xea, 0xff, 0x15, 0x00, 0xe7, 0xff, 0x14, 0x00, 0xe4, 0xff, 0x13, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x0a, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xde, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0xda, 0xff, 0xf9, 0xff, 0xd8, 0xff, 0xf8, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd5, 0xff, 0xf0, 0xff, 0xd5, 0xff, 0xeb, 0xff, 0xd6, 0xff, 0xe6, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xdb, 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xde, 0xff, 0xe2, 0xff, 0xdd, 0xff, 0xe5, 0xff, 0xdc, 0xff, 0xe9, 0xff, 0xdc, 0xff, 0xec, 0xff, 0xdc, 0xff, 0xed, 0xff, 0xdf, 0xff, 0xee, 0xff, 0xe1, 0xff, 0xf0, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xfb, 0xff, 0xef, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf6, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x22, 0x00, 0x09, 0x00, 0x25, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x2a, 0x00, 0x0d, 0x00, 0x2c, 0x00, 0x0f, 0x00, 0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x17, 0x00, 0x2c, 0x00, 0x1c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, 0x00, 0x24, 0x00, 0x29, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x1c, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x19, 0x00, 0x29, 0x00, 0x17, 0x00, 0x27, 0x00, 0x13, 0x00, 0x24, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x08, 0x00, 0x21, 0x00, 0x02, 0x00, 0x20, 0x00, 0xff, 0xff, 0x20, 0x00, 0xfd, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x1e, 0x00, 0xfb, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x16, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xee, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xec, 0xff, 0x09, 0x00, 0xed, 0xff, 0x05, 0x00, 0xee, 0xff, 0x01, 0x00, 0xee, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x06, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xe0, 0xff, 0x12, 0x00, 0xde, 0xff, 0x16, 0x00, 0xdd, 0xff, 0x1a, 0x00, 0xde, 0xff, 0x1d, 0x00, 0xdf, 0xff, 0x1f, 0x00, 0xe1, 0xff, 0x21, 0x00, 0xe3, 0xff, 0x23, 0x00, 0xe6, 0xff, 0x26, 0x00, 0xe8, 0xff, 0x29, 0x00, 0xeb, 0xff, 0x2d, 0x00, 0xef, 0xff, 0x31, 0x00, 0xf3, 0xff, 0x35, 0x00, 0xf8, 0xff, 0x38, 0x00, 0xfc, 0xff, 0x3a, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x05, 0x00, 0x3b, 0x00, 0x09, 0x00, 0x39, 0x00, 0x0c, 0x00, 0x38, 0x00, 0x0f, 0x00, 0x36, 0x00, 0x12, 0x00, 0x35, 0x00, 0x14, 0x00, 0x35, 0x00, 0x16, 0x00, 0x34, 0x00, 0x17, 0x00, 0x32, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x17, 0x00, 0x2a, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x13, 0x00, 0x16, 0x00, 0x11, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0x00, 0x17, 0x00, 0xfa, 0xff, 0x17, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x14, 0x00, 0xee, 0xff, 0x11, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x08, 0x00, 0xe8, 0xff, 0x06, 0x00, 0xe5, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x02, 0x00, 0xdf, 0xff, 0xfe, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xf2, 0xff, 0xd7, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xed, 0xff, 0xd8, 0xff, 0xeb, 0xff, 0xd9, 0xff, 0xe9, 0xff, 0xd9, 0xff, 0xe7, 0xff, 0xd9, 0xff, 0xe5, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xd3, 0xff, 0xde, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xdb, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xec, 0xff, 0xd9, 0xff, 0xeb, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xd7, 0xff, 0xeb, 0xff, 0xd6, 0xff, 0xee, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xd6, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd8, 0xff, 0xfe, 0xff, 0xda, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0xf9, 0xff, 0xdd, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xf3, 0xff, 0xe1, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xf5, 0xff, 0xe5, 0xff, 0xf8, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xef, 0xff, 0x11, 0x00, 0xed, 0xff, 0x14, 0x00, 0xed, 0xff, 0x17, 0x00, 0xee, 0xff, 0x1a, 0x00, 0xf0, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1e, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xe9, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x19, 0x00, 0xe2, 0xff, 0x1a, 0x00, 0xe2, 0xff, 0x1b, 0x00, 0xe3, 0xff, 0x1c, 0x00, 0xe5, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x1b, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe5, 0xff, 0x19, 0x00, 0xe2, 0xff, 0x18, 0x00, 0xe1, 0xff, 0x17, 0x00, 0xe2, 0xff, 0x16, 0x00, 0xe5, 0xff, 0x15, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xee, 0xff, 0x14, 0x00, 0xf3, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x08, 0x00, 0x07, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x10, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x16, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0xfd, 0xff, 0x1a, 0x00, 0xf8, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xed, 0xff, 0x1f, 0x00, 0xea, 0xff, 0x22, 0x00, 0xea, 0xff, 0x26, 0x00, 0xeb, 0xff, 0x29, 0x00, 0xee, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x2b, 0x00, 0xec, 0xff, 0x29, 0x00, 0xe9, 0xff, 0x28, 0x00, 0xe6, 0xff, 0x28, 0x00, 0xe5, 0xff, 0x29, 0x00, 0xe5, 0xff, 0x2b, 0x00, 0xe6, 0xff, 0x2d, 0x00, 0xe8, 0xff, 0x2e, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x2b, 0x00, 0xed, 0xff, 0x28, 0x00, 0xee, 0xff, 0x26, 0x00, 0xf0, 0xff, 0x26, 0x00, 0xf2, 0xff, 0x27, 0x00, 0xf5, 0xff, 0x29, 0x00, 0xf7, 0xff, 0x2b, 0x00, 0xf9, 0xff, 0x2c, 0x00, 0xfc, 0xff, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x04, 0x00, 0x25, 0x00, 0x07, 0x00, 0x22, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x15, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x03, 0x00, 0x14, 0x00, 0xff, 0xff, 0x14, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x16, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1b, 0x00, 0xef, 0xff, 0x19, 0x00, 0xec, 0xff, 0x18, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xea, 0xff, 0x17, 0x00, 0xe9, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xea, 0xff, 0x1f, 0x00, 0xeb, 0xff, 0x21, 0x00, 0xec, 0xff, 0x21, 0x00, 0xeb, 0xff, 0x20, 0x00, 0xea, 0xff, 0x1e, 0x00, 0xe9, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1e, 0x00, 0xea, 0xff, 0x1e, 0x00, 0xeb, 0xff, 0x1e, 0x00, 0xed, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1a, 0x00, 0xed, 0xff, 0x17, 0x00, 0xec, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xee, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x09, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xee, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xed, 0xff, 0x10, 0x00, 0xec, 0xff, 0x11, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe6, 0xff, 0x12, 0x00, 0xe4, 0xff, 0x11, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x08, 0x00, 0xed, 0xff, 0x06, 0x00, 0xee, 0xff, 0x04, 0x00, 0xee, 0xff, 0x03, 0x00, 0xed, 0xff, 0x01, 0x00, 0xec, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0x01, 0x00, 0xef, 0xff, 0x03, 0x00, 0xed, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xea, 0xff, 0x02, 0x00, 0xe9, 0xff, 0x03, 0x00, 0xe9, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x0a, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x0f, 0x00, 0xea, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x07, 0x00, 0xeb, 0xff, 0x03, 0x00, 0xec, 0xff, 0x02, 0x00, 0xec, 0xff, 0x03, 0x00, 0xed, 0xff, 0x04, 0x00, 0xee, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf3, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x16, 0x00, 0x04, 0x00, 0x15, 0x00, 0x05, 0x00, 0x12, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x09, 0x00, 0x16, 0x00, 0x05, 0x00, 0x17, 0x00, 0x01, 0x00, 0x18, 0x00, 0xfc, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xfa, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1b, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf8, 0xff, 0x1a, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xff, 0xff, 0x14, 0x00, 0x02, 0x00, 0x12, 0x00, 0x04, 0x00, 0x11, 0x00, 0x05, 0x00, 0x13, 0x00, 0x04, 0x00, 0x15, 0x00, 0x04, 0x00, 0x17, 0x00, 0x03, 0x00, 0x16, 0x00, 0x03, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xef, 0xff, 0x0c, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe6, 0xff, 0x0a, 0x00, 0xe4, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x07, 0x00, 0xe0, 0xff, 0x08, 0x00, 0xdf, 0xff, 0x0b, 0x00, 0xdf, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x10, 0x00, 0xe1, 0xff, 0x10, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xe8, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x02, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfd, 0xff, 0xfc, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xee, 0xff, 0x03, 0x00, 0xed, 0xff, 0x03, 0x00, 0xed, 0xff, 0x04, 0x00, 0xed, 0xff, 0x06, 0x00, 0xed, 0xff, 0x08, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xde, 0xff, 0x0c, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xde, 0xff, 0x0b, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0c, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xe0, 0xff, 0x0e, 0x00, 0xde, 0xff, 0x0f, 0x00, 0xdc, 0xff, 0x10, 0x00, 0xdb, 0xff, 0x11, 0x00, 0xda, 0xff, 0x12, 0x00, 0xda, 0xff, 0x13, 0x00, 0xdb, 0xff, 0x14, 0x00, 0xdc, 0xff, 0x15, 0x00, 0xdd, 0xff, 0x16, 0x00, 0xdc, 0xff, 0x16, 0x00, 0xdb, 0xff, 0x17, 0x00, 0xd9, 0xff, 0x16, 0x00, 0xd8, 0xff, 0x15, 0x00, 0xd9, 0xff, 0x14, 0x00, 0xda, 0xff, 0x13, 0x00, 0xdc, 0xff, 0x13, 0x00, 0xdf, 0xff, 0x13, 0x00, 0xe0, 0xff, 0x14, 0x00, 0xe0, 0xff, 0x13, 0x00, 0xe0, 0xff, 0x11, 0x00, 0xdf, 0xff, 0x0e, 0x00, 0xde, 0xff, 0x0b, 0x00, 0xdf, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe8, 0xff, 0x01, 0x00, 0xeb, 0xff, 0xff, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xff, 0xff, 0xeb, 0xff, 0x03, 0x00, 0xe8, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x06, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe2, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x0a, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x10, 0x00, 0xe2, 0xff, 0x13, 0x00, 0xe3, 0xff, 0x15, 0x00, 0xe3, 0xff, 0x16, 0x00, 0xe4, 0xff, 0x15, 0x00, 0xe5, 0xff, 0x13, 0x00, 0xe7, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x10, 0x00, 0xea, 0xff, 0x11, 0x00, 0xed, 0xff, 0x12, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x14, 0x00, 0x01, 0x00, 0x14, 0x00, 0x05, 0x00, 0x14, 0x00, 0x09, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x11, 0x00, 0x14, 0x00, 0x14, 0x00, 0x15, 0x00, 0x17, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x20, 0x00, 0x13, 0x00, 0x24, 0x00, 0x12, 0x00, 0x27, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x2a, 0x00, 0x0f, 0x00, 0x29, 0x00, 0x10, 0x00, 0x28, 0x00, 0x10, 0x00, 0x27, 0x00, 0x10, 0x00, 0x27, 0x00, 0x0e, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x26, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x0a, 0x00, 0x21, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x18, 0x00, 0xf3, 0xff, 0x18, 0x00, 0xf1, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x19, 0x00, 0xf1, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1d, 0x00, 0xf1, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0x21, 0x00, 0xee, 0xff, 0x21, 0x00, 0xec, 0xff, 0x1f, 0x00, 0xeb, 0xff, 0x1d, 0x00, 0xeb, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xec, 0xff, 0x19, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xea, 0xff, 0x14, 0x00, 0xea, 0xff, 0x12, 0x00, 0xea, 0xff, 0x12, 0x00, 0xea, 0xff, 0x12, 0x00, 0xec, 0xff, 0x12, 0x00, 0xee, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x1f, 0x00, 0xff, 0xff, 0x21, 0x00, 0xfd, 0xff, 0x22, 0x00, 0xfb, 0xff, 0x24, 0x00, 0xf9, 0xff, 0x25, 0x00, 0xf8, 0xff, 0x25, 0x00, 0xf7, 0xff, 0x25, 0x00, 0xf6, 0xff, 0x25, 0x00, 0xf4, 0xff, 0x24, 0x00, 0xf2, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x20, 0x00, 0xef, 0xff, 0x1e, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x19, 0x00, 0xec, 0xff, 0x18, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xea, 0xff, 0x15, 0x00, 0xeb, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xed, 0xff, 0x06, 0x00, 0xec, 0xff, 0x02, 0x00, 0xeb, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xe9, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe2, 0xff, 0xed, 0xff, 0xdf, 0xff, 0xec, 0xff, 0xdc, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xea, 0xff, 0xd8, 0xff, 0xeb, 0xff, 0xd4, 0xff, 0xed, 0xff, 0xd0, 0xff, 0xef, 0xff, 0xcc, 0xff, 0xf3, 0xff, 0xc9, 0xff, 0xf6, 0xff, 0xc7, 0xff, 0xf7, 0xff, 0xc7, 0xff, 0xf7, 0xff, 0xc7, 0xff, 0xf5, 0xff, 0xc7, 0xff, 0xf3, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0xc8, 0xff, 0xf4, 0xff, 0xc9, 0xff, 0xf7, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xcd, 0xff, 0xfb, 0xff, 0xcf, 0xff, 0xfb, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xd2, 0xff, 0xf8, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0xd9, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xf4, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0xe3, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0x02, 0x00, 0xe5, 0xff, 0x07, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe1, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x1a, 0x00, 0xdd, 0xff, 0x1f, 0x00, 0xdb, 0xff, 0x23, 0x00, 0xdb, 0xff, 0x28, 0x00, 0xdd, 0xff, 0x2c, 0x00, 0xdf, 0xff, 0x31, 0x00, 0xe1, 0xff, 0x35, 0x00, 0xe2, 0xff, 0x39, 0x00, 0xe1, 0xff, 0x3b, 0x00, 0xe0, 0xff, 0x3c, 0x00, 0xdf, 0xff, 0x3d, 0x00, 0xdf, 0xff, 0x3d, 0x00, 0xe0, 0xff, 0x3e, 0x00, 0xe2, 0xff, 0x3e, 0x00, 0xe5, 0xff, 0x3c, 0x00, 0xe9, 0xff, 0x39, 0x00, 0xec, 0xff, 0x35, 0x00, 0xef, 0xff, 0x31, 0x00, 0xf0, 0xff, 0x2c, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xf2, 0xff, 0x23, 0x00, 0xf3, 0xff, 0x1e, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xef, 0xff, 0x05, 0x00, 0xec, 0xff, 0x06, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x09, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x09, 0x00, 0xe4, 0xff, 0x0a, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x12, 0x00, 0xe0, 0xff, 0x14, 0x00, 0xe0, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x17, 0x00, 0xde, 0xff, 0x17, 0x00, 0xdc, 0xff, 0x18, 0x00, 0xda, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x1f, 0x00, 0xd9, 0xff, 0x22, 0x00, 0xdb, 0xff, 0x24, 0x00, 0xdd, 0xff, 0x24, 0x00, 0xdf, 0xff, 0x23, 0x00, 0xdf, 0xff, 0x22, 0x00, 0xdf, 0xff, 0x20, 0x00, 0xdf, 0xff, 0x20, 0x00, 0xdf, 0xff, 0x21, 0x00, 0xe1, 0xff, 0x22, 0x00, 0xe4, 0xff, 0x23, 0x00, 0xe8, 0xff, 0x23, 0x00, 0xed, 0xff, 0x22, 0x00, 0xf1, 0xff, 0x1e, 0x00, 0xf3, 0xff, 0x1a, 0x00, 0xf5, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xfe, 0xff, 0x16, 0x00, 0x04, 0x00, 0x19, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x10, 0x00, 0x19, 0x00, 0x16, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x0c, 0x00, 0x25, 0x00, 0x0d, 0x00, 0x29, 0x00, 0x0d, 0x00, 0x2d, 0x00, 0x0f, 0x00, 0x32, 0x00, 0x10, 0x00, 0x35, 0x00, 0x0f, 0x00, 0x37, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x0b, 0x00, 0x39, 0x00, 0x08, 0x00, 0x39, 0x00, 0x04, 0x00, 0x39, 0x00, 0x02, 0x00, 0x38, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x02, 0x00, 0x32, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x22, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xef, 0xff, 0x02, 0x00, 0xee, 0xff, 0x00, 0x00, 0xed, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xea, 0xff, 0x03, 0x00, 0xea, 0xff, 0x01, 0x00, 0xea, 0xff, 0x00, 0x00, 0xeb, 0xff, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xee, 0xff, 0x01, 0x00, 0xef, 0xff, 0x04, 0x00, 0xef, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1f, 0x00, 0xf8, 0xff, 0x21, 0x00, 0xf8, 0xff, 0x21, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf5, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x19, 0x00, 0xf2, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xef, 0xff, 0x13, 0x00, 0xef, 0xff, 0x11, 0x00, 0xef, 0xff, 0x10, 0x00, 0xf0, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf6, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xed, 0xff, 0x04, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xe8, 0xff, 0x04, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x06, 0x00, 0xde, 0xff, 0x07, 0x00, 0xdc, 0xff, 0x08, 0x00, 0xda, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd9, 0xff, 0x06, 0x00, 0xd8, 0xff, 0x04, 0x00, 0xd7, 0xff, 0x03, 0x00, 0xd6, 0xff, 0x03, 0x00, 0xd6, 0xff, 0x04, 0x00, 0xd6, 0xff, 0x05, 0x00, 0xd8, 0xff, 0x06, 0x00, 0xda, 0xff, 0x07, 0x00, 0xdd, 0xff, 0x08, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe7, 0xff, 0x02, 0x00, 0xe9, 0xff, 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0xfd, 0xff, 0x17, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1f, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x24, 0x00, 0xf4, 0xff, 0x23, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xf4, 0xff, 0x1f, 0x00, 0xf6, 0xff, 0x1e, 0x00, 0xf8, 0xff, 0x1d, 0x00, 0xfb, 0xff, 0x1d, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x15, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x02, 0x00, 0x09, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe7, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0x00, 0x00, 0xe6, 0xff, 0x03, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xea, 0xff, 0x04, 0x00, 0xec, 0xff, 0x04, 0x00, 0xee, 0xff, 0x04, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x1b, 0x00, 0xf8, 0xff, 0x20, 0x00, 0xf6, 0xff, 0x25, 0x00, 0xf5, 0xff, 0x29, 0x00, 0xf6, 0xff, 0x2b, 0x00, 0xf8, 0xff, 0x2d, 0x00, 0xfa, 0xff, 0x2e, 0x00, 0xfc, 0xff, 0x2e, 0x00, 0xfc, 0xff, 0x2f, 0x00, 0xfc, 0xff, 0x31, 0x00, 0xf9, 0xff, 0x33, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xf4, 0xff, 0x38, 0x00, 0xf3, 0xff, 0x39, 0x00, 0xf3, 0xff, 0x39, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xf4, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf4, 0xff, 0x2d, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x2b, 0x00, 0xee, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x29, 0x00, 0xf0, 0xff, 0x25, 0x00, 0xf1, 0xff, 0x22, 0x00, 0xf3, 0xff, 0x1e, 0x00, 0xf3, 0xff, 0x1c, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf5, 0xff, 0x1b, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x14, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x02, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x0a, 0x00, 0xf5, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x0f, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xed, 0xff, 0x14, 0x00, 0xee, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x1a, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xfa, 0xff, 0x16, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xf0, 0xff, 0xe1, 0xff, 0xee, 0xff, 0xe0, 0xff, 0xeb, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xdf, 0xff, 0xe8, 0xff, 0xde, 0xff, 0xe7, 0xff, 0xdd, 0xff, 0xe7, 0xff, 0xdb, 0xff, 0xe7, 0xff, 0xd7, 0xff, 0xe7, 0xff, 0xd3, 0xff, 0xe7, 0xff, 0xd0, 0xff, 0xe6, 0xff, 0xce, 0xff, 0xe5, 0xff, 0xce, 0xff, 0xe4, 0xff, 0xd0, 0xff, 0xe3, 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xd2, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xe8, 0xff, 0xcd, 0xff, 0xeb, 0xff, 0xcb, 0xff, 0xee, 0xff, 0xca, 0xff, 0xf0, 0xff, 0xcc, 0xff, 0xf1, 0xff, 0xd1, 0xff, 0xf2, 0xff, 0xd7, 0xff, 0xf3, 0xff, 0xdc, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xfc, 0xff, 0xe0, 0xff, 0x01, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe9, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0d, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x09, 0x00, 0x21, 0x00, 0x07, 0x00, 0x21, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x07, 0x00, 0x15, 0x00, 0x04, 0x00, 0x15, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x12, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xef, 0xff, 0x02, 0x00, 0xec, 0xff, 0x04, 0x00, 0xea, 0xff, 0x07, 0x00, 0xeb, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf5, 0xff, 0x0a, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x11, 0x00, 0x06, 0x00, 0x13, 0x00, 0x05, 0x00, 0x15, 0x00, 0x06, 0x00, 0x16, 0x00, 0x07, 0x00, 0x17, 0x00, 0x09, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x20, 0x00, 0x12, 0x00, 0x25, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x14, 0x00, 0x2d, 0x00, 0x13, 0x00, 0x30, 0x00, 0x12, 0x00, 0x31, 0x00, 0x11, 0x00, 0x31, 0x00, 0x10, 0x00, 0x31, 0x00, 0x11, 0x00, 0x32, 0x00, 0x12, 0x00, 0x35, 0x00, 0x12, 0x00, 0x38, 0x00, 0x11, 0x00, 0x3a, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x07, 0x00, 0x39, 0x00, 0x05, 0x00, 0x36, 0x00, 0x03, 0x00, 0x33, 0x00, 0x02, 0x00, 0x2f, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x01, 0x00, 0x28, 0x00, 0xff, 0xff, 0x25, 0x00, 0xfc, 0xff, 0x21, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xf8, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xf8, 0xff, 0xe5, 0xff, 0xf5, 0xff, 0xe2, 0xff, 0xf3, 0xff, 0xe0, 0xff, 0xf1, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xdc, 0xff, 0xf0, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf1, 0xff, 0xd7, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf0, 0xff, 0xd5, 0xff, 0xef, 0xff, 0xd4, 0xff, 0xee, 0xff, 0xd4, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xee, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xd4, 0xff, 0xf3, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf4, 0xff, 0xe2, 0xff, 0xf2, 0xff, 0xe3, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe9, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xfc, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x15, 0x00, 0x05, 0x00, 0x18, 0x00, 0x06, 0x00, 0x18, 0x00, 0x07, 0x00, 0x17, 0x00, 0x07, 0x00, 0x15, 0x00, 0x05, 0x00, 0x12, 0x00, 0x03, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0x12, 0x00, 0xff, 0xff, 0x14, 0x00, 0xff, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xfc, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x16, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0b, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x00, 0x00, 0xec, 0xff, 0x03, 0x00, 0xea, 0xff, 0x05, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x0a, 0x00, 0xe1, 0xff, 0x0c, 0x00, 0xde, 0xff, 0x0d, 0x00, 0xde, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x0f, 0x00, 0xe1, 0xff, 0x11, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x15, 0x00, 0xe4, 0xff, 0x16, 0x00, 0xe4, 0xff, 0x15, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x11, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xef, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x09, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x19, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x1e, 0x00, 0xfd, 0xff, 0x20, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xfc, 0xff, 0x23, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xfb, 0xff, 0x20, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x19, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x08, 0x00, 0xf0, 0xff, 0x08, 0x00, 0xed, 0xff, 0x08, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xea, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xea, 0xff, 0x08, 0x00, 0xea, 0xff, 0x08, 0x00, 0xea, 0xff, 0x08, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x01, 0x00, 0xe5, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xee, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xf1, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf3, 0xff, 0x1a, 0x00, 0xf3, 0xff, 0x1a, 0x00, 0xf3, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x18, 0x00, 0xf4, 0xff, 0x18, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xee, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0d, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xef, 0xff, 0x10, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xef, 0xff, 0x11, 0x00, 0xee, 0xff, 0x11, 0x00, 0xec, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xec, 0xff, 0x11, 0x00, 0xee, 0xff, 0x11, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x11, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xf2, 0xff, 0x14, 0x00, 0xf1, 0xff, 0x14, 0x00, 0xef, 0xff, 0x14, 0x00, 0xee, 0xff, 0x14, 0x00, 0xed, 0xff, 0x15, 0x00, 0xee, 0xff, 0x15, 0x00, 0xef, 0xff, 0x15, 0x00, 0xf0, 0xff, 0x14, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x11, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xef, 0xff, 0x02, 0x00, 0xeb, 0xff, 0x03, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x04, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xdc, 0xff, 0x05, 0x00, 0xda, 0xff, 0x06, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd8, 0xff, 0x0a, 0x00, 0xd7, 0xff, 0x0c, 0x00, 0xd6, 0xff, 0x0d, 0x00, 0xd5, 0xff, 0x0e, 0x00, 0xd5, 0xff, 0x0f, 0x00, 0xd6, 0xff, 0x0f, 0x00, 0xd7, 0xff, 0x0f, 0x00, 0xd9, 0xff, 0x10, 0x00, 0xdc, 0xff, 0x10, 0x00, 0xde, 0xff, 0x11, 0x00, 0xe1, 0xff, 0x12, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x14, 0x00, 0xe5, 0xff, 0x15, 0x00, 0xe7, 0xff, 0x15, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xeb, 0xff, 0x15, 0x00, 0xee, 0xff, 0x14, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf6, 0xff, 0x13, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x14, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xef, 0xff, 0x16, 0x00, 0xee, 0xff, 0x16, 0x00, 0xee, 0xff, 0x17, 0x00, 0xed, 0xff, 0x18, 0x00, 0xec, 0xff, 0x19, 0x00, 0xea, 0xff, 0x1a, 0x00, 0xe9, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xea, 0xff, 0x16, 0x00, 0xeb, 0xff, 0x14, 0x00, 0xed, 0xff, 0x11, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xef, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x19, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x17, 0x00, 0x09, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1b, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1a, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xfc, 0xff, 0x1a, 0x00, 0xfd, 0xff, 0x1a, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfc, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x17, 0x00, 0xf5, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xef, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xed, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x10, 0x00, 0x12, 0x00, 0x13, 0x00, 0x12, 0x00, 0x16, 0x00, 0x11, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x06, 0x00, 0x19, 0x00, 0x07, 0x00, 0x18, 0x00, 0x07, 0x00, 0x17, 0x00, 0x07, 0x00, 0x17, 0x00, 0x06, 0x00, 0x17, 0x00, 0x04, 0x00, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x16, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfd, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xff, 0xff, 0x11, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x12, 0x00, 0x07, 0x00, 0x14, 0x00, 0x07, 0x00, 0x15, 0x00, 0x07, 0x00, 0x16, 0x00, 0x05, 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x00, 0x01, 0x00, 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xff, 0xff, 0x15, 0x00, 0xff, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xe8, 0xff, 0x01, 0x00, 0xea, 0xff, 0x03, 0x00, 0xec, 0xff, 0x05, 0x00, 0xef, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x01, 0x00, 0x15, 0x00, 0x02, 0x00, 0x15, 0x00, 0x03, 0x00, 0x15, 0x00, 0x03, 0x00, 0x15, 0x00, 0x04, 0x00, 0x15, 0x00, 0x06, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x10, 0x00, 0x17, 0x00, 0x10, 0x00, 0x16, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf2, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfe, 0xff, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x03, 0x00, 0x15, 0x00, 0x05, 0x00, 0x13, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xef, 0xff, 0x06, 0x00, 0xed, 0xff, 0x05, 0x00, 0xeb, 0xff, 0x05, 0x00, 0xe8, 0xff, 0x04, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe5, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x00, 0x00, 0xe5, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xe5, 0xff, 0xf9, 0xff, 0xe5, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xed, 0xff, 0xea, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xe9, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xed, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xf1, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe6, 0xff, 0xf5, 0xff, 0xe7, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x11, 0x00, 0x11, 0x00, 0x14, 0x00, 0x11, 0x00, 0x16, 0x00, 0x10, 0x00, 0x18, 0x00, 0x11, 0x00, 0x18, 0x00, 0x11, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x10, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x19, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xff, 0xff, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xfb, 0xff, 0xe7, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xfd, 0xff, 0xe7, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xff, 0xff, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xf2, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf1, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xef, 0xff, 0x00, 0x00, 0xef, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xff, 0xff, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x05, 0x00, 0x12, 0x00, 0x08, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x12, 0x00, 0x07, 0x00, 0x15, 0x00, 0x06, 0x00, 0x19, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf5, 0xff, 0x1b, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1f, 0x00, 0xf2, 0xff, 0x1f, 0x00, 0xf1, 0xff, 0x1e, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xef, 0xff, 0x13, 0x00, 0xed, 0xff, 0x10, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xeb, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xed, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf3, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf8, 0xff, 0x15, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x14, 0x00, 0xff, 0xff, 0x13, 0x00, 0xff, 0xff, 0x12, 0x00, 0xff, 0xff, 0x10, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x16, 0x00, 0x06, 0x00, 0x15, 0x00, 0x05, 0x00, 0x12, 0x00, 0x03, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe5, 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0xe3, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xf7, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xdd, 0xff, 0xf8, 0xff, 0xdc, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xfc, 0xff, 0xde, 0xff, 0xfe, 0xff, 0xde, 0xff, 0x00, 0x00, 0xdf, 0xff, 0x02, 0x00, 0xdf, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xe0, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x06, 0x00, 0xe2, 0xff, 0x06, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xea, 0xff, 0x08, 0x00, 0xec, 0xff, 0x08, 0x00, 0xee, 0xff, 0x09, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x13, 0x00, 0x05, 0x00, 0x15, 0x00, 0x05, 0x00, 0x16, 0x00, 0x05, 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x00, 0x01, 0x00, 0x17, 0x00, 0xff, 0xff, 0x19, 0x00, 0xfc, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x1f, 0x00, 0xfa, 0xff, 0x20, 0x00, 0xf9, 0xff, 0x20, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf8, 0xff, 0x1e, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf3, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1a, 0x00, 0xf1, 0xff, 0x18, 0x00, 0xf1, 0xff, 0x17, 0x00, 0xf2, 0xff, 0x14, 0x00, 0xf2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe5, 0xff, 0xfd, 0xff, 0xe3, 0xff, 0xfe, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xe3, 0xff, 0x01, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe6, 0xff, 0x0a, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe7, 0xff, 0x0e, 0x00, 0xea, 0xff, 0x0e, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x13, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, 0x00, 0x13, 0x00, 0x06, 0x00, 0x14, 0x00, 0x08, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x20, 0x00, 0xff, 0xff, 0x20, 0x00, 0xfc, 0xff, 0x21, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xfa, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x23, 0x00, 0xf7, 0xff, 0x23, 0x00, 0xf5, 0xff, 0x24, 0x00, 0xf2, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x22, 0x00, 0xed, 0xff, 0x20, 0x00, 0xeb, 0xff, 0x1e, 0x00, 0xea, 0xff, 0x1b, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xea, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x0c, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xe3, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe6, 0xff, 0xf5, 0xff, 0xe8, 0xff, 0xf1, 0xff, 0xea, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xe9, 0xff, 0xeb, 0xff, 0xe7, 0xff, 0xea, 0xff, 0xe5, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xeb, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xf1, 0xff, 0xdf, 0xff, 0xf4, 0xff, 0xdd, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xfb, 0xff, 0xdc, 0xff, 0xfe, 0xff, 0xdc, 0xff, 0x01, 0x00, 0xdc, 0xff, 0x03, 0x00, 0xdd, 0xff, 0x05, 0x00, 0xde, 0xff, 0x06, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x09, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xee, 0xff, 0x11, 0x00, 0xf0, 0xff, 0x13, 0x00, 0xf2, 0xff, 0x15, 0x00, 0xf5, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xfb, 0xff, 0x15, 0x00, 0xff, 0xff, 0x13, 0x00, 0x03, 0x00, 0x12, 0x00, 0x06, 0x00, 0x11, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0b, 0x00, 0x29, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x07, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x2e, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x03, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x27, 0x00, 0xff, 0xff, 0x25, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xef, 0xff, 0x04, 0x00, 0xee, 0xff, 0xff, 0xff, 0xec, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xe7, 0xff, 0xea, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xe5, 0xff, 0xeb, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe5, 0xff, 0xf7, 0xff, 0xe3, 0xff, 0xf9, 0xff, 0xe1, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfc, 0xff, 0xe0, 0xff, 0xfd, 0xff, 0xe1, 0xff, 0x01, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe2, 0xff, 0x09, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xe2, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe4, 0xff, 0x0c, 0x00, 0xe6, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xee, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x25, 0x00, 0x0d, 0x00, 0x29, 0x00, 0x0d, 0x00, 0x2c, 0x00, 0x0d, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x09, 0x00, 0x23, 0x00, 0x07, 0x00, 0x22, 0x00, 0x05, 0x00, 0x22, 0x00, 0x03, 0x00, 0x20, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x11, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf6, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xe5, 0xff, 0xf7, 0xff, 0xe2, 0xff, 0xf7, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xfa, 0xff, 0xe2, 0xff, 0xfd, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xe4, 0xff, 0x02, 0x00, 0xe3, 0xff, 0x04, 0x00, 0xe1, 0xff, 0x05, 0x00, 0xdf, 0xff, 0x07, 0x00, 0xde, 0xff, 0x08, 0x00, 0xde, 0xff, 0x0a, 0x00, 0xdf, 0xff, 0x0b, 0x00, 0xe2, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x10, 0x00, 0xec, 0xff, 0x12, 0x00, 0xee, 0xff, 0x12, 0x00, 0xef, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x14, 0x00, 0xf3, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x16, 0x00, 0xfd, 0xff, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0x05, 0x00, 0x17, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x11, 0x00, 0x17, 0x00, 0x13, 0x00, 0x17, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x15, 0x00, 0x19, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x1f, 0x00, 0x12, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x20, 0x00, 0x07, 0x00, 0x20, 0x00, 0x06, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x1c, 0x00, 0xff, 0xff, 0x1a, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x16, 0x00, 0xf5, 0xff, 0x14, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xee, 0xff, 0x08, 0x00, 0xee, 0xff, 0x06, 0x00, 0xee, 0xff, 0x05, 0x00, 0xef, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf2, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xf4, 0xff, 0xe3, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xf3, 0xff, 0xdb, 0xff, 0xf2, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf1, 0xff, 0xd7, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf3, 0xff, 0xd7, 0xff, 0xf5, 0xff, 0xd8, 0xff, 0xf8, 0xff, 0xd8, 0xff, 0xf9, 0xff, 0xd8, 0xff, 0xfa, 0xff, 0xd9, 0xff, 0xf9, 0xff, 0xd9, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xf8, 0xff, 0xdb, 0xff, 0xfa, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x04, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x08, 0x00, 0xea, 0xff, 0x09, 0x00, 0xed, 0xff, 0x0b, 0x00, 0xf0, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x12, 0x00, 0x03, 0x00, 0x15, 0x00, 0x02, 0x00, 0x17, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0xff, 0xff, 0x1a, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0xfc, 0xff, 0x18, 0x00, 0xfb, 0xff, 0x16, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xef, 0xff, 0x02, 0x00, 0xef, 0xff, 0x00, 0x00, 0xef, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe9, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xef, 0xff, 0xed, 0xff, 0xee, 0xff, 0xef, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xe7, 0xff, 0xf1, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0xe2, 0xff, 0xf3, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xfc, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0x01, 0x00, 0xdf, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xde, 0xff, 0x04, 0x00, 0xdd, 0xff, 0x04, 0x00, 0xdd, 0xff, 0x03, 0x00, 0xde, 0xff, 0x03, 0x00, 0xe0, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x06, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xea, 0xff, 0x08, 0x00, 0xee, 0xff, 0x08, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x12, 0x00, 0x06, 0x00, 0x15, 0x00, 0x04, 0x00, 0x17, 0x00, 0x05, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0d, 0x00, 0x24, 0x00, 0x0d, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0d, 0x00, 0x29, 0x00, 0x0f, 0x00, 0x2a, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x12, 0x00, 0x2b, 0x00, 0x12, 0x00, 0x2b, 0x00, 0x11, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0e, 0x00, 0x2a, 0x00, 0x0c, 0x00, 0x29, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x0b, 0x00, 0x27, 0x00, 0x0a, 0x00, 0x26, 0x00, 0x09, 0x00, 0x25, 0x00, 0x08, 0x00, 0x24, 0x00, 0x06, 0x00, 0x22, 0x00, 0x05, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0xfe, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x16, 0x00, 0xfb, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x01, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xec, 0xff, 0xef, 0xff, 0xee, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xfd, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xe4, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xfc, 0xff, 0xe1, 0xff, 0xfd, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x01, 0x00, 0xdf, 0xff, 0x02, 0x00, 0xe0, 0xff, 0x02, 0x00, 0xe2, 0xff, 0x01, 0x00, 0xe4, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x06, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x10, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xea, 0xff, 0x11, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xec, 0xff, 0x10, 0x00, 0xed, 0xff, 0x10, 0x00, 0xee, 0xff, 0x11, 0x00, 0xef, 0xff, 0x13, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xf1, 0xff, 0x15, 0x00, 0xf2, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x05, 0x00, 0x14, 0x00, 0x05, 0x00, 0x16, 0x00, 0x03, 0x00, 0x19, 0x00, 0x01, 0x00, 0x1b, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1c, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf3, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1a, 0x00, 0xeb, 0xff, 0x18, 0x00, 0xea, 0xff, 0x15, 0x00, 0xe8, 0xff, 0x13, 0x00, 0xe7, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x10, 0x00, 0xe7, 0xff, 0x0f, 0x00, 0xe6, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x09, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x04, 0x00, 0xe7, 0xff, 0x02, 0x00, 0xe9, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfc, 0xff, 0x15, 0x00, 0xff, 0xff, 0x16, 0x00, 0x01, 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x00, 0x05, 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x07, 0x00, 0x16, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x08, 0x00, 0x19, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x20, 0x00, 0xff, 0xff, 0x21, 0x00, 0xfd, 0xff, 0x23, 0x00, 0xfc, 0xff, 0x25, 0x00, 0xfb, 0xff, 0x26, 0x00, 0xfb, 0xff, 0x27, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xfa, 0xff, 0x25, 0x00, 0xf9, 0xff, 0x24, 0x00, 0xf7, 0xff, 0x22, 0x00, 0xf6, 0xff, 0x22, 0x00, 0xf5, 0xff, 0x22, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xf3, 0xff, 0x20, 0x00, 0xf2, 0xff, 0x1e, 0x00, 0xf1, 0xff, 0x1a, 0x00, 0xef, 0xff, 0x17, 0x00, 0xed, 0xff, 0x13, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x09, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x04, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xe9, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe9, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe5, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe3, 0xff, 0xfc, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x03, 0x00, 0xde, 0xff, 0x06, 0x00, 0xdf, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x11, 0x00, 0xe2, 0xff, 0x13, 0x00, 0xe0, 0xff, 0x15, 0x00, 0xdf, 0xff, 0x18, 0x00, 0xdf, 0xff, 0x1a, 0x00, 0xdf, 0xff, 0x1b, 0x00, 0xe1, 0xff, 0x1c, 0x00, 0xe3, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe6, 0xff, 0x1d, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe8, 0xff, 0x1c, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1a, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x00, 0x04, 0x00, 0x11, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x09, 0x00, 0x13, 0x00, 0x09, 0x00, 0x13, 0x00, 0x08, 0x00, 0x12, 0x00, 0x07, 0x00, 0x11, 0x00, 0x05, 0x00, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0xff, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xe4, 0xff, 0x0b, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0a, 0x00, 0xe2, 0xff, 0x0a, 0x00, 0xe3, 0xff, 0x09, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe4, 0xff, 0x06, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe4, 0xff, 0x04, 0x00, 0xe4, 0xff, 0x03, 0x00, 0xe6, 0xff, 0x01, 0x00, 0xe8, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xea, 0xff, 0x01, 0x00, 0xea, 0xff, 0x03, 0x00, 0xe9, 0xff, 0x06, 0x00, 0xe8, 0xff, 0x09, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0c, 0x00, 0xe7, 0xff, 0x0c, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x11, 0x00, 0xef, 0xff, 0x12, 0x00, 0xef, 0xff, 0x13, 0x00, 0xef, 0xff, 0x12, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x11, 0x00, 0x03, 0x00, 0x12, 0x00, 0x01, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x14, 0x00, 0xfc, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x18, 0x00, 0xf4, 0xff, 0x19, 0x00, 0xf0, 0xff, 0x19, 0x00, 0xed, 0xff, 0x19, 0x00, 0xeb, 0xff, 0x18, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xe7, 0xff, 0x19, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe4, 0xff, 0x1a, 0x00, 0xe2, 0xff, 0x1b, 0x00, 0xe0, 0xff, 0x1a, 0x00, 0xde, 0xff, 0x18, 0x00, 0xdd, 0xff, 0x15, 0x00, 0xdd, 0xff, 0x13, 0x00, 0xdd, 0xff, 0x11, 0x00, 0xde, 0xff, 0x10, 0x00, 0xdf, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0c, 0x00, 0xe2, 0xff, 0x0a, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe8, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xee, 0xff, 0x01, 0x00, 0xf1, 0xff, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x16, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1d, 0x00, 0xf4, 0xff, 0x1f, 0x00, 0xf4, 0xff, 0x22, 0x00, 0xf4, 0xff, 0x25, 0x00, 0xf4, 0xff, 0x28, 0x00, 0xf3, 0xff, 0x29, 0x00, 0xf2, 0xff, 0x2a, 0x00, 0xf1, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2c, 0x00, 0xf2, 0xff, 0x2d, 0x00, 0xf4, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf7, 0xff, 0x2a, 0x00, 0xf6, 0xff, 0x27, 0x00, 0xf6, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x21, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xfe, 0xff, 0x15, 0x00, 0xff, 0xff, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xef, 0xff, 0x08, 0x00, 0xed, 0xff, 0x07, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x06, 0x00, 0xe2, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x02, 0x00, 0xe1, 0xff, 0x01, 0x00, 0xe0, 0xff, 0x01, 0x00, 0xe0, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x02, 0x00, 0xe2, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xe5, 0xff, 0x02, 0x00, 0xe6, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x00, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xed, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x16, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xff, 0xff, 0x1d, 0x00, 0xff, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1e, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x18, 0x00, 0x02, 0x00, 0x15, 0x00, 0x01, 0x00, 0x13, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xe9, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe3, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xdf, 0xff, 0x0f, 0x00, 0xde, 0xff, 0x0f, 0x00, 0xdc, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x0d, 0x00, 0xda, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x09, 0x00, 0xdc, 0xff, 0x08, 0x00, 0xde, 0xff, 0x06, 0x00, 0xe0, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x01, 0x00, 0xe3, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xfe, 0xff, 0xe4, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xfe, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x14, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf4, 0xff, 0x1d, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xf1, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x1d, 0x00, 0xef, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1a, 0x00, 0xf5, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf7, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x00, 0x00, 0xee, 0xff, 0x01, 0x00, 0xef, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x10, 0x00, 0x05, 0x00, 0x13, 0x00, 0x05, 0x00, 0x15, 0x00, 0x04, 0x00, 0x17, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x18, 0x00, 0x02, 0x00, 0x18, 0x00, 0x02, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19, 0x00, 0xff, 0xff, 0x19, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xfd, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf7, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0xe3, 0xff, 0xfe, 0xff, 0xe2, 0xff, 0x00, 0x00, 0xe1, 0xff, 0x02, 0x00, 0xe0, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xde, 0xff, 0x06, 0x00, 0xdd, 0xff, 0x07, 0x00, 0xdc, 0xff, 0x09, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xdc, 0xff, 0x0d, 0x00, 0xdc, 0xff, 0x0e, 0x00, 0xdd, 0xff, 0x0f, 0x00, 0xde, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x0e, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xe7, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xed, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0b, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xff, 0xff, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x09, 0x00, 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x06, 0x00, 0x18, 0x00, 0x04, 0x00, 0x17, 0x00, 0x02, 0x00, 0x16, 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0xff, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x0a, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xf3, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x08, 0x00, 0x11, 0x00, 0x05, 0x00, 0x11, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xef, 0xff, 0x00, 0x00, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xf2, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xee, 0xff, 0xea, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xed, 0xff, 0xee, 0xff, 0xed, 0xff, 0xee, 0xff, 0xee, 0xff, 0xee, 0xff, 0xee, 0xff, 0xee, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x07, 0x00, 0x11, 0x00, 0x07, 0x00, 0x13, 0x00, 0x07, 0x00, 0x15, 0x00, 0x08, 0x00, 0x15, 0x00, 0x08, 0x00, 0x15, 0x00, 0x07, 0x00, 0x14, 0x00, 0x05, 0x00, 0x14, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xea, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x00, 0x00, 0xe8, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x10, 0x00, 0x04, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x09, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x05, 0x00, 0x13, 0x00, 0x04, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xee, 0xff, 0xed, 0xff, 0xed, 0xff, 0xed, 0xff, 0xec, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xf0, 0xff, 0xeb, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xff, 0xff, 0xef, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x11, 0x00, 0x04, 0x00, 0x12, 0x00, 0x05, 0x00, 0x13, 0x00, 0x05, 0x00, 0x13, 0x00, 0x05, 0x00, 0x13, 0x00, 0x06, 0x00, 0x13, 0x00, 0x08, 0x00, 0x13, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x09, 0x00, 0x11, 0x00, 0x08, 0x00, 0x12, 0x00, 0x06, 0x00, 0x11, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x13, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x09, 0x00, 0x17, 0x00, 0x08, 0x00, 0x18, 0x00, 0x07, 0x00, 0x18, 0x00, 0x08, 0x00, 0x19, 0x00, 0x09, 0x00, 0x19, 0x00, 0x09, 0x00, 0x17, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x14, 0x00, 0x07, 0x00, 0x13, 0x00, 0x06, 0x00, 0x12, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf2, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xec, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xed, 0xff, 0xea, 0xff, 0xee, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xe8, 0xff, 0xf1, 0xff, 0xe8, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x17, 0x00, 0x03, 0x00, 0x18, 0x00, 0x04, 0x00, 0x19, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x09, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x08, 0x00, 0x12, 0x00, 0x07, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x05, 0x00, 0x11, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xef, 0xff, 0x06, 0x00, 0xed, 0xff, 0x06, 0x00, 0xec, 0xff, 0x06, 0x00, 0xeb, 0xff, 0x06, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xec, 0xff, 0x08, 0x00, 0xed, 0xff, 0x08, 0x00, 0xee, 0xff, 0x08, 0x00, 0xef, 0xff, 0x08, 0x00, 0xef, 0xff, 0x07, 0x00, 0xee, 0xff, 0x06, 0x00, 0xee, 0xff, 0x05, 0x00, 0xee, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x0f, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xef, 0xff, 0x08, 0x00, 0xef, 0xff, 0x08, 0x00, 0xee, 0xff, 0x09, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x0b, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x04, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xef, 0xff, 0x06, 0x00, 0xee, 0xff, 0x06, 0x00, 0xed, 0xff, 0x05, 0x00, 0xed, 0xff, 0x04, 0x00, 0xed, 0xff, 0x04, 0x00, 0xec, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x03, 0x00, 0xea, 0xff, 0x03, 0x00, 0xe9, 0xff, 0x03, 0x00, 0xe8, 0xff, 0x02, 0x00, 0xe8, 0xff, 0x02, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x01, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xef, 0xff, 0x05, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xef, 0xff, 0x06, 0x00, 0xef, 0xff, 0x06, 0x00, 0xed, 0xff, 0x08, 0x00, 0xec, 0xff, 0x09, 0x00, 0xea, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe9, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x10, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xe9, 0xff, 0x10, 0x00, 0xea, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x10, 0x00, 0xf0, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xef, 0xff, 0x06, 0x00, 0xef, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x02, 0x00, 0x16, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0xff, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x11, 0x00, 0x04, 0x00, 0x12, 0x00, 0x03, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x11, 0x00, 0x04, 0x00, 0x11, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x05, 0x00, 0x11, 0x00, 0x04, 0x00, 0x11, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x09, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe7, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xea, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x11, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x09, 0x00, 0x15, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x07, 0x00, 0x16, 0x00, 0x06, 0x00, 0x15, 0x00, 0x06, 0x00, 0x14, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf3, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x18, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00, 0x00, 0xee, 0xff, 0x00, 0x00, 0xed, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xea, 0xff, 0x00, 0x00, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x00, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xea, 0xff, 0x01, 0x00, 0xe9, 0xff, 0x00, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x11, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xef, 0xff, 0xff, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0xff, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x11, 0x00, 0x05, 0x00, 0x11, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xee, 0xff, 0x00, 0x00, 0xec, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xef, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x04, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xea, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0x00, 0x00, 0xed, 0xff, 0x01, 0x00, 0xed, 0xff, 0x02, 0x00, 0xed, 0xff, 0x02, 0x00, 0xed, 0xff, 0x02, 0x00, 0xee, 0xff, 0x02, 0x00, 0xef, 0xff, 0x01, 0x00, 0xf1, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x19, 0x00, 0x08, 0x00, 0x19, 0x00, 0x09, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0x07, 0x00, 0x16, 0x00, 0x06, 0x00, 0x14, 0x00, 0x04, 0x00, 0x13, 0x00, 0x03, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe9, 0xff, 0xfc, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x72, 0x65, 0x67, 0x6e, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xff, 0xce, 0xe1, 0x45, 0x11, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x50, 0x6f, 0x70, 0x5f, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x5f, 0x32, 0x00, 0x00, 0x58, 0x99, 0xd6, 0x39, 0x01, 0x00, 0x00, 0x00, 0x90, 0x6e, 0xc5, 0xbc, 0xa6, 0x7f, 0x00, 0x00, 0x75, 0x6d, 0x69, 0x64, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xff, 0xce, 0xe1, 0x45, 0x11, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + NSUInteger length = sizeof(bytes) / sizeof(Byte); + return [NSData dataWithBytesNoCopy:(void *)bytes length:length freeWhenDone:NO]; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h new file mode 100644 index 0000000..13890a6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h @@ -0,0 +1,27 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKLikeControl.h" + +@interface FBSDKLikeControl () + +- (NSDictionary *)analyticsParameters; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h new file mode 100644 index 0000000..9d7748f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h @@ -0,0 +1,49 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import +#import + +#import + +@protocol FBSDKLikeDialogDelegate; + +@interface FBSDKLikeDialog : NSObject + ++ (instancetype)likeWithObjectID:(NSString *)objectID + objectType:(FBSDKLikeObjectType)objectType + delegate:(id)delegate; + +@property (nonatomic, weak) id delegate; +@property (nonatomic, copy) NSString *objectID; +@property (nonatomic, assign) FBSDKLikeObjectType objectType; +@property (nonatomic, assign) BOOL shouldFailOnDataError; +@property (nonatomic, weak) UIViewController *fromViewController; + +- (BOOL)canLike; +- (BOOL)like; +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; + +@end + +@protocol FBSDKLikeDialogDelegate + +- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didCompleteWithResults:(NSDictionary *)results; +- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didFailWithError:(NSError *)error; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m new file mode 100644 index 0000000..ea2abf6 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m @@ -0,0 +1,159 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKLikeDialog.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareDefines.h" +#import "FBSDKShareError.h" + +@implementation FBSDKLikeDialog + +#define FBSDK_LIKE_METHOD_MIN_VERSION @"20140410" +#define FBSDK_LIKE_METHOD_NAME @"like" +#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_LIKE @"like" +#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_UNLIKE @"unlike" + +#pragma mark - Class Methods + ++ (void)initialize +{ + if ([FBSDKLikeDialog class] == self) { + [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; + } +} + ++ (instancetype)likeWithObjectID:(NSString *)objectID + objectType:(FBSDKLikeObjectType)objectType + delegate:(id)delegate +{ + FBSDKLikeDialog *dialog = [[self alloc] init]; + dialog.objectID = objectID; + dialog.objectType = objectType; + dialog.delegate = delegate; + [dialog like]; + return dialog; +} + +#pragma mark - Public Methods + +- (BOOL)canLike +{ + return YES; +} + +- (BOOL)like +{ + NSError *error; + if (![self canLike]) { + error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode + message:@"Like dialog is not available."]; + [_delegate likeDialog:self didFailWithError:error]; + return NO; + } + if (![self validateWithError:&error]) { + [_delegate likeDialog:self didFailWithError:error]; + return NO; + } + + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [FBSDKInternalUtility dictionary:parameters setObject:self.objectID forKey:@"object_id"]; + [FBSDKInternalUtility dictionary:parameters + setObject:NSStringFromFBSDKLikeObjectType(self.objectType) + forKey:@"object_type"]; + FBSDKBridgeAPIRequest * webRequest = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb + scheme:FBSDK_SHARE_JS_DIALOG_SCHEME + methodName:FBSDK_LIKE_METHOD_NAME + methodVersion:nil + parameters:parameters + userInfo:nil]; + FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { + [self _handleCompletionWithDialogResults:response.responseParameters error:response.error]; + }; + + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + BOOL useSafariViewController = [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameLike]; + if ([self _canLikeNative]) { + FBSDKBridgeAPIRequest *nativeRequest = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative + scheme:FBSDK_CANOPENURL_FACEBOOK + methodName:FBSDK_LIKE_METHOD_NAME + methodVersion:FBSDK_LIKE_METHOD_MIN_VERSION + parameters:parameters + userInfo:nil]; + void (^networkCompletionBlock)(FBSDKBridgeAPIResponse *) = ^(FBSDKBridgeAPIResponse *response) { + if (response.error.code == FBSDKAppVersionUnsupportedErrorCode) { + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:webRequest + useSafariViewController:useSafariViewController + fromViewController:self.fromViewController + completionBlock:completionBlock]; + } else { + completionBlock(response); + } + }; + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:nativeRequest + useSafariViewController:useSafariViewController + fromViewController:self.fromViewController + completionBlock:networkCompletionBlock]; + } else { + [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:webRequest + useSafariViewController:useSafariViewController + fromViewController:self.fromViewController + completionBlock:completionBlock]; + } + + return YES; +} + +- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef +{ + if (![self.objectID length]) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"objectID" message:nil]; + } + return NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + +#pragma mark - Helper Methods + +- (BOOL)_canLikeNative +{ + FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; + BOOL useNativeDialog = [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLike]; + return (useNativeDialog && [FBSDKInternalUtility isFacebookAppInstalled]); +} + +- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error +{ + if (!_delegate) { + return; + } + NSString *completionGesture = results[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; + if (completionGesture && !error) { + [_delegate likeDialog:self didCompleteWithResults:[results copy]]; + } else { + [_delegate likeDialog:self didFailWithError:error]; + } +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h new file mode 100644 index 0000000..b3b6965 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKCoreKit+Internal.h" + +@interface FBSDKMessengerIcon : FBSDKIcon + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m new file mode 100644 index 0000000..2f5a22f --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m @@ -0,0 +1,50 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKMessengerIcon.h" + +@implementation FBSDKMessengerIcon + +- (CGPathRef)pathWithSize:(CGSize)size +{ + CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 61.0, size.height / 61.0); + const CGAffineTransform *transform = &transformValue; + CGMutablePathRef path = CGPathCreateMutable(); + CGPathMoveToPoint(path, transform, 30.001, 0.962); + CGPathAddCurveToPoint(path, transform, 13.439, 0.962, 0.014, 13.462, 0.014, 28.882); + CGPathAddCurveToPoint(path, transform, 0.014, 37.165, 3.892, 44.516, 10.046, 49.549); + CGPathAddLineToPoint(path, transform, 10.046, 61.176); + CGPathAddLineToPoint(path, transform, 19.351, 54.722); + CGPathAddCurveToPoint(path, transform, 22.662, 55.870, 26.250, 56.502, 30.002, 56.502); + CGPathAddCurveToPoint(path, transform, 46.565, 56.502, 59.990, 44.301, 59.990, 28.882); + CGPathAddCurveToPoint(path, transform, 59.989, 13.462, 46.564, 0.962, 30.001, 0.962); + CGPathCloseSubpath(path); + CGPathMoveToPoint(path, transform, 33.159, 37.473); + CGPathAddLineToPoint(path, transform, 25.403, 29.484); + CGPathAddLineToPoint(path, transform, 10.467, 37.674); + CGPathAddLineToPoint(path, transform, 26.843, 20.445); + CGPathAddLineToPoint(path, transform, 34.599, 28.433); + CGPathAddLineToPoint(path, transform, 49.535, 20.244); + CGPathAddLineToPoint(path, transform, 33.159, 37.473); + CGPathCloseSubpath(path); + CGPathRef result = CGPathCreateCopy(path); + CGPathRelease(path); + return CFAutorelease(result); +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h new file mode 100644 index 0000000..2d647fb --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h @@ -0,0 +1,30 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#define FBSDK_SHARE_JS_DIALOG_SCHEME @"web" +#define FBSDK_SHARE_METHOD_NAME @"share" +#define FBSDK_SHARE_OPEN_GRAPH_METHOD_NAME @"ogshare" +#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY @"completionGesture" +#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL @"cancel" +#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST @"post" +#define FBSDK_SHARE_RESULT_DID_COMPLETE_KEY @"didComplete" +#define FBSDK_SHARE_RESULT_POST_ID_KEY @"postId" +#define FBSDK_SHARE_WEB_PARAM_POST_ID_KEY @"post_id" +#define FBSDK_SHARE_WEB_SCHEME @"https" diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h new file mode 100644 index 0000000..ad83522 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import "FBSDKCoreKit+Internal.h" + +@interface FBSDKShareError : FBSDKError + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m new file mode 100644 index 0000000..46896cc --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m @@ -0,0 +1,30 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareError.h" + +#import "FBSDKShareConstants.h" + +@implementation FBSDKShareError + ++ (NSString *)errorDomain +{ + return FBSDKShareErrorDomain; +} + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h new file mode 100644 index 0000000..5c75377 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +#import "FBSDKShareDefines.h" +#import "FBSDKShareError.h" +#import "FBSDKShareOpenGraphValueContainer+Internal.h" +#import "FBSDKShareUtility.h" diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h new file mode 100644 index 0000000..c9269de --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareLinkContent.h" + +@interface FBSDKShareLinkContent () + +// Deprecated parameters for Feed Dialog - for usage with Unity only. +@property (nonatomic, copy) NSDictionary *feedParameters; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h new file mode 100644 index 0000000..5d9382e --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h @@ -0,0 +1,29 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import + +@interface FBSDKShareOpenGraphValueContainer () + +- (NSDictionary *)allProperties; +- (BOOL)isEqualToShareOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object; +- (BOOL)requireKeyNamespace; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h new file mode 100644 index 0000000..82ac804 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h @@ -0,0 +1,55 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import + +#import +#import +#import +#import +#import +#import + +@interface FBSDKShareUtility : NSObject + ++ (void)assertCollection:(id)collection ofClass:itemClass name:(NSString *)name; ++ (void)assertOpenGraphKey:(id)key requireNamespace:(BOOL)requireNamespace; ++ (void)assertOpenGraphValue:(id)value; ++ (void)assertOpenGraphValues:(NSDictionary *)dictionary requireKeyNamespace:(BOOL)requireKeyNamespace; ++ (id)convertOpenGraphValue:(id)value; ++ (BOOL)buildWebShareContent:(id)content + methodName:(NSString *__autoreleasing *)methodNameRef + parameters:(NSDictionary *__autoreleasing *)parametersRef + error:(NSError *__autoreleasing *)errorRef; ++ (NSDictionary *)convertOpenGraphValues:(NSDictionary *)dictionary; ++ (NSDictionary *)feedShareDictionaryForContent:(id)content; ++ (NSDictionary *)parametersForShareContent:(id)shareContent + shouldFailOnDataError:(BOOL)shouldFailOnDataError; ++ (void)testShareContent:(id)shareContent + containsMedia:(BOOL *)containsMediaRef + containsPhotos:(BOOL *)containsPhotosRef; ++ (BOOL)validateAppInviteContent:(FBSDKAppInviteContent *)appInviteContent error:(NSError *__autoreleasing *)errorRef; ++ (BOOL)validateGameRequestContent:(FBSDKGameRequestContent *)gameRequestContent error:(NSError *__autoreleasing *)errorRef; ++ (BOOL)validateShareContent:(id)shareContent error:(NSError *__autoreleasing *)errorRef; ++ (BOOL)validateShareLinkContent:(FBSDKShareLinkContent *)linkContent error:(NSError *__autoreleasing *)errorRef; ++ (BOOL)validateShareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent + error:(NSError *__autoreleasing *)errorRef; ++ (BOOL)validateSharePhotoContent:(FBSDKSharePhotoContent *)photoContent error:(NSError *__autoreleasing *)errorRef; ++ (NSString *)getOpenGraphNameAndNamespaceFromFullName:(NSString *)fullName namespace:(NSString **)namespace; + +@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m new file mode 100644 index 0000000..8c296e0 --- /dev/null +++ b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m @@ -0,0 +1,727 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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. + +#import "FBSDKShareUtility.h" + +#import "FBSDKCoreKit+Internal.h" +#import "FBSDKShareConstants.h" +#import "FBSDKShareError.h" +#import "FBSDKShareLinkContent+Internal.h" +#import "FBSDKShareOpenGraphContent.h" +#import "FBSDKShareOpenGraphObject.h" +#import "FBSDKSharePhoto.h" +#import "FBSDKSharePhotoContent.h" +#import "FBSDKShareVideo.h" +#import "FBSDKShareVideoContent.h" +#import "FBSDKSharingContent.h" + +@implementation FBSDKShareUtility + +#pragma mark - Class Methods + ++ (void)assertCollection:(id)collection ofClass:itemClass name:(NSString *)name +{ + for (id item in collection) { + if (![item isKindOfClass:itemClass]) { + NSString *reason = [[NSString alloc] initWithFormat: + @"Invalid value found in %@: %@ - %@", + name, + item, + collection]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; + } + } +} + ++ (void)assertOpenGraphKey:(id)key requireNamespace:(BOOL)requireNamespace +{ + if (![key isKindOfClass:[NSString class]]) { + NSString *reason = [[NSString alloc] initWithFormat:@"Invalid key found in Open Graph dictionary: %@", key]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; + } + if (!requireNamespace) { + return; + } + NSArray *components = [key componentsSeparatedByString:@":"]; + if ([components count] < 2) { + NSString *reason = [[NSString alloc] initWithFormat:@"Open Graph keys must be namespaced: %@", key]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; + } + for (NSString *component in components) { + if (![component length]) { + NSString *reason = [[NSString alloc] initWithFormat:@"Invalid key found in Open Graph dictionary: %@", key]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; + } + } +} + ++ (void)assertOpenGraphValue:(id)value +{ + if ([self _isOpenGraphValue:value]) { + return; + } + if ([value isKindOfClass:[NSDictionary class]]) { + [self assertOpenGraphValues:(NSDictionary *)value requireKeyNamespace:YES]; + return; + } + if ([value isKindOfClass:[NSArray class]]) { + for (id subValue in (NSArray *)value) { + [self assertOpenGraphValue:subValue]; + } + return; + } + NSString *reason = [[NSString alloc] initWithFormat:@"Invalid Open Graph value found: %@", value]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; +} + ++ (void)assertOpenGraphValues:(NSDictionary *)dictionary requireKeyNamespace:(BOOL)requireKeyNamespace +{ + [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + [self assertOpenGraphKey:key requireNamespace:requireKeyNamespace]; + [self assertOpenGraphValue:value]; + }]; +} + ++ (BOOL)buildWebShareContent:(id)content + methodName:(NSString *__autoreleasing *)methodNameRef + parameters:(NSDictionary *__autoreleasing *)parametersRef + error:(NSError *__autoreleasing *)errorRef +{ + NSString *methodName = nil; + NSDictionary *parameters = nil; + if ([content isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + methodName = @"share_open_graph"; + FBSDKShareOpenGraphContent *openGraphContent = (FBSDKShareOpenGraphContent *)content; + FBSDKShareOpenGraphAction *action = openGraphContent.action; + NSDictionary *properties = [self _convertOpenGraphValueContainer:action requireNamespace:NO]; + NSString *propertiesJSON = [FBSDKInternalUtility JSONStringForObject:properties + error:errorRef + invalidObjectHandler:NULL]; + parameters = @{ + @"action_type": action.actionType, + @"action_properties": propertiesJSON, + }; + } else if ([content isKindOfClass:[FBSDKShareLinkContent class]]) { + FBSDKShareLinkContent *linkContent = (FBSDKShareLinkContent *)content; + methodName = @"share"; + if (linkContent.contentURL != nil) { + parameters = @{ @"href": linkContent.contentURL.absoluteString }; + } + } + if (methodNameRef != NULL) { + *methodNameRef = methodName; + } + if (parametersRef != NULL) { + *parametersRef = parameters; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + ++ (id)convertOpenGraphValue:(id)value +{ + if ([self _isOpenGraphValue:value]) { + return value; + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *properties = (NSDictionary *)value; + if ([FBSDKTypeUtility stringValue:properties[@"type"]]) { + return [FBSDKShareOpenGraphObject objectWithProperties:properties]; + } else { + NSURL *imageURL = [FBSDKTypeUtility URLValue:properties[@"url"]]; + if (imageURL) { + FBSDKSharePhoto *sharePhoto = [FBSDKSharePhoto photoWithImageURL:imageURL + userGenerated:[FBSDKTypeUtility boolValue:properties[@"user_generated"]]]; + sharePhoto.caption = [FBSDKTypeUtility stringValue:properties[@"caption"]]; + return sharePhoto; + } else { + return nil; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSMutableArray *array = [[NSMutableArray alloc] init]; + for (id subValue in (NSArray *)value) { + [FBSDKInternalUtility array:array addObject:[self convertOpenGraphValue:subValue]]; + } + return [array copy]; + } else { + return nil; + } +} + ++ (NSDictionary *)convertOpenGraphValues:(NSDictionary *)dictionary +{ + NSMutableDictionary *convertedDictionary = [[NSMutableDictionary alloc] init]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [FBSDKInternalUtility dictionary:convertedDictionary setObject:[self convertOpenGraphValue:obj] forKey:key]; + }]; + return [convertedDictionary copy]; +} + ++ (NSDictionary *)feedShareDictionaryForContent:(id)content +{ + NSMutableDictionary *parameters = nil; + if ([content isKindOfClass:[FBSDKShareLinkContent class]]) { + FBSDKShareLinkContent *linkContent = (FBSDKShareLinkContent *)content; + parameters = [[NSMutableDictionary alloc] initWithDictionary:linkContent.feedParameters]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentDescription forKey:@"description"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"link"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentTitle forKey:@"name"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.imageURL forKey:@"picture"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.ref forKey:@"ref"]; + } + return [parameters copy]; +} + ++ (NSDictionary *)parametersForShareContent:(id)shareContent + shouldFailOnDataError:(BOOL)shouldFailOnDataError +{ + NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; + [self _addToParameters:parameters forShareContent:shareContent]; + parameters[@"dataFailuresFatal"] = @(shouldFailOnDataError); + if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + [self _addToParameters:parameters forShareLinkContent:(FBSDKShareLinkContent *)shareContent]; + } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + [self _addToParameters:parameters forSharePhotoContent:(FBSDKSharePhotoContent *)shareContent]; + } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + [self _addToParameters:parameters forShareVideoContent:(FBSDKShareVideoContent *)shareContent]; + } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + [self _addToParameters:parameters forShareOpenGraphContent:(FBSDKShareOpenGraphContent *)shareContent]; + } + return [parameters copy]; +} + ++ (void)testShareContent:(id)shareContent + containsMedia:(BOOL *)containsMediaRef + containsPhotos:(BOOL *)containsPhotosRef +{ + BOOL containsMedia = NO; + BOOL containsPhotos = NO; + if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + containsMedia = NO; + containsPhotos = NO; + } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + containsMedia = YES; + containsPhotos = NO; + } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + [self _testObject:((FBSDKSharePhotoContent *)shareContent).photos + containsMedia:&containsMedia + containsPhotos:&containsPhotos]; + } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + [self _testOpenGraphValueContainer:((FBSDKShareOpenGraphContent *)shareContent).action + containsMedia:&containsMedia + containsPhotos:&containsPhotos]; + } + if (containsMediaRef != NULL) { + *containsMediaRef = containsMedia; + } + if (containsPhotosRef != NULL) { + *containsPhotosRef = containsPhotos; + } +} + ++ (BOOL)validateAppInviteContent:(FBSDKAppInviteContent *)appInviteContent error:(NSError *__autoreleasing *)errorRef +{ + return ([self _validateRequiredValue:appInviteContent name:@"content" error:errorRef] && + [self _validateRequiredValue:appInviteContent.appLinkURL name:@"appLinkURL" error:errorRef] && + [self _validateNetworkURL:appInviteContent.appLinkURL name:@"appLinkURL" error:errorRef] && + [self _validateNetworkURL:appInviteContent.appInvitePreviewImageURL name:@"appInvitePreviewImageURL" error:errorRef]); +} + ++ (BOOL)validateGameRequestContent:(FBSDKGameRequestContent *)gameRequestContent error:(NSError *__autoreleasing *)errorRef +{ + if (![self _validateRequiredValue:gameRequestContent name:@"content" error:errorRef] + || ![self _validateRequiredValue:gameRequestContent.message name:@"message" error:errorRef]) { + return NO; + } + BOOL mustHaveobjectID = gameRequestContent.actionType == FBSDKGameRequestActionTypeSend + || gameRequestContent.actionType == FBSDKGameRequestActionTypeAskFor; + BOOL hasobjectID = [gameRequestContent.objectID length] > 0; + if (mustHaveobjectID ^ hasobjectID) { + if (errorRef != NULL) { + NSString *message = @"The objectID is required when the actionType is either send or askfor."; + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"objectID" message:message]; + } + return NO; + } + BOOL hasTo = [gameRequestContent.recipients count] > 0; + BOOL hasFilters = gameRequestContent.filters != FBSDKGameRequestFilterNone; + BOOL hasSuggestions = [gameRequestContent.recipientSuggestions count] > 0; + if (hasTo && hasFilters) { + if (errorRef != NULL) { + NSString *message = @"Cannot specify to and filters at the same time."; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"recipients" value:gameRequestContent.recipients message:message]; + } + return NO; + } + if (hasTo && hasSuggestions) { + if (errorRef != NULL) { + NSString *message = @"Cannot specify to and suggestions at the same time."; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"recipients" value:gameRequestContent.recipients message:message]; + } + return NO; + } + + if (hasFilters && hasSuggestions) { + if (errorRef != NULL) { + NSString *message = @"Cannot specify filters and suggestions at the same time."; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"recipientSuggestions" value:gameRequestContent.recipientSuggestions message:message]; + } + return NO; + } + + if ([gameRequestContent.data length] > 255) { + if (errorRef != NULL) { + NSString *message = @"The data cannot be longer than 255 characters"; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"data" value:gameRequestContent.data message:message]; + } + return NO; + } + + if (errorRef != NULL) { + *errorRef = nil; + } + + return [self _validateArgumentWithName:@"actionType" + value:gameRequestContent.actionType + isIn:@[@(FBSDKGameRequestActionTypeNone), + @(FBSDKGameRequestActionTypeSend), + @(FBSDKGameRequestActionTypeAskFor), + @(FBSDKGameRequestActionTypeTurn)] + error:errorRef] + && [self _validateArgumentWithName:@"filters" + value:gameRequestContent.filters + isIn:@[@(FBSDKGameRequestFilterNone), + @(FBSDKGameRequestFilterAppUsers), + @(FBSDKGameRequestFilterAppNonUsers)] + error:errorRef]; +} + ++ (BOOL)validateShareContent:(id)shareContent error:(NSError *__autoreleasing *)errorRef +{ + if (![self _validateRequiredValue:shareContent name:@"shareContent" error:errorRef]) { + return NO; + } else if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { + return [self validateShareLinkContent:(FBSDKShareLinkContent *)shareContent error:errorRef]; + } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { + return [self validateSharePhotoContent:(FBSDKSharePhotoContent *)shareContent error:errorRef]; + } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { + return [self validateShareVideoContent:(FBSDKShareVideoContent *)shareContent error:errorRef]; + } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + return [self validateShareOpenGraphContent:(FBSDKShareOpenGraphContent *)shareContent error:errorRef]; + } else { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:nil]; + } + return NO; + } +} + ++ (BOOL)validateShareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent + error:(NSError *__autoreleasing *)errorRef +{ + FBSDKShareOpenGraphAction *action = openGraphContent.action; + NSString *previewPropertyName = openGraphContent.previewPropertyName; + id object = action[previewPropertyName]; + return ([self _validateRequiredValue:openGraphContent name:@"shareContent" error:errorRef] && + [self _validateRequiredValue:action name:@"action" error:errorRef] && + [self _validateRequiredValue:previewPropertyName name:@"previewPropertyName" error:errorRef] && + [self _validateRequiredValue:object name:previewPropertyName error:errorRef]); +} + ++ (BOOL)validateSharePhotoContent:(FBSDKSharePhotoContent *)photoContent error:(NSError *__autoreleasing *)errorRef +{ + NSArray *photos = photoContent.photos; + if (![self _validateRequiredValue:photoContent name:@"shareContent" error:errorRef] || + ![self _validateArray:photos minCount:1 maxCount:6 name:@"photos" error:errorRef]) { + return NO; + } + for (FBSDKSharePhoto *photo in photos) { + if (!photo.image) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"photos" + value:photos + message:@"photos must have UIImages"]; + } + return NO; + } + } + return YES; +} + ++ (BOOL)validateShareLinkContent:(FBSDKShareLinkContent *)linkContent error:(NSError *__autoreleasing *)errorRef +{ + return ([self _validateRequiredValue:linkContent name:@"shareContent" error:errorRef] && + [self _validateNetworkURL:linkContent.contentURL name:@"contentURL" error:errorRef] && + [self _validateNetworkURL:linkContent.imageURL name:@"imageURL" error:errorRef]); +} + ++ (BOOL)validateShareVideoContent:(FBSDKShareVideoContent *)videoContent error:(NSError *__autoreleasing *)errorRef +{ + FBSDKShareVideo *video = videoContent.video; + NSURL *videoURL = video.videoURL; + return ([self _validateRequiredValue:videoContent name:@"videoContent" error:errorRef] && + [self _validateRequiredValue:video name:@"video" error:errorRef] && + [self _validateRequiredValue:videoURL name:@"videoURL" error:errorRef] && + [self _validateAssetLibraryURL:videoURL name:@"videoURL" error:errorRef]); +} + +#pragma mark - Object Lifecycle + +- (instancetype)init +{ + FBSDK_NO_DESIGNATED_INITIALIZER(); + return nil; +} + +#pragma mark - Helper Methods + ++ (void)_addToParameters:(NSMutableDictionary *)parameters forShareContent:(id)shareContent +{ + if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { + FBSDKShareOpenGraphAction *action = ((FBSDKShareOpenGraphContent *)shareContent).action; + [action setArray:shareContent.peopleIDs forKey:@"tags"]; + [action setString:shareContent.placeID forKey:@"place"]; + [action setString:shareContent.ref forKey:@"ref"]; + } else { + [FBSDKInternalUtility dictionary:parameters setObject:shareContent.peopleIDs forKey:@"tags"]; + [FBSDKInternalUtility dictionary:parameters setObject:shareContent.placeID forKey:@"place"]; + [FBSDKInternalUtility dictionary:parameters setObject:shareContent.ref forKey:@"ref"]; + } +} + ++ (void)_addToParameters:(NSMutableDictionary *)parameters +forShareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent +{ + NSString *previewPropertyName = [self getOpenGraphNameAndNamespaceFromFullName:openGraphContent.previewPropertyName namespace:nil]; + [FBSDKInternalUtility dictionary:parameters + setObject:previewPropertyName + forKey:@"previewPropertyName"]; + [FBSDKInternalUtility dictionary:parameters setObject:openGraphContent.action.actionType forKey:@"actionType"]; + [FBSDKInternalUtility dictionary:parameters + setObject:[self _convertOpenGraphValueContainer:openGraphContent.action requireNamespace:NO] + forKey:@"action"]; +} + ++ (void)_addToParameters:(NSMutableDictionary *)parameters + forSharePhotoContent:(FBSDKSharePhotoContent *)photoContent +{ + [FBSDKInternalUtility dictionary:parameters + setObject:[photoContent.photos valueForKeyPath:@"image"] + forKey:@"photos"]; +} + ++ (void)_addToParameters:(NSMutableDictionary *)parameters + forShareLinkContent:(FBSDKShareLinkContent *)linkContent +{ + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"link"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentTitle forKey:@"name"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentDescription forKey:@"description"]; + [FBSDKInternalUtility dictionary:parameters setObject:linkContent.imageURL forKey:@"picture"]; +} + ++ (void)_addToParameters:(NSMutableDictionary *)parameters + forShareVideoContent:(FBSDKShareVideoContent *)videoContent +{ + NSMutableDictionary *videoParameters = [[NSMutableDictionary alloc] init]; + FBSDKShareVideo *video = videoContent.video; + NSURL *videoURL = video.videoURL; + if (videoURL) { + videoParameters[@"assetURL"] = videoURL; + } + [FBSDKInternalUtility dictionary:videoParameters + setObject:[self _convertPhoto:videoContent.previewPhoto] + forKey:@"previewPhoto"]; + parameters[@"video"] = videoParameters; +} + ++ (id)_convertObject:(id)object +{ + if ([object isKindOfClass:[FBSDKShareOpenGraphValueContainer class]]) { + object = [self _convertOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object requireNamespace:YES]; + } else if ([object isKindOfClass:[FBSDKSharePhoto class]]) { + object = [self _convertPhoto:(FBSDKSharePhoto *)object]; + } else if ([object isKindOfClass:[NSArray class]]) { + NSMutableArray *array = [[NSMutableArray alloc] init]; + for (id item in (NSArray *)object) { + [FBSDKInternalUtility array:array addObject:[self _convertObject:item]]; + } + object = array; + } + return object; +} + ++ (NSDictionary *)_convertOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)container + requireNamespace:(BOOL)requireNamespace +{ + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *data = [[NSMutableDictionary alloc] init]; + [container enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { + // if we have an FBSDKShareOpenGraphObject and a type, then we are creating a new object instance; set the flag + if ([key isEqualToString:@"og:type"] && [container isKindOfClass:[FBSDKShareOpenGraphObject class]]) { + dictionary[@"fbsdk:create_object"] = @YES; + dictionary[key] = object; + } + id value = [self _convertObject:object]; + if (value) { + NSString *namespace; + key = [self getOpenGraphNameAndNamespaceFromFullName:key namespace:&namespace]; + + if (requireNamespace) { + if ([namespace isEqualToString:@"og"]) { + dictionary[key] = value; + } else { + data[key] = value; + } + } else { + dictionary[key] = value; + } + } + }]; + if ([data count]) { + dictionary[@"data"] = data; + } + return dictionary; +} + ++ (NSString *)getOpenGraphNameAndNamespaceFromFullName:(NSString *)fullName namespace:(NSString **)namespace { + if (namespace) { + *namespace = nil; + } + + if ([fullName isEqualToString:@"fb:explicitly_shared"]) { + return fullName; + } + + NSUInteger index = [fullName rangeOfString:@":"].location; + if ((index != NSNotFound) && (fullName.length > index + 1)) { + if (namespace) { + *namespace = [fullName substringToIndex:index]; + } + + return [fullName substringFromIndex:index + 1]; + } + + return fullName; +} + ++ (NSDictionary *)_convertPhoto:(FBSDKSharePhoto *)photo +{ + if (!photo) { + return nil; + } + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + dictionary[@"user_generated"] = @(photo.userGenerated); + [FBSDKInternalUtility dictionary:dictionary setObject:photo.caption forKey:@"caption"]; + + [FBSDKInternalUtility dictionary:dictionary setObject:photo.image ?: photo.imageURL.absoluteString forKey:@"url"]; + return dictionary; +} + ++ (BOOL)_isOpenGraphValue:(id)value +{ + return ((value == nil) || + [value isKindOfClass:[NSNull class]] || + [value isKindOfClass:[NSNumber class]] || + [value isKindOfClass:[NSString class]] || + [value isKindOfClass:[NSURL class]] || + [value isKindOfClass:[FBSDKSharePhoto class]] || + [value isKindOfClass:[FBSDKShareOpenGraphObject class]]); +} + ++ (void)_testObject:(id)object containsMedia:(BOOL *)containsMediaRef containsPhotos:(BOOL *)containsPhotosRef +{ + BOOL containsMedia = NO; + BOOL containsPhotos = NO; + if ([object isKindOfClass:[FBSDKSharePhoto class]]) { + containsMedia = (((FBSDKSharePhoto *)object).image != nil); + containsPhotos = YES; + } else if ([object isKindOfClass:[FBSDKShareOpenGraphValueContainer class]]) { + [self _testOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object + containsMedia:&containsMedia + containsPhotos:&containsPhotos]; + } else if ([object isKindOfClass:[NSArray class]]) { + for (id item in (NSArray *)object) { + BOOL itemContainsMedia = NO; + BOOL itemContainsPhotos = NO; + [self _testObject:item containsMedia:&itemContainsMedia containsPhotos:&itemContainsPhotos]; + containsMedia |= itemContainsMedia; + containsPhotos |= itemContainsPhotos; + if (containsMedia && containsPhotos) { + break; + } + } + } + if (containsMediaRef != NULL) { + *containsMediaRef = containsMedia; + } + if (containsPhotosRef != NULL) { + *containsPhotosRef = containsPhotos; + } +} + ++ (void)_testOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)container + containsMedia:(BOOL *)containsMediaRef + containsPhotos:(BOOL *)containsPhotosRef +{ + __block BOOL containsMedia = NO; + __block BOOL containsPhotos = NO; + [container enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { + BOOL itemContainsMedia = NO; + BOOL itemContainsPhotos = NO; + [self _testObject:object containsMedia:&itemContainsMedia containsPhotos:&itemContainsPhotos]; + containsMedia |= itemContainsMedia; + containsPhotos |= itemContainsPhotos; + if (containsMedia && containsPhotos) { + *stop = YES; + } + }]; + if (containsMediaRef != NULL) { + *containsMediaRef = containsMedia; + } + if (containsPhotosRef != NULL) { + *containsPhotosRef = containsPhotos; + } +} + ++ (BOOL)_validateArray:(NSArray *)array + minCount:(NSUInteger)minCount + maxCount:(NSUInteger)maxCount + name:(NSString *)name + error:(NSError *__autoreleasing *)errorRef +{ + NSUInteger count = [array count]; + if ((count < minCount) || (count > maxCount)) { + if (errorRef != NULL) { + NSString *message = [[NSString alloc] initWithFormat:@"%@ must have %lu to %lu values", + name, + (unsigned long)minCount, + (unsigned long)maxCount]; + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:array message:message]; + } + return NO; + } else { + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; + } +} + ++ (BOOL)_validateAssetLibraryURL:(NSURL *)URL name:(NSString *)name error:(NSError *__autoreleasing *)errorRef +{ + if (!URL || [[URL.scheme lowercaseString] isEqualToString:@"assets-library"]) { + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; + } else { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:URL message:nil]; + } + return NO; + } +} + ++ (BOOL)_validateFileURL:(NSURL *)URL name:(NSString *)name error:(NSError *__autoreleasing *)errorRef +{ + if (!URL) { + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; + } + if (!URL.isFileURL) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:URL message:nil]; + } + return NO; + } + // ensure that the file exists. per the latest spec for NSFileManager, we should not be checking for file existance, + // so they have removed that option for URLs and discourage it for paths, so we just construct a mapped NSData. + NSError *fileError; + if (![[NSData alloc] initWithContentsOfURL:URL + options:NSDataReadingMapped + error:&fileError]) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name + value:URL + message:@"Error reading file" + underlyingError:fileError]; + } + return NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + ++ (BOOL)_validateNetworkURL:(NSURL *)URL name:(NSString *)name error:(NSError *__autoreleasing *)errorRef +{ + if (!URL || [FBSDKInternalUtility isBrowserURL:URL]) { + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; + } else { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:URL message:nil]; + } + return NO; + } +} + ++ (BOOL)_validateRequiredValue:(id)value name:(NSString *)name error:(NSError *__autoreleasing *)errorRef +{ + if (!value || + ([value isKindOfClass:[NSString class]] && ![(NSString *)value length]) || + ([value isKindOfClass:[NSArray class]] && ![(NSArray *)value count]) || + ([value isKindOfClass:[NSDictionary class]] && ![(NSDictionary *)value count])) { + if (errorRef != NULL) { + *errorRef = [FBSDKShareError requiredArgumentErrorWithName:name message:nil]; + } + return NO; + } + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; +} + ++ (BOOL)_validateArgumentWithName:(NSString *)argumentName + value:(NSUInteger)value + isIn:(NSArray *)possibleValues + error:(NSError *__autoreleasing *)errorRef +{ + for (NSNumber *possibleValue in possibleValues) { + if (value == [possibleValue unsignedIntegerValue]) { + if (errorRef != NULL) { + *errorRef = nil; + } + return YES; + } + } + if (errorRef != NULL) { + *errorRef = [FBSDKShareError invalidArgumentErrorWithName:argumentName value:@(value) message:nil]; + } + return NO; +} + +@end diff --git a/Pods/FBSDKShareKit/LICENSE b/Pods/FBSDKShareKit/LICENSE new file mode 100644 index 0000000..bdb9fc5 --- /dev/null +++ b/Pods/FBSDKShareKit/LICENSE @@ -0,0 +1,17 @@ +Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +copy, modify, and distribute this software in source code or binary form for use +in connection with the web services and APIs provided by Facebook. + +As with any software that integrates with the Facebook platform, your use of +this software is subject to the Facebook Developer Principles and Policies +[http://developers.facebook.com/policy/]. This copyright 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. diff --git a/Pods/FBSDKShareKit/README.mdown b/Pods/FBSDKShareKit/README.mdown new file mode 100644 index 0000000..d14a5e4 --- /dev/null +++ b/Pods/FBSDKShareKit/README.mdown @@ -0,0 +1,46 @@ +Facebook SDK for iOS +==================== + +This open-source library allows you to integrate Facebook into your iOS app. + +Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more at https://developers.facebook.com/docs/ios + +NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookSDK + +TRY IT OUT +---------- +1. Download the SDK at https://developers.facebook.com/docs/ios or via Cocoapods by adding the 'FBSDKCoreKit', 'FBSDKLoginKit', and 'FBSDKShareKit' pods. +2. Test your install: build and run the project at ~/Documents/FacebookSDK/Samples/Scrumptious/Scrumptious.xcodeproj +3. Check-out the tutorials available online at: https://developers.facebook.com/docs/ios/getting-started +4. Start coding! Visit https://developers.facebook.com/docs/ios for tutorials and reference documentation. + +FEATURES +-------- +* Login - https://developers.facebook.com/docs/facebook-login +* Sharing - https://developers.facebook.com/docs/sharing +* App Links - https://developers.facebook.com/docs/applinks +* Graph API - https://developers.facebook.com/docs/ios/graph +* Analytics for Apps - https://developers.facebook.com/docs/analytics + +GIVE FEEDBACK +------------- +Please report bugs or issues to https://developers.facebook.com/bugs/ + +You can also join the Facebook Developers Group on Facebook (https://www.facebook.com/groups/fbdevelopers/) or ask questions on Stack Overflow (http://facebook.stackoverflow.com) + +LICENSE +------- +See the LICENSE file. + +DEVELOPER TERMS +--------------- + +- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including information about people’s use of your app. Facebook will use information received in accordance with our Data Use Policy [https://www.facebook.com/about/privacy/], including to provide you with insights about the effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on and off Facebook. + +- You may limit your sharing of information with us by updating the Insights control in the developer tool [https://developers.facebook.com/apps/{app_id}/settings/advanced]. + +- If you use a Facebook integration, including to share information with us, you agree and confirm that you have provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further agree that you will not share information with us about children under the age of 13. + +- You agree to comply with all applicable laws and regulations and also agree to our Terms , including our Platform Policies .and Advertising Guidelines, as applicable . + +By using the Facebook SDK for iOS you agree to these terms. diff --git a/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h new file mode 120000 index 0000000..ac762c8 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h new file mode 120000 index 0000000..9dcc623 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h b/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h new file mode 120000 index 0000000..56feb9f --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPSessionManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h b/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 120000 index 0000000..67519d9 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h b/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h new file mode 120000 index 0000000..68fc774 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworkReachabilityManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFNetworking.h b/Pods/Headers/Private/AFNetworking/AFNetworking.h new file mode 120000 index 0000000..a5a38da --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h b/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h new file mode 120000 index 0000000..fd1322d --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFSecurityPolicy.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h b/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h new file mode 120000 index 0000000..d9b35fb --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLConnectionOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h b/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h new file mode 120000 index 0000000..ca8209b --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLRequestSerialization.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h b/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h new file mode 120000 index 0000000..e36a765 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLResponseSerialization.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h b/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h new file mode 120000 index 0000000..835101d --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLSessionManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 120000 index 0000000..c534ebf --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h new file mode 120000 index 0000000..f992813 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h new file mode 120000 index 0000000..8f2e221 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h new file mode 120000 index 0000000..74f6649 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h new file mode 120000 index 0000000..a95d673 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h new file mode 120000 index 0000000..95017cc --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h new file mode 120000 index 0000000..730b167 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h new file mode 120000 index 0000000..8efd826 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h new file mode 120000 index 0000000..c8df6ef --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLink.h b/Pods/Headers/Private/Bolts/BFAppLink.h new file mode 120000 index 0000000..3f79bee --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLink.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLink.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkNavigation.h b/Pods/Headers/Private/Bolts/BFAppLinkNavigation.h new file mode 120000 index 0000000..6962356 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLinkNavigation.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkNavigation.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkResolving.h b/Pods/Headers/Private/Bolts/BFAppLinkResolving.h new file mode 120000 index 0000000..94cc66f --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLinkResolving.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkResolving.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h new file mode 120000 index 0000000..95067f0 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h new file mode 120000 index 0000000..cc00897 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h new file mode 120000 index 0000000..fc68769 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkTarget.h b/Pods/Headers/Private/Bolts/BFAppLinkTarget.h new file mode 120000 index 0000000..90a41f6 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLinkTarget.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkTarget.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLink_Internal.h b/Pods/Headers/Private/Bolts/BFAppLink_Internal.h new file mode 120000 index 0000000..dc060b2 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFAppLink_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLink_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFCancellationToken.h b/Pods/Headers/Private/Bolts/BFCancellationToken.h new file mode 120000 index 0000000..0b69486 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFCancellationToken.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFCancellationToken.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h b/Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h new file mode 120000 index 0000000..c587ca7 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFCancellationTokenRegistration.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFCancellationTokenSource.h b/Pods/Headers/Private/Bolts/BFCancellationTokenSource.h new file mode 120000 index 0000000..d3d5985 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFCancellationTokenSource.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFCancellationTokenSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFDefines.h b/Pods/Headers/Private/Bolts/BFDefines.h new file mode 120000 index 0000000..5df18ff --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFDefines.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFDefines.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFExecutor.h b/Pods/Headers/Private/Bolts/BFExecutor.h new file mode 120000 index 0000000..c071e8c --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFExecutor.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFExecutor.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFMeasurementEvent.h b/Pods/Headers/Private/Bolts/BFMeasurementEvent.h new file mode 120000 index 0000000..2eb6c11 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFMeasurementEvent.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFMeasurementEvent.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h b/Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h new file mode 120000 index 0000000..98b7d06 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFMeasurementEvent_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFTask.h b/Pods/Headers/Private/Bolts/BFTask.h new file mode 120000 index 0000000..5468334 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFTask.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFTask.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFTaskCompletionSource.h b/Pods/Headers/Private/Bolts/BFTaskCompletionSource.h new file mode 120000 index 0000000..c74760f --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFTaskCompletionSource.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFTaskCompletionSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFURL.h b/Pods/Headers/Private/Bolts/BFURL.h new file mode 120000 index 0000000..df21bd9 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFURL.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFURL.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFURL_Internal.h b/Pods/Headers/Private/Bolts/BFURL_Internal.h new file mode 120000 index 0000000..3a5c5f4 --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFURL_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFURL_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h b/Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h new file mode 120000 index 0000000..bf250db --- /dev/null +++ b/Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/Bolts.h b/Pods/Headers/Private/Bolts/Bolts.h new file mode 120000 index 0000000..146ac6e --- /dev/null +++ b/Pods/Headers/Private/Bolts/Bolts.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/Bolts.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BoltsVersion.h b/Pods/Headers/Private/Bolts/BoltsVersion.h new file mode 120000 index 0000000..0fa0e2d --- /dev/null +++ b/Pods/Headers/Private/Bolts/BoltsVersion.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BoltsVersion.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h new file mode 120000 index 0000000..a5b3f97 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h new file mode 120000 index 0000000..95c1d00 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h new file mode 120000 index 0000000..69c20f5 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h new file mode 120000 index 0000000..fef519c --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h new file mode 120000 index 0000000..e163dc8 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h new file mode 120000 index 0000000..806ec62 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h new file mode 120000 index 0000000..4c08cc8 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h new file mode 120000 index 0000000..aa5dc1f --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h new file mode 120000 index 0000000..bfffe4f --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEvents+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEvents+Internal.h new file mode 120000 index 0000000..bca1f6d --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEvents+Internal.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsDeviceInfo.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsDeviceInfo.h new file mode 120000 index 0000000..0117f86 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsDeviceInfo.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsState.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsState.h new file mode 120000 index 0000000..d308fc2 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsState.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsStateManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsStateManager.h new file mode 120000 index 0000000..96166c9 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsStateManager.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsUtility.h new file mode 120000 index 0000000..9e4fe10 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKAppEventsUtility.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKPaymentObserver.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKPaymentObserver.h new file mode 120000 index 0000000..2a1633c --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKPaymentObserver.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKTimeSpentData.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKTimeSpentData.h new file mode 120000 index 0000000..86e7c62 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppEvents/FBSDKTimeSpentData.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppLink/FBSDKBoltsMeasurementEventListener.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppLink/FBSDKBoltsMeasurementEventListener.h new file mode 120000 index 0000000..5487fc0 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/AppLink/FBSDKBoltsMeasurementEventListener.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Base64/FBSDKBase64.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Base64/FBSDKBase64.h new file mode 120000 index 0000000..813405b --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Base64/FBSDKBase64.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPICrypto.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPICrypto.h new file mode 120000 index 0000000..cb0de38 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPICrypto.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocol.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocol.h new file mode 120000 index 0000000..1e29474 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocol.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocolType.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocolType.h new file mode 120000 index 0000000..be98e2d --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIProtocolType.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest+Private.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest+Private.h new file mode 120000 index 0000000..683af01 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest+Private.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest.h new file mode 120000 index 0000000..5559ff2 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIRequest.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIResponse.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIResponse.h new file mode 120000 index 0000000..b98fda5 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKBridgeAPIResponse.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKURLOpening.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKURLOpening.h new file mode 120000 index 0000000..511af8b --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/FBSDKURLOpening.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h new file mode 120000 index 0000000..7217555 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h @@ -0,0 +1 @@ +../../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h new file mode 120000 index 0000000..81046ef --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h @@ -0,0 +1 @@ +../../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h new file mode 120000 index 0000000..3d5905f --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h @@ -0,0 +1 @@ +../../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Cryptography/FBSDKCrypto.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Cryptography/FBSDKCrypto.h new file mode 120000 index 0000000..d252bd1 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Cryptography/FBSDKCrypto.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/FBSDKErrorRecoveryAttempter.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/FBSDKErrorRecoveryAttempter.h new file mode 120000 index 0000000..38b6b9a --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/FBSDKErrorRecoveryAttempter.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h new file mode 120000 index 0000000..632ac64 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h new file mode 120000 index 0000000..77f5848 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKAudioResourceLoader.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKAudioResourceLoader.h new file mode 120000 index 0000000..2bfc06b --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKAudioResourceLoader.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKContainerViewController.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKContainerViewController.h new file mode 120000 index 0000000..e7f5c5a --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKContainerViewController.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit+Internal.h new file mode 120000 index 0000000..b008702 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h new file mode 120000 index 0000000..a19240e --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKError.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKError.h new file mode 120000 index 0000000..6d85e14 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKError.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKInternalUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKInternalUtility.h new file mode 120000 index 0000000..c23bf34 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKInternalUtility.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKLogger.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKLogger.h new file mode 120000 index 0000000..3315142 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKLogger.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMath.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMath.h new file mode 120000 index 0000000..df9ec6b --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMath.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMonotonicTime.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMonotonicTime.h new file mode 120000 index 0000000..d2aa09d --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKMonotonicTime.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile+Internal.h new file mode 120000 index 0000000..255bbe8 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings+Internal.h new file mode 120000 index 0000000..d6f2f9a --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h new file mode 120000 index 0000000..2c6a47b --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTriStateBOOL.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTriStateBOOL.h new file mode 120000 index 0000000..6a410f9 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTriStateBOOL.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTypeUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTypeUtility.h new file mode 120000 index 0000000..099c869 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/FBSDKTypeUtility.h @@ -0,0 +1 @@ +../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequest+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequest+Internal.h new file mode 120000 index 0000000..6e01ec1 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequest+Internal.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestBody.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestBody.h new file mode 120000 index 0000000..934a950 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestBody.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestConnection+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestConnection+Internal.h new file mode 120000 index 0000000..91dc9cf --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestConnection+Internal.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestMetadata.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestMetadata.h new file mode 120000 index 0000000..706bcf0 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestMetadata.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestPiggybackManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestPiggybackManager.h new file mode 120000 index 0000000..08b7d33 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKGraphRequestPiggybackManager.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKURLConnection.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKURLConnection.h new file mode 120000 index 0000000..6c2e53a --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/Network/FBSDKURLConnection.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKDialogConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKDialogConfiguration.h new file mode 120000 index 0000000..440f996 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKDialogConfiguration.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorConfiguration.h new file mode 120000 index 0000000..2dd9eb6 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorConfiguration.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h new file mode 120000 index 0000000..7fefef9 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration+Internal.h new file mode 120000 index 0000000..c83017c --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration+Internal.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration.h new file mode 120000 index 0000000..92b6a91 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfiguration.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h new file mode 120000 index 0000000..ff5429a --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager.h new file mode 120000 index 0000000..fce03db --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/ServerConfiguration/FBSDKServerConfigurationManager.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCache.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCache.h new file mode 120000 index 0000000..7fd98c6 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCache.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3.h new file mode 120000 index 0000000..76f7463 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_17.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_17.h new file mode 120000 index 0000000..ab98c04 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_17.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_21.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_21.h new file mode 120000 index 0000000..e5b9041 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV3_21.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV4.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV4.h new file mode 120000 index 0000000..d51e088 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCacheV4.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCaching.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCaching.h new file mode 120000 index 0000000..2847507 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKAccessTokenCaching.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStore.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStore.h new file mode 120000 index 0000000..b4cd9e0 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStore.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStoreViaBundleID.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStoreViaBundleID.h new file mode 120000 index 0000000..e487b7c --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/TokenCaching/FBSDKKeychainStoreViaBundleID.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKButton+Subclass.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKButton+Subclass.h new file mode 120000 index 0000000..5d7863e --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKButton+Subclass.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKCloseIcon.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKCloseIcon.h new file mode 120000 index 0000000..757c858 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKCloseIcon.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKColor.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKColor.h new file mode 120000 index 0000000..7f6cbb5 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKColor.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKIcon.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKIcon.h new file mode 120000 index 0000000..d36c18a --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKIcon.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKLogo.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKLogo.h new file mode 120000 index 0000000..360f0b0 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKLogo.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKMaleSilhouetteIcon.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKMaleSilhouetteIcon.h new file mode 120000 index 0000000..a46a344 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKMaleSilhouetteIcon.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKUIUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKUIUtility.h new file mode 120000 index 0000000..e6fcd41 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKUIUtility.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKViewImpressionTracker.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKViewImpressionTracker.h new file mode 120000 index 0000000..3c37050 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/UI/FBSDKViewImpressionTracker.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialog.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialog.h new file mode 120000 index 0000000..c7e0ba3 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialog.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialogView.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialogView.h new file mode 120000 index 0000000..e0507f4 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit/WebDialog/FBSDKWebDialogView.h @@ -0,0 +1 @@ +../../../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h new file mode 120000 index 0000000..6f019f6 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h new file mode 120000 index 0000000..524cb77 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h new file mode 120000 index 0000000..c6cbbfc --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h new file mode 120000 index 0000000..9960de2 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h new file mode 120000 index 0000000..f9059c1 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h new file mode 120000 index 0000000..40cf5f1 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h new file mode 120000 index 0000000..a9866b1 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h new file mode 120000 index 0000000..6f38799 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h new file mode 120000 index 0000000..7edc38f --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h new file mode 120000 index 0000000..5813f89 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h new file mode 120000 index 0000000..efbfaf1 --- /dev/null +++ b/Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h new file mode 120000 index 0000000..67d7080 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h new file mode 120000 index 0000000..0e81d04 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h new file mode 120000 index 0000000..32e79a7 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h new file mode 120000 index 0000000..61c47da --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h new file mode 120000 index 0000000..16f9d52 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h new file mode 120000 index 0000000..429d4fb --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h new file mode 120000 index 0000000..0a8ba29 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h new file mode 120000 index 0000000..3f7906b --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h new file mode 120000 index 0000000..8d2b1fc --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h new file mode 120000 index 0000000..b17a17a --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h new file mode 120000 index 0000000..f54c62b --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h new file mode 120000 index 0000000..eac03ca --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h new file mode 120000 index 0000000..2fe6da3 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h new file mode 120000 index 0000000..894b54b --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h new file mode 120000 index 0000000..1e9ecee --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h new file mode 120000 index 0000000..3693592 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h new file mode 120000 index 0000000..89509cd --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h new file mode 120000 index 0000000..984a2ff --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h new file mode 120000 index 0000000..5f2ac3b --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h new file mode 120000 index 0000000..efe324e --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h new file mode 120000 index 0000000..c29f9ee --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h new file mode 120000 index 0000000..7451999 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h new file mode 120000 index 0000000..6363326 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h new file mode 120000 index 0000000..b827828 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h new file mode 120000 index 0000000..2d4e646 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h new file mode 120000 index 0000000..c981a56 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h new file mode 120000 index 0000000..e7e13b5 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h new file mode 120000 index 0000000..4314dbc --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h new file mode 120000 index 0000000..56b9ff9 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h new file mode 120000 index 0000000..8e28a21 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h new file mode 120000 index 0000000..c4a055e --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h new file mode 120000 index 0000000..b6d1c4f --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h new file mode 120000 index 0000000..4c43211 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h new file mode 120000 index 0000000..15eb00f --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h new file mode 120000 index 0000000..5d14f07 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h new file mode 120000 index 0000000..8e50e05 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h new file mode 120000 index 0000000..c44ae92 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h new file mode 120000 index 0000000..f8b1179 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h new file mode 120000 index 0000000..7882df5 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h new file mode 120000 index 0000000..30a0dd3 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h new file mode 120000 index 0000000..b025b98 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h new file mode 120000 index 0000000..54fbeba --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h new file mode 120000 index 0000000..1654e8c --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h new file mode 120000 index 0000000..5fe5d63 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h new file mode 120000 index 0000000..18a9aad --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h new file mode 120000 index 0000000..e649637 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h new file mode 120000 index 0000000..3485485 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h new file mode 120000 index 0000000..c11b781 --- /dev/null +++ b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h b/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h new file mode 120000 index 0000000..ac762c8 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h b/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h new file mode 120000 index 0000000..9dcc623 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h b/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h new file mode 120000 index 0000000..56feb9f --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPSessionManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h b/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 120000 index 0000000..67519d9 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h b/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h new file mode 120000 index 0000000..68fc774 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworkReachabilityManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFNetworking.h b/Pods/Headers/Public/AFNetworking/AFNetworking.h new file mode 120000 index 0000000..a5a38da --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h b/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h new file mode 120000 index 0000000..fd1322d --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFSecurityPolicy.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h b/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h new file mode 120000 index 0000000..d9b35fb --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLConnectionOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h b/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h new file mode 120000 index 0000000..ca8209b --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLRequestSerialization.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h b/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h new file mode 120000 index 0000000..e36a765 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLResponseSerialization.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h b/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h new file mode 120000 index 0000000..835101d --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLSessionManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 120000 index 0000000..c534ebf --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h new file mode 120000 index 0000000..f992813 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h new file mode 120000 index 0000000..8f2e221 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIImage+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIImage+AFNetworking.h new file mode 120000 index 0000000..74f6649 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIImage+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h new file mode 120000 index 0000000..a95d673 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h new file mode 120000 index 0000000..95017cc --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h new file mode 120000 index 0000000..730b167 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h new file mode 120000 index 0000000..8efd826 --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h b/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h new file mode 120000 index 0000000..c8df6ef --- /dev/null +++ b/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLink.h b/Pods/Headers/Public/Bolts/BFAppLink.h new file mode 120000 index 0000000..3f79bee --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLink.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLink.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkNavigation.h b/Pods/Headers/Public/Bolts/BFAppLinkNavigation.h new file mode 120000 index 0000000..6962356 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLinkNavigation.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkNavigation.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkResolving.h b/Pods/Headers/Public/Bolts/BFAppLinkResolving.h new file mode 120000 index 0000000..94cc66f --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLinkResolving.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkResolving.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h new file mode 120000 index 0000000..95067f0 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h new file mode 120000 index 0000000..cc00897 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView_Internal.h b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView_Internal.h new file mode 120000 index 0000000..fc68769 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkTarget.h b/Pods/Headers/Public/Bolts/BFAppLinkTarget.h new file mode 120000 index 0000000..90a41f6 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLinkTarget.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLinkTarget.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLink_Internal.h b/Pods/Headers/Public/Bolts/BFAppLink_Internal.h new file mode 120000 index 0000000..dc060b2 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFAppLink_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFAppLink_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFCancellationToken.h b/Pods/Headers/Public/Bolts/BFCancellationToken.h new file mode 120000 index 0000000..0b69486 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFCancellationToken.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFCancellationToken.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h b/Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h new file mode 120000 index 0000000..c587ca7 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFCancellationTokenRegistration.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFCancellationTokenSource.h b/Pods/Headers/Public/Bolts/BFCancellationTokenSource.h new file mode 120000 index 0000000..d3d5985 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFCancellationTokenSource.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFCancellationTokenSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFDefines.h b/Pods/Headers/Public/Bolts/BFDefines.h new file mode 120000 index 0000000..5df18ff --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFDefines.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFDefines.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFExecutor.h b/Pods/Headers/Public/Bolts/BFExecutor.h new file mode 120000 index 0000000..c071e8c --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFExecutor.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFExecutor.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFMeasurementEvent.h b/Pods/Headers/Public/Bolts/BFMeasurementEvent.h new file mode 120000 index 0000000..2eb6c11 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFMeasurementEvent.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFMeasurementEvent.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFMeasurementEvent_Internal.h b/Pods/Headers/Public/Bolts/BFMeasurementEvent_Internal.h new file mode 120000 index 0000000..98b7d06 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFMeasurementEvent_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFMeasurementEvent_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFTask.h b/Pods/Headers/Public/Bolts/BFTask.h new file mode 120000 index 0000000..5468334 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFTask.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFTask.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFTaskCompletionSource.h b/Pods/Headers/Public/Bolts/BFTaskCompletionSource.h new file mode 120000 index 0000000..c74760f --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFTaskCompletionSource.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BFTaskCompletionSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFURL.h b/Pods/Headers/Public/Bolts/BFURL.h new file mode 120000 index 0000000..df21bd9 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFURL.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFURL.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFURL_Internal.h b/Pods/Headers/Public/Bolts/BFURL_Internal.h new file mode 120000 index 0000000..3a5c5f4 --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFURL_Internal.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFURL_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h b/Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h new file mode 120000 index 0000000..bf250db --- /dev/null +++ b/Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/Bolts.h b/Pods/Headers/Public/Bolts/Bolts.h new file mode 120000 index 0000000..146ac6e --- /dev/null +++ b/Pods/Headers/Public/Bolts/Bolts.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/Bolts.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BoltsVersion.h b/Pods/Headers/Public/Bolts/BoltsVersion.h new file mode 120000 index 0000000..0fa0e2d --- /dev/null +++ b/Pods/Headers/Public/Bolts/BoltsVersion.h @@ -0,0 +1 @@ +../../../Bolts/Bolts/Common/BoltsVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h new file mode 120000 index 0000000..a5b3f97 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h new file mode 120000 index 0000000..95c1d00 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h new file mode 120000 index 0000000..69c20f5 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h new file mode 120000 index 0000000..fef519c --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h new file mode 120000 index 0000000..e163dc8 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h new file mode 120000 index 0000000..806ec62 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h new file mode 120000 index 0000000..4c08cc8 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h new file mode 120000 index 0000000..aa5dc1f --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h new file mode 120000 index 0000000..bfffe4f --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h new file mode 120000 index 0000000..6f019f6 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h new file mode 120000 index 0000000..524cb77 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h new file mode 120000 index 0000000..c6cbbfc --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h new file mode 120000 index 0000000..9960de2 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h new file mode 120000 index 0000000..f9059c1 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h new file mode 120000 index 0000000..40cf5f1 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h new file mode 120000 index 0000000..a9866b1 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h new file mode 120000 index 0000000..6f38799 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h new file mode 120000 index 0000000..7edc38f --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h new file mode 120000 index 0000000..5813f89 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h new file mode 120000 index 0000000..efbfaf1 --- /dev/null +++ b/Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h @@ -0,0 +1 @@ +../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h new file mode 120000 index 0000000..67d7080 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h new file mode 120000 index 0000000..0e81d04 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h new file mode 120000 index 0000000..32e79a7 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h new file mode 120000 index 0000000..61c47da --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h new file mode 120000 index 0000000..16f9d52 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h new file mode 120000 index 0000000..0a8ba29 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h new file mode 120000 index 0000000..3f7906b --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h new file mode 120000 index 0000000..1e9ecee --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h new file mode 120000 index 0000000..984a2ff --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h new file mode 120000 index 0000000..efe324e --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h new file mode 120000 index 0000000..c29f9ee --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h new file mode 120000 index 0000000..7451999 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h new file mode 120000 index 0000000..b827828 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h new file mode 120000 index 0000000..2d4e646 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h new file mode 120000 index 0000000..c981a56 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h new file mode 120000 index 0000000..e7e13b5 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h new file mode 120000 index 0000000..56b9ff9 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h new file mode 120000 index 0000000..8e28a21 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h new file mode 120000 index 0000000..4c43211 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h new file mode 120000 index 0000000..5d14f07 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h new file mode 120000 index 0000000..8e50e05 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h new file mode 120000 index 0000000..c44ae92 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h new file mode 120000 index 0000000..f8b1179 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h new file mode 120000 index 0000000..30a0dd3 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h new file mode 120000 index 0000000..b025b98 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h new file mode 120000 index 0000000..54fbeba --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h new file mode 120000 index 0000000..5fe5d63 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h new file mode 120000 index 0000000..18a9aad --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h new file mode 120000 index 0000000..e649637 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h new file mode 120000 index 0000000..3485485 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h new file mode 120000 index 0000000..c11b781 --- /dev/null +++ b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h @@ -0,0 +1 @@ +../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h \ No newline at end of file diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..ce85d2d --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,51 @@ +PODS: + - AFNetworking (2.6.1): + - AFNetworking/NSURLConnection (= 2.6.1) + - AFNetworking/NSURLSession (= 2.6.1) + - AFNetworking/Reachability (= 2.6.1) + - AFNetworking/Security (= 2.6.1) + - AFNetworking/Serialization (= 2.6.1) + - AFNetworking/UIKit (= 2.6.1) + - AFNetworking/NSURLConnection (2.6.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.6.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.6.1) + - AFNetworking/Security (2.6.1) + - AFNetworking/Serialization (2.6.1) + - AFNetworking/UIKit (2.6.1): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + - Bolts (1.3.0): + - Bolts/AppLinks (= 1.3.0) + - Bolts/Tasks (= 1.3.0) + - Bolts/AppLinks (1.3.0): + - Bolts/Tasks + - Bolts/Tasks (1.3.0) + - FBSDKCoreKit (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/arc (= 4.7.0) + - FBSDKCoreKit/no-arc (= 4.7.0) + - FBSDKCoreKit/arc (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/no-arc (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/arc + - FBSDKShareKit (4.7.0): + - FBSDKCoreKit + +DEPENDENCIES: + - AFNetworking (~> 2.6) + - FBSDKShareKit (~> 4.7) + +SPEC CHECKSUMS: + AFNetworking: 8e4e60500beb8bec644cf575beee72990a76d399 + Bolts: 805a4a87413e49d4a0c2b7d469084cbc46b09342 + FBSDKCoreKit: eb580bfc2040ad44f4c0b4f4d0befb1d35bce59c + FBSDKShareKit: 1f927bb05e4d36a99d5d5bf2f4b1ff294ce3e15c + +COCOAPODS: 0.39.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..84fb1bc --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,2193 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00163060B2D0C8870906DF0994834474 /* FBSDKBridgeAPIProtocolNativeV1.h in Headers */ = {isa = PBXBuildFile; fileRef = 8770E3F45D9D28E6808D3DA057AEFE1C /* FBSDKBridgeAPIProtocolNativeV1.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 012374FC7BF3C42864F8A6D9790C7836 /* BFExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = 01836F2CBF2A5A05ADFA09AE218FF214 /* BFExecutor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01A9C95FB174BF00024C127D94FAE9F9 /* FBSDKApplicationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E6B70CB24E9D9D440001D57E1A33C98 /* FBSDKApplicationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06CC5B30A43EF1C3B526DEE380D8FE8A /* BFCancellationToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BFA01E4E85363554DE20FA0E400E702 /* BFCancellationToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 07B38C643DE61100C2471A5E2061DB6D /* BFAppLink.m in Sources */ = {isa = PBXBuildFile; fileRef = D5B5EE23580C7EE674493EA966D9E152 /* BFAppLink.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 081F6FAFE0FC8BD6EFC6A517B0ADB614 /* FBSDKMessageDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 21C77DE090A2DBA387648130B7CD73FE /* FBSDKMessageDialog.m */; }; + 097CE360D698CD7CC46F59B370318ED1 /* FBSDKLiking.h in Headers */ = {isa = PBXBuildFile; fileRef = BBDE8D7E5224DD27717593F9568D736B /* FBSDKLiking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 097DE14824DA65BDF81E4C5A2D73566F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */; }; + 0A6A5BA0942FF096A2D641E8F49C0F79 /* FBSDKAppInviteContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C2A6EE9ED2159134298DE8AAABAFD9F /* FBSDKAppInviteContent.m */; }; + 0AAD3502C3D2BB1E3E7F4377C5111691 /* BFTaskCompletionSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 85F33B8AF603CD1A3169F25DDA70827E /* BFTaskCompletionSource.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 0BB5BE4B4A8C410F2248DE8D14BB4663 /* FBSDKGameRequestContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 40D5497F670A19328EE48A170A9601E7 /* FBSDKGameRequestContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C08BCEA5FE46370A36AEF6BEFCC41EA /* FBSDKAppEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D5BD492AACF346D740215BF393A42F0 /* FBSDKAppEvents.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0DB80F6F97A5BEB7A1839EBAF3FCA9AF /* FBSDKSendButton.h in Headers */ = {isa = PBXBuildFile; fileRef = DBC262389D86131D9D30610AB85E86F0 /* FBSDKSendButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E089188D74319CC3ED824652B776895 /* FBSDKLikeButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CD5B01679610DE9E10FB53B9B4FCFF8 /* FBSDKLikeButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0F8217A7033D4B1169408CA2DEBFA592 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */; }; + 1002547EB73320964BC1B10D757EAE2D /* FBSDKUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F3D2D0406EA2568E04C2651AE559235 /* FBSDKUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10B85E5BCE0729452FFC72D7BB376F59 /* FBSDKShareDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = ACE84033C653128CDBA05F32C9B118F6 /* FBSDKShareDialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12D4BF5F8785937DA809F9D90E6FB565 /* BFMeasurementEvent_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = DA1B570FD8EBBA84C4728B76B494D7D8 /* BFMeasurementEvent_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1345483A67FB02C778D2D3639930AED7 /* FBSDKBridgeAPIRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 69B4BAF446B6FBE961176084DB3DB55D /* FBSDKBridgeAPIRequest.m */; }; + 138917EC340B4D359138CD16C4383D1D /* FBSDKCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CD251398B9DE5770EC9C5F5CA1075CC /* FBSDKCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1540A63B0BF8B0C782AE91A5B67FEF38 /* BFAppLinkTarget.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D07C68A2E25033692F6E556B7CE9E6B /* BFAppLinkTarget.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 156967851249D30F7710773EC47EB1F3 /* FBSDKCoreKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3B4AA48D82F6B18B44186973A469E1 /* FBSDKCoreKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 16E3CEBF59A2D8E5A9B04AF979FDF14A /* FBSDKShareLinkContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 557C06B136ECB94CA516DA4CA88B7CB3 /* FBSDKShareLinkContent.m */; }; + 18C091723B432584B085686061A0CEE0 /* FBSDKShareOpenGraphValueContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 482C8D7185406E073AC038302D8DB73E /* FBSDKShareOpenGraphValueContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 18CF81105FB6E0685A26F83F128F4E47 /* FBSDKButton.m in Sources */ = {isa = PBXBuildFile; fileRef = DC4796735C12A93B95D67010D3896DDF /* FBSDKButton.m */; }; + 18D7A90C450EC893C4428E23D8B47E9F /* BFMeasurementEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = DF7B63028500BA56AC65151BF4686EC3 /* BFMeasurementEvent.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 18EAF4167A160D50758673E49250402C /* FBSDKAppGroupContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 511FCF3C5750F7F6CD3728CA06EBFA0A /* FBSDKAppGroupContent.m */; }; + 196864B89AC2C8A21D31595D9A7E05A0 /* BFCancellationTokenSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 344019E43C6A7FF9F2AEB23DFE905659 /* BFCancellationTokenSource.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 1AD36782B0606C9AB186A075420F1EA3 /* FBSDKShareUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = E88C8801AAF683626FD1F1A19E21B788 /* FBSDKShareUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1B732797EE1CF10C328DFDC742E866A6 /* FBSDKErrorRecoveryConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BF6D70AC2E104E4088407E9C2CD59FC /* FBSDKErrorRecoveryConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1BBA57EDDB94507AC5DAA85D6489D942 /* FBSDKAppGroupJoinDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F24229DAC68EAFE5C960C85D81C4881 /* FBSDKAppGroupJoinDialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1CBDB47B210A0C2448C14A610BC6D4D6 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62F62F695E15CD919E5DE760DFBE16FC /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D66DABAD4D2C36AAF8062BE3D55C7DB /* FBSDKTimeSpentData.m in Sources */ = {isa = PBXBuildFile; fileRef = CDDBEA1384A41C459CD9825355A75FA9 /* FBSDKTimeSpentData.m */; }; + 1D840EA09132B2B34413FA16BD0E1AA5 /* FBSDKApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F57EED0783FADB24B6109EF61CCD1DB1 /* FBSDKApplicationDelegate.m */; }; + 1DFA8E2E3190F5321761EE4BE95C9ADC /* FBSDKUIUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 33E79838EE7B2EED417A1C0408DF63CA /* FBSDKUIUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1E310D0CE3BE27EF253B6D822B0AEE5E /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 681B48FA09E393CDE89B1DEE5C65AFBA /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E8874FFFC0B19D20C001681F1942855 /* FBSDKShareAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A5E58E18C6F2A97D95380BEA2472FD2 /* FBSDKShareAPI.m */; }; + 1F2BB357DDF0A1CE916761ED5DBB98D2 /* FBSDKGraphRequestBody.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F52F6102FEDAEFA505CEF809314B9BD /* FBSDKGraphRequestBody.m */; }; + 205E1195DEF1603010BA47F3A8A39ACA /* FBSDKShareKit.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D91CD1D3BAAFA035B1F65ECE6D3791 /* FBSDKShareKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 20CA33378056E289649C0616BF5C5E08 /* FBSDKLikeBoxView.h in Headers */ = {isa = PBXBuildFile; fileRef = 872A8C33F24359B9BF74DEC4043BF40C /* FBSDKLikeBoxView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 210C00EF879DEDEA7EB09EC8C91A80A2 /* FBSDKSettings+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AA6E509E642D26DD297C87905B58D65 /* FBSDKSettings+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 211D4EA06F5920376A069ACB55DF6006 /* AFHTTPRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C1E87324285B5BB14E5D8C29E8ECED34 /* AFHTTPRequestOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 216D6126C206D951C489C95FD37BD8CF /* FBSDKAppEventsState.h in Headers */ = {isa = PBXBuildFile; fileRef = CB6C51F40B3416542CBFBF6D55B32E22 /* FBSDKAppEventsState.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 21E2ED6EFD8559848B98705909DEA010 /* FBSDKLikeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AD7A8F85D8F7188A06DF8A234636B04 /* FBSDKLikeDialog.m */; }; + 22080662EA8952370B284F798F16D4B2 /* FBSDKShareVideo.h in Headers */ = {isa = PBXBuildFile; fileRef = F5409B97F9D2EDFB9B38AFFD9173482D /* FBSDKShareVideo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 22E435D60724A7D16B950FC453C5E34C /* FBSDKConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 451845E88AA08B7394A5CB0105D07918 /* FBSDKConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 23F22339DEDBD778AB5D1DA13BFECC4F /* FBSDKGraphRequestMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A047409FA3546AD9B64533610C62FA1 /* FBSDKGraphRequestMetadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2453E44572F93FE8CFB1E9C2B07F8142 /* FBSDKInternalUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = EB01103EF88BDD2D63A48AB1B1029D95 /* FBSDKInternalUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 24FA587A203EB1838E92394C128065EA /* FBSDKSystemAccountStoreAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = FA61719DA40A89D49DB2CF2A54C509EB /* FBSDKSystemAccountStoreAdapter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 25435509864D8830160361E72AA5E31F /* FBSDKLogo.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F566A99D95B4CCDA3B38E3B6FF7F538 /* FBSDKLogo.m */; }; + 25C893D3F81918CA2748927B5F02A595 /* FBSDKBase64.m in Sources */ = {isa = PBXBuildFile; fileRef = D280713A1343A40C24E0C825EABA1CE0 /* FBSDKBase64.m */; }; + 2617C1651BDE360A04512FF5DFEE55B1 /* FBSDKMonotonicTime.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D16F303E935B275648EEBD42532800 /* FBSDKMonotonicTime.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 264457704BDD888C92CAAEBE20E709FC /* FBSDKTestUsersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 619453A302401BD0FF8424613BFEF1DC /* FBSDKTestUsersManager.m */; }; + 2763640E3F9F25BCE1BC36B60364A740 /* FBSDKSharePhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = B8B74CC909B2A7A9AD38F8130E2C902E /* FBSDKSharePhoto.m */; }; + 29E9B7D045DD5219B0D17A1289A1E228 /* FBSDKShareUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = A2666624A8562A06689715F06F8012A7 /* FBSDKShareUtility.m */; }; + 2A2484F1773729BB256973910B7340DB /* FBSDKAppEventsUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = F9961C4E64F5C3ACBBC54733669D0ECD /* FBSDKAppEventsUtility.m */; }; + 2A9CDB714501BF7551C376135E06CB77 /* FBSDKDynamicFrameworkLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = D1CE1F3E4858E2DEB082FB34A0666050 /* FBSDKDynamicFrameworkLoader.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2B8269A87473D9F1259E9BD98E7588D3 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = B0E9256C497CC7E961D15960DED14507 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B868B020F9C681F76C506EF6BC9A801 /* FBSDKSharePhotoContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C81562DB154359BC507ADD05074ABCE /* FBSDKSharePhotoContent.m */; }; + 2BFE426FBB2EF7A91EAC0893828A3F5C /* FBSDKShareKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A8B8938D737E489B9B045A09217963B /* FBSDKShareKit-dummy.m */; }; + 2CF66E8669A348C421E93F2F67C6A61E /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F0EC6D867BCE4FB94683D0E032A446B9 /* AFHTTPSessionManager.m */; }; + 2DC488DF3C90086C17087C2BB72189AA /* FBSDKMessengerIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = B76F6B60316A6F28FDBE4F090B96BFEA /* FBSDKMessengerIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2E87F7494BC2023ED83CCB2C93E67B69 /* FBSDKBridgeAPIProtocolWebV2.m in Sources */ = {isa = PBXBuildFile; fileRef = 09EA75F5375F5276D93A285AA47AE389 /* FBSDKBridgeAPIProtocolWebV2.m */; }; + 2F4C116B777496BAB15E7D6442D221BF /* FBSDKErrorConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4CC30B679BE94D4D58293805FE9558 /* FBSDKErrorConfiguration.m */; }; + 2FB0531893E490ACEC556B0F43C44591 /* FBSDKLikeActionControllerCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E110D8440D968D85B85E1012F110963 /* FBSDKLikeActionControllerCache.m */; }; + 2FBCC263A4CF83AF299AAC0CEE750AD6 /* BFURL.h in Headers */ = {isa = PBXBuildFile; fileRef = FAD3BF0B2A50192561F7681E8D426EA1 /* BFURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3033C63AC334D346E9461D0942D8FB69 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F9172376F742F18B5381BCD8C91A2A7F /* AFURLRequestSerialization.m */; }; + 3053488EEEBCD0385576315DBE9EC11E /* FBSDKCheckmarkIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF75AA840A717A63E0FFB5D14BC1BA0 /* FBSDKCheckmarkIcon.m */; }; + 307D54623092903A6C49A7C219BA3252 /* FBSDKMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = F018E05A0D968A32CF67ACD6172BFF26 /* FBSDKMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 31B7827480A2AD779C80D1E428F0F758 /* FBSDKKeychainStore.h in Headers */ = {isa = PBXBuildFile; fileRef = B21A583F9BA43A147842E4686672A494 /* FBSDKKeychainStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 336B220F124974D444746D194367422A /* BFAppLink_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 814C603402CCB04BEBE0B38DB0AEB3C1 /* BFAppLink_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 33808782CCEF801D53209D523D9C7358 /* FBSDKButton+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = 57AE7F29419866F38B816BA54F3E2AEE /* FBSDKButton+Subclass.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 33E51CF359A60B9BF66BE9C279AB3E43 /* FBSDKAccessTokenCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CCB8D9AB6370A14BB4101EFD06CCCF3 /* FBSDKAccessTokenCache.m */; }; + 34B1786FA4EBC179AC660B83CF1A4F82 /* FBSDKShareButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 65D72F75D591A90F405EECAC26B5DF62 /* FBSDKShareButton.m */; }; + 34FE928299E6FCBB43826BDB66144FD7 /* FBSDKLikeObjectType.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F32EA195D4638DC3E88E5E6F1E7C60 /* FBSDKLikeObjectType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35599C4F9F10FC09064011AE354E20C5 /* FBSDKCheckmarkIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = E01BB74E43EBC6E579F4E9BE2168AF46 /* FBSDKCheckmarkIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 361A366D11CECA15C3B45FC3ACEDA050 /* FBSDKGraphRequestDataAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = BD7AB9C8CE4F7FAC4AA9C21B6436D171 /* FBSDKGraphRequestDataAttachment.m */; }; + 392F1056919E38CEDEB5A545DA4C820B /* FBSDKLogo.h in Headers */ = {isa = PBXBuildFile; fileRef = AE6725846D1148F2B93BA63A67BE928F /* FBSDKLogo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 399AC825EE10F70364CE7B0AA89F466D /* UIAlertView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = D3A6188717A7865C7CDC5E6B9E4C2974 /* UIAlertView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3A5B54373A45916EC8DE74D060DE5503 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 17BAAFC7EF54937CB6A4A7CECADEF0E9 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B34B9CF9A34E235FD457006303C757D /* FBSDKErrorRecoveryConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = E7EACD97913E41CA60721A3FF33C300B /* FBSDKErrorRecoveryConfiguration.m */; }; + 3B88684885F6A92894F9B1C6DF2CB127 /* FBSDKAppEventsDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 50614433F202CEBD51842BCD0B610E3C /* FBSDKAppEventsDeviceInfo.m */; }; + 3C0DEBB740DFB646BB292668FF187A3C /* FBSDKCloseIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B9629D41F3CB0D6362C249BAEF4DD8B /* FBSDKCloseIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3C31ED01B7466FD05173FEB6F86953BA /* FBSDKTestUsersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 92CEBE36EDFA59A8301F37FB767E221F /* FBSDKTestUsersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C6DF2FA1EA6BE60192A77E7270D6212 /* FBSDKGameRequestFrictionlessRecipientCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C1B665940C6E872D3C4F9F45C1584D5E /* FBSDKGameRequestFrictionlessRecipientCache.m */; }; + 3DDFA2D0FCEE1978143B685D1C3A9D7A /* FBSDKLikeControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 35799F882BCB00E2D1F8D25E72BD40DD /* FBSDKLikeControl.m */; }; + 3E16E0BEF69F5BA97F8E9F07A617E509 /* FBSDKAccessTokenCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3552DB6CD22B9C8E75785855D5F15E89 /* FBSDKAccessTokenCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3F7A18D123E044CFAC2A0D1322E727BF /* FBSDKShareOpenGraphObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E82EF3A27D2B4D98EE687DC6AC6AF9F4 /* FBSDKShareOpenGraphObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4029E4F75B527907B5ADAD8E3E0264E2 /* FBSDKGraphRequestPiggybackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DCA84971ACA835D473FF3670D6AAA225 /* FBSDKGraphRequestPiggybackManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 41CCAB61BAA581E58CB30F56F9F372F4 /* FBSDKGraphRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A3748CB4300C1D9F5D42C93D6D1C714 /* FBSDKGraphRequest.m */; }; + 41DDB4BD2A89F44F733C82B65BE76ACA /* FBSDKKeychainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C7B45749F7EE5706D0A4AECC8BBEB46E /* FBSDKKeychainStore.m */; }; + 42F787E07A69C27C09E049303C8E8530 /* FBSDKServerConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = AF20D633640B12C177853252FA9BB984 /* FBSDKServerConfiguration.m */; }; + 435602DE03BDC37F6F724BE3A943F1AB /* FBSDKSharePhotoContent.h in Headers */ = {isa = PBXBuildFile; fileRef = A045BB8B22C09E49B724B38DE65AD3FF /* FBSDKSharePhotoContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43A7D7D1E2E0828AC2FCD3155471E59E /* BoltsVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C06A80244BAE195E0EB1D4F62CD476 /* BoltsVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4426214315E4D8313D27EE3F16CF8C13 /* BFURL.m in Sources */ = {isa = PBXBuildFile; fileRef = EFC55F0B619CEB0B97C3C235D50AF2D5 /* BFURL.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 444F2DDB714D8D83F59764F223E6EE70 /* FBSDKServerConfigurationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 7244A1F4E39D1B861FF0A42E44C9D4C4 /* FBSDKServerConfigurationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4458C6C127D3030A17A791B3BA9A0CE0 /* FBSDKShareConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = C8AA61E15065B666BC54CDE7CC210EE1 /* FBSDKShareConstants.m */; }; + 44731A7D10EF496E7DED3DCA05410767 /* FBSDKShareDialogMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 186052602EB811A441DB131C622C903A /* FBSDKShareDialogMode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4505527808576A44D861B0A13154F425 /* FBSDKURLOpening.h in Headers */ = {isa = PBXBuildFile; fileRef = 73E6858AE5F915455C51828D993A9722 /* FBSDKURLOpening.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4508BEB10E935ADE1BBC8AD18BB3F581 /* Bolts.h in Headers */ = {isa = PBXBuildFile; fileRef = 26357E64513F91968E51C27F13425B58 /* Bolts.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4727F1C349747A7F96CA2EE6098BA7E6 /* FBSDKBridgeAPICrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6E8F49344E0EB40DC229A33DD637A0 /* FBSDKBridgeAPICrypto.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 472A6BFCC6207D98F787649BDF44A1BE /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D0B7B0085DFF6689C0EAC6D60B9034D /* AFHTTPRequestOperationManager.m */; }; + 488F77FF13E79A72AD87E8B838E827E4 /* FBSDKShareOpenGraphAction.h in Headers */ = {isa = PBXBuildFile; fileRef = B33D72933F04FA071C1E7E2DED768752 /* FBSDKShareOpenGraphAction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 495F717651B12E6496C72D16BCC28C29 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 32B4541137A20F243E9B1AA7F4CD999B /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 49A306F39FCE73FFB0E1A6589D331F35 /* BFAppLinkResolving.h in Headers */ = {isa = PBXBuildFile; fileRef = 2487D8C937C94995243E585E43469CE2 /* BFAppLinkResolving.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A4CF9C7D69DC9049FD677165FADA59E /* FBSDKShareDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 3388639DA75D2D412F6D40C2FDC14322 /* FBSDKShareDialog.m */; }; + 4A7FBB52488D368CFDFDB1B6516C2CE4 /* FBSDKMessengerIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 019C4125D19F0A03512DE346B5EE7279 /* FBSDKMessengerIcon.m */; }; + 4BC610C052636A802256616F808FD2AE /* FBSDKAccessTokenCacheV3_21.m in Sources */ = {isa = PBXBuildFile; fileRef = 71211E63A3051A65351D0631AC91E68F /* FBSDKAccessTokenCacheV3_21.m */; }; + 4E5A7BE76B5EC309DAB207FAFB7FE7FC /* FBSDKSharing.h in Headers */ = {isa = PBXBuildFile; fileRef = D090AB018AA204B9A85FEB742D9D1B66 /* FBSDKSharing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EC1B8AAA4341E02B888E2CDBED626DD /* FBSDKApplicationDelegate+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A9EB4606ECF9DBA06957513B48B2199 /* FBSDKApplicationDelegate+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 50570F0F317C5A916AD5BE1D82F49641 /* FBSDKGraphRequestDataAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 237F169830057CBFED7527C1B12827F1 /* FBSDKGraphRequestDataAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51F742896037EA588D6157B105922B77 /* FBSDKShareOpenGraphValueContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F80A56E649ED7ABA711D267EE68079 /* FBSDKShareOpenGraphValueContainer.m */; }; + 5208CEE9E04A230A895075F81179E9C0 /* BFWebViewAppLinkResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 16889DB82DB0951456DD4E5C94BDE9F6 /* BFWebViewAppLinkResolver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52474B3F869DBA64CC57CC8E1031F87B /* FBSDKSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DFC4532E3E61D37A013015223C842C1 /* FBSDKSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 530AC824CCD371BAA717F8ACAB33F958 /* FBSDKAccessToken.h in Headers */ = {isa = PBXBuildFile; fileRef = E879DEF720F6075AFEC24C1F2310C5DE /* FBSDKAccessToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5449D946ADE982013F5C2069E0BE45F0 /* BFAppLinkTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 30FDA5553C084D8F7CBC4B5053FD198D /* BFAppLinkTarget.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 54D559AFA627AFA735FB0D6D878F5D7F /* FBSDKAppInviteContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F5F3B038391B03B7AFC79B8FCE01E3 /* FBSDKAppInviteContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 555466B7EA6454B1E1968FB7A7BD1334 /* FBSDKBoltsMeasurementEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = C354EAF888944E5583C78F3BA0725666 /* FBSDKBoltsMeasurementEventListener.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 57503516957EEFAFFAD7A789730E7B9C /* FBSDKShareVideoContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 622FE43EF2CDE47C167B385D664605FA /* FBSDKShareVideoContent.m */; }; + 578485DD86226126B8E08842D826D2DC /* FBSDKWebDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = E787ECD99234F0177D0C154074233A9B /* FBSDKWebDialog.m */; }; + 587ED101545A953414998ABFA4479B5D /* FBSDKContainerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB80277705A405E45FC321621F25720 /* FBSDKContainerViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 58F4A4DF57C22014622BB042607EB8EE /* BFAppLinkNavigation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6996D4A4A081BCD46AC6805E66BC88EF /* BFAppLinkNavigation.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 591FE63D036F4A539784293BCAD97493 /* FBSDKGraphRequestMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 8683F956D11B266E5AC2EEE8FE623B5B /* FBSDKGraphRequestMetadata.m */; }; + 5A1CB5B72C92E43BF844377DC72DA072 /* FBSDKAppGroupContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B9259909AA0735B04AA702F158F553D /* FBSDKAppGroupContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5AF64E5EEA043722E238A8C5EE47A63A /* BFAppLinkReturnToRefererView_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EEF01D1B3F7F6B77F33A3D9A0BFABA4 /* BFAppLinkReturnToRefererView_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5CF0E043147B69E77976A2CCADFF18CA /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EC6A6AB602095141AC0E4DC5009D0163 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5E1AB8EC72407D7A56EE8074AC99F4AC /* FBSDKTypeUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 39B917A93A505CB3B7C1CDA2E4AD9133 /* FBSDKTypeUtility.m */; }; + 5F2CF6350F306F78D40161C01EEDD731 /* FBSDKMutableCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = F13CAFC013EC2759ECDC78375FBE5546 /* FBSDKMutableCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5FCA3879482A03418CCB75CE50EEA9C1 /* FBSDKLikeButtonPopWAV.h in Headers */ = {isa = PBXBuildFile; fileRef = 93ABAFAC2462AF3375B097DE8390ADE2 /* FBSDKLikeButtonPopWAV.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 60F370DA778C2C58337885BA2E21047C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */; }; + 61BCC6DAB9276D969FCC0F848B69DB86 /* FBSDKMaleSilhouetteIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = D189CD6E7022F5E3795253EB16E31B44 /* FBSDKMaleSilhouetteIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 62DDEB5456833B4AD3A84F7AADBE9099 /* FBSDKGraphRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D4279B24F97345021312F957E499D0A6 /* FBSDKGraphRequest+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 634D85A94A89FB79C887AEB085DECA60 /* Bolts-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0040CD74A9FEE0F9D432DE52EECF89 /* Bolts-dummy.m */; }; + 64BD30EF98CC4A38D8BF92656D4A6AD0 /* FBSDKShareButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E99299396BCFBC6832C2249D4E851BC1 /* FBSDKShareButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 67F789F4A32CA7A82DE43CD27AEA87BD /* FBSDKBridgeAPIRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82D411AF1F45945F96A6086C66B03BDB /* FBSDKBridgeAPIRequest.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 69F828062553D0A5623207630EB9FB21 /* FBSDKUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = E089A4EC1B9A49BB7EF108F65091CB80 /* FBSDKUtility.m */; }; + 6B00AF25CFB12372D5281D7B9D51E3E2 /* FBSDKProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F5C2286E5E866A99ADCB9BDCD47193 /* FBSDKProfile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C6B44FB16E5ABD292E2D77D89DDFF32 /* FBSDKCloseIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 71FD8339B436644656B46AF2800569A3 /* FBSDKCloseIcon.m */; }; + 6CC4B79C1FEE1E7B3F2860ADA479D381 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D09418454A8A965CBE2790A329C5645 /* AFURLSessionManager.m */; }; + 6D2E47E46AED98D49CD7E1D7DCA449B3 /* BFTaskCompletionSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 97932698D8DFBACB494F81AA6F55DA3A /* BFTaskCompletionSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EA031F1089FBD5D7E5DACD68EDC2F5A /* FBSDKShareLinkContent+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A0DF096288204256BA664820E1A820 /* FBSDKShareLinkContent+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6F5BB8563523FEB8914557A0C379361F /* FBSDKAccessTokenCaching.h in Headers */ = {isa = PBXBuildFile; fileRef = 502A084BF003C1444C64E0BF9CB6EDE1 /* FBSDKAccessTokenCaching.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7051CE40FD16869F0BF9CD028A658782 /* FBSDKCoreKit+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C57B7083C6C0CD398E81F06426E9B5C /* FBSDKCoreKit+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7171DEAFC5A2F780E670B8395EF8F07B /* BFDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = A57815DCE354EDF3506D212E155D5E3A /* BFDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72DDA136310E1878B3393479B38B83F9 /* FBSDKURLConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 117616DCAF25DE7F8762F5811B575C08 /* FBSDKURLConnection.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 73518A8EAF46D85112E2CB85D02BF9C0 /* FBSDKCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = EF7F31B4CFDDB34FE09B69309E94BEBE /* FBSDKCrypto.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 74B1B04C2705C12FDA25D308C6F8F669 /* FBSDKAppEvents.m in Sources */ = {isa = PBXBuildFile; fileRef = B2FB269417A53A47EA02D735AB2B648E /* FBSDKAppEvents.m */; }; + 74D22BA7DDF7C44219CE3E793CE0AC6F /* FBSDKGameRequestDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E62053FFC7CBC0B8DBB6F4117470B15 /* FBSDKGameRequestDialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7569FD90D7667E15A7B67B62E4A72E5D /* FBSDKTriStateBOOL.h in Headers */ = {isa = PBXBuildFile; fileRef = 58D29DEBEC40D2D91FD9317FAAE2676F /* FBSDKTriStateBOOL.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 76EACBDAB632DF356DEB855DD97A09A6 /* FBSDKSharePhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D931456CA6CE772593D8847739A7868 /* FBSDKSharePhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 774E19492156820F5CC848D34D9AA4A6 /* FBSDKLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B200546211F4DEBAA824FCCB1D6B5AD /* FBSDKLogger.m */; }; + 77B5397CB9EB225E9C0BB7318B12E949 /* FBSDKBridgeAPICrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 4713CC066D5B38EB6FF939A23C5FB140 /* FBSDKBridgeAPICrypto.m */; }; + 77CF177F2CDC9BEBEF5BE1DD296E1E2C /* FBSDKErrorRecoveryAttempter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FA4FA3CA61B6466B77AFF7E7AC93C7B /* FBSDKErrorRecoveryAttempter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 78449FCC01114171AA3CCB45C6666206 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C60D55377287604B0959CAFD0140C75 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78952ACEF38C155ADF7CA3B63C38A5E6 /* FBSDKProfilePictureView.h in Headers */ = {isa = PBXBuildFile; fileRef = F2865B9A148712BD8A7876B34F00E8B0 /* FBSDKProfilePictureView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 796EC3DD53C2C28010D03E1E323A1DDB /* FBSDKLikeButtonPopWAV.m in Sources */ = {isa = PBXBuildFile; fileRef = 376A0BE5E5AEABC84DB6E92BE0DCCEF6 /* FBSDKLikeButtonPopWAV.m */; }; + 7A11240D567F7A3207F0F9882ED2AB75 /* _FBSDKTemporaryErrorRecoveryAttempter.h in Headers */ = {isa = PBXBuildFile; fileRef = F1CA1FF4409BDC377E68687D11F7033A /* _FBSDKTemporaryErrorRecoveryAttempter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7B38759EF062D9FF703E7D297DAB27E6 /* FBSDKLikeControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 01CD4F30BE0D4FECD106A3350A907E25 /* FBSDKLikeControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7CE53AEEEB82A1729F0A343B85F1FA7E /* FBSDKAppLinkResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 491456B665E9DA86DADB7373E06684B3 /* FBSDKAppLinkResolver.m */; }; + 7F35603B737B2A4B465CAE4B481C34BB /* FBSDKGraphErrorRecoveryProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C2D52447D3617C4435BBC9C23299611 /* FBSDKGraphErrorRecoveryProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80511BB81FC091E526BECA78607C0FC2 /* BFMeasurementEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = F580B4FA66804A8EE1DD91EAE8415277 /* BFMeasurementEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8071A999E075ED48380A5AAACDA0E0E9 /* FBSDKGameRequestContent.m in Sources */ = {isa = PBXBuildFile; fileRef = B4234D36B7E267CE0C5DBB7FC188C95C /* FBSDKGameRequestContent.m */; }; + 809C53B31BE1AC40886B82DFD238136D /* FBSDKBridgeAPIProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CEECC794A146848AE89A375494E23B9 /* FBSDKBridgeAPIProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 81A2A1E607483054B4C595CA92987E08 /* FBSDKAudioResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B12F9655AC33B77EA212845EC5197DA /* FBSDKAudioResourceLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 82360B32AC1B887E85DC592D62CB046F /* FBSDKSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 63588F04E1066D4FF9F51E6660A9AC8D /* FBSDKSettings.m */; }; + 827A9685D68B9BD092DD85970625C1F2 /* FBSDKShareDialogMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AA908FC7B7A735FE7D401D5B65BFCA8 /* FBSDKShareDialogMode.m */; }; + 8392255CCB63818562D4F58555DDDB08 /* FBSDKColor.m in Sources */ = {isa = PBXBuildFile; fileRef = AED7C066E630477FC67F9C998362AAB5 /* FBSDKColor.m */; }; + 83C5AD87D4B7BF94A4B000FC4C254798 /* FBSDKMaleSilhouetteIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = ECBBA43BD2613AD7F55AE39385F989BF /* FBSDKMaleSilhouetteIcon.m */; }; + 85030A540670174CA31F4F4226C54C4F /* FBSDKAccessTokenCacheV3_17.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AD63CD75E9A0FDE40A72D11D0E391D2 /* FBSDKAccessTokenCacheV3_17.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 854BC4449D8CAD0F2799B021D1914C3B /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 605AC8C10AAA019E78C4407F29E422DB /* UIRefreshControl+AFNetworking.m */; }; + 86444AC2A924F63C45BEC54A0DDB7E8E /* FBSDKBridgeAPIProtocolNativeV1.m in Sources */ = {isa = PBXBuildFile; fileRef = 59246A2C66033C4BACBB0005E7E2BBBD /* FBSDKBridgeAPIProtocolNativeV1.m */; }; + 876C2EF5FE318346CDCB4BFE25A9D5B2 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 964E98DB49EDC3B31D82F3BBCD5E514C /* AFHTTPRequestOperation.m */; }; + 87E208C4BC2E8A5C74E1D01087F195FF /* FBSDKMessageDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C5C8DA98DCECDD589CFD4A9DAF2C662 /* FBSDKMessageDialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 899C1F6FEAF906667F0E67D51EDA44FD /* FBSDKWebDialogView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B4E083908C5DC414BBCC49C85B2C648 /* FBSDKWebDialogView.m */; }; + 89E9143B078C3D9D56CDA6BE3AAA16D3 /* FBSDKTimeSpentData.h in Headers */ = {isa = PBXBuildFile; fileRef = DC4D1B53E565D3099084E5803F62D86B /* FBSDKTimeSpentData.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8AF36C0CC65E3A5D7AF4AEA8BEA5F8DD /* FBSDKShareKit+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D95E6FDA2D10FD860C64D7EB686B6348 /* FBSDKShareKit+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8C66B8A503EE7CDAF2C8B843D7839113 /* FBSDKGameRequestDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = B8542D3CF7CEE2D9AA1647A5F6EBBFCE /* FBSDKGameRequestDialog.m */; }; + 8CDAFE25429AD7F8885827F293890076 /* FBSDKGraphErrorRecoveryProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D86AF0FCC38E65C93DA09276FF4ECE0 /* FBSDKGraphErrorRecoveryProcessor.m */; }; + 8D9641967C1ACD51CE3ACACF1B1D2860 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */; }; + 8D9E418F4BF4FF9ABF3F4E5932589C3D /* FBSDKBoltsMeasurementEventListener.m in Sources */ = {isa = PBXBuildFile; fileRef = 89E7DB57536C56FAC42F394738CA2311 /* FBSDKBoltsMeasurementEventListener.m */; }; + 8E3F310FB34E020A985BF37D34582619 /* FBSDKKeychainStoreViaBundleID.h in Headers */ = {isa = PBXBuildFile; fileRef = 62395CA9230E642A74C75E7BC54689FA /* FBSDKKeychainStoreViaBundleID.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 903A0E1F82A29D285902CBB5A0828BE9 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EAF235F0554DD9B769F3F848A38DD1B /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 905D0A5FE23B08D47AA9AB3F584B626D /* FBSDKContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B83478E98F3E802D34B1A388407E05B0 /* FBSDKContainerViewController.m */; }; + 90F2175480DE7324ADEEF602757134D7 /* FBSDKBridgeAPIRequest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ABDD0F86776A326D3DFCF22DD6175A6 /* FBSDKBridgeAPIRequest+Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 924D2586BFCD36A807E0E047454317A8 /* FBSDKServerConfiguration+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E1ED945F691785269DE32DE62A3E72D /* FBSDKServerConfiguration+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 926F1FF1ADA93F8BE4339C7AE28BD968 /* FBSDKButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 55FB332B435E1E90DE6742055E91ACAC /* FBSDKButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92D14F626066984B8740E9484071B7C1 /* FBSDKGameRequestFrictionlessRecipientCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 10EDFC8DE37B8D5DAD245062B9420869 /* FBSDKGameRequestFrictionlessRecipientCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 949F1878AC4A43632EFADACFC8140683 /* FBSDKGraphRequestBody.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A5D9071C6C412E36472C5F19DAAC178 /* FBSDKGraphRequestBody.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 96E1FE094390E35BE4E0D715675C16B0 /* BFAppLinkNavigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E3BF8F324C012ECB14CF54C1279F64C /* BFAppLinkNavigation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97996933B25E24DAF9D18F8E188B03CA /* FBSDKMath.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D6D458393B733BC6EA8DC2777E8A172 /* FBSDKMath.m */; }; + 98350E1EE789CEB57D91ADF6F225D62E /* FBSDKShareError.m in Sources */ = {isa = PBXBuildFile; fileRef = C4008AE978714C2939117D47D770EAAA /* FBSDKShareError.m */; }; + 99E82D6DC032555656E37AF2367B20D3 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 849DBE9A96F80DBB5149CE3F9522356A /* UIButton+AFNetworking.m */; }; + 9A04E971065AF4281E43947994A53D07 /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = A0CB4C8273D5ED9A15D9D5E43C79AA87 /* UIWebView+AFNetworking.m */; }; + 9AB561BA236CB930E21B38DE886155A6 /* FBSDKViewImpressionTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = B7D9A45BC1932C60309FB30832E435D0 /* FBSDKViewImpressionTracker.m */; }; + 9B47A1441B897F71505D8BE670B0940B /* UIAlertView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C63272E74DFFA3CCDDC5DE14E0A0310 /* UIAlertView+AFNetworking.m */; }; + 9B516F3168787E2C9732AC0C00479971 /* FBSDKAppLinkResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F3ECD653E76F1AB4851DCF2B8D601F3 /* FBSDKAppLinkResolver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B7B596E21B20063D8870D27F93990BF /* FBSDKAccessTokenCacheV3.m in Sources */ = {isa = PBXBuildFile; fileRef = F9CB53CDDE68E68176FDF6DDEF6575C4 /* FBSDKAccessTokenCacheV3.m */; }; + 9D1E20F07E1C09F60E2F35F6119A0F42 /* FBSDKError.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C56B3E5B5068C0ABEC2C0105D19F910 /* FBSDKError.m */; }; + 9E1DFD298D2638A443CF2EA5B47BFC51 /* FBSDKCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = E8091747ED012950E38E4FD3C2BADD49 /* FBSDKCrypto.m */; }; + 9EF32C9762B79DF6386F46170BC63CFD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */; }; + 9EFC61F27D88241A96D3FB13EF831E02 /* FBSDKProfile+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE333A8F39A243535D21286A772F09B /* FBSDKProfile+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9F3D3656F5864DED6AF668D1AB68975E /* FBSDKGraphRequestConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = A334906C1281DD4C315FFEEA1ECB14DD /* FBSDKGraphRequestConnection.m */; }; + A0F75CBE72EE4F9B74838F6F01191D06 /* BFAppLinkReturnToRefererView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9786F4E6C8BC376227E52C3606CFDCCB /* BFAppLinkReturnToRefererView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + A161B6BDF507ABF1322BB74A9D437D4B /* FBSDKShareError.h in Headers */ = {isa = PBXBuildFile; fileRef = 942F6F6C77996401AB990F23374234C9 /* FBSDKShareError.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A18206D679C80B4AFF6654B5677DBFDB /* FBSDKInternalUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 398DEB86D597B8C3B2654B6E997FF90A /* FBSDKInternalUtility.m */; }; + A1FCC931AC4A1A8D148E28C4572BB307 /* FBSDKShareDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C43111C27DDA6A45D700E4964BC1BFD /* FBSDKShareDefines.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A248810839C65E5881B7B7B3F264078F /* FBSDKBridgeAPIProtocolWebV1.h in Headers */ = {isa = PBXBuildFile; fileRef = CC2C004066771DC458B8D3EDC130B0D9 /* FBSDKBridgeAPIProtocolWebV1.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A28588D1CCB5253CF80509F30A1AF1A5 /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AEC190845E7BC9C364549267A08BDD1 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A31552A8B1F14534DDBA1DFC4E09C195 /* FBSDKShareOpenGraphContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CCECB75018C831ECC6167EFBFAD25C0 /* FBSDKShareOpenGraphContent.m */; }; + A4AA61EF4E7E175383F829835B3690B6 /* FBSDKCoreKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA9B1BFDBFB83B26C0CDD3F7BED9A4C6 /* FBSDKCoreKit-dummy.m */; }; + A4EE8D1BEE38B87066BAA1B09A047356 /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 970121E059FA826E3FE6EA9708D0D535 /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A55D4E06A15BD0D7189518E2B96DB8A3 /* FBSDKWebDialogView.h in Headers */ = {isa = PBXBuildFile; fileRef = CD70059B9065BEA37C71F253919DA723 /* FBSDKWebDialogView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A5E23287231B8CED31D97C44BA2702F9 /* FBSDKGraphRequestConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 44EBDEC66EB767895CA3F95522A427ED /* FBSDKGraphRequestConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A661008071892B0148336A0636FC59A1 /* FBSDKIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FBBE57B5789B844685BF7008B31D2C8 /* FBSDKIcon.m */; }; + A6D8B881BC31F26E99F56A4B5144F72D /* FBSDKAppEventsDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 16ADD761D2DE6CCEF7AC9E77E566B496 /* FBSDKAppEventsDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A72805273E466C273A4B10C6ACB993AA /* FBSDKShareAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 8329EC43C296112416EFCA120DBF47DA /* FBSDKShareAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9821C932984F979E72D5984C1E3A87E /* FBSDKIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F39F0B74294A1DFCDF5F565086D5ECC /* FBSDKIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A9D01434F1CFFFF1277E3429A43FA1C0 /* FBSDKAppEventsStateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D637D586849D95210171B7314E16B819 /* FBSDKAppEventsStateManager.m */; }; + AB7CAA7D0CB1D37DB84BF83644CF6E41 /* FBSDKAppEventsUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 816BF555AFEE3CD3AE12100B131A83F0 /* FBSDKAppEventsUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AB8D18ED889E13CC5F738DD1A59CC510 /* FBSDKGraphRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 79FFD024B17DCE13D082CD95D00FE966 /* FBSDKGraphRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AE279B6C3893C1BB12A7D761A8F70EA1 /* FBSDKError.h in Headers */ = {isa = PBXBuildFile; fileRef = 96A85F8F12895068432B3C50F55B32DF /* FBSDKError.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AE607E682415FAA160B33C7C13A8475B /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D1807557C9540D45C2BE8983801328 /* UIActivityIndicatorView+AFNetworking.m */; }; + B12AD2EE044D6F7424F75F1506B516B2 /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9973CF7402B4BEBC2177DD8FFDC4A246 /* AFSecurityPolicy.m */; }; + B17336576943ADD8ABE250E808D8B72D /* FBSDKAppInviteDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 215A384B0288A0E296EDF086D07D6775 /* FBSDKAppInviteDialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1B5542A3966742AC81F380E955AA85B /* BFAppLinkReturnToRefererController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AEE34A3234F5521D3DD1990BCAB7129 /* BFAppLinkReturnToRefererController.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + B220008A1D3DD1B6628E2AC2A64A02AA /* FBSDKShareConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = C0F56DF3DE892E2F69B2A05670573456 /* FBSDKShareConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B25E3751AB01594311494F5E9AFC5322 /* FBSDKLikeDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = C32DEAD26534788790CD79C9EED0DD7B /* FBSDKLikeDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B28E7BE90D0898F34164A3649D16E978 /* FBSDKLikeObjectType.m in Sources */ = {isa = PBXBuildFile; fileRef = 74E3A51689EE33380E0E6D49AB75E3EA /* FBSDKLikeObjectType.m */; }; + B2B5DEC33B644F946C59F656AAAA8146 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF8C0DC6F01F77FB80CACDA326D9088F /* AFNetworkActivityIndicatorManager.m */; }; + B2C7E9065BD6BF8E3F3017B802865B56 /* FBSDKAccessTokenCacheV3.h in Headers */ = {isa = PBXBuildFile; fileRef = BA74722B7C68275BF230E648AC2F9EB2 /* FBSDKAccessTokenCacheV3.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B4035BD0031BD154E70AF698B10B48A7 /* FBSDKSendButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D7DBF26EAC60AC8145109B1287B7BB9B /* FBSDKSendButton.m */; }; + B68EF6DB36966D13E557D2247702E8C5 /* BFExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D6E1BF2FFD5BFBE698182F936C97B36 /* BFExecutor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + B84F69EEEA9898307D85749FD54502D0 /* FBSDKLikeActionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 062DC1459AC8AB2EC471B2D75A99089C /* FBSDKLikeActionController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B9DAA002CF3E0E8EBE9B6E9A7778CFD4 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C89E18861C33DBD02440A0236BABF441 /* AFNetworking-dummy.m */; }; + BA025A85A850C1E24A6C92F4C29E5531 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C168D5DBDB78691493E24B13EF6B6A8 /* SystemConfiguration.framework */; }; + BAF2CCC3F6782690F1534565B877278F /* FBSDKShareOpenGraphAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 90DAB60A732E4D9944A9E2CC0A597C8B /* FBSDKShareOpenGraphAction.m */; }; + BB1151A40AE6E5AA064A5AAC684EEF46 /* _FBSDKTemporaryErrorRecoveryAttempter.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C9E110C906DE6A77B7966080430AE8C /* _FBSDKTemporaryErrorRecoveryAttempter.m */; }; + BC7993B7436D4D7FADE6DD554DA52769 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EE6EFFCB4E4F4E60D14688C458E4FFC /* AFNetworkReachabilityManager.m */; }; + BC852E5C003C0E1C337D9C642F826513 /* FBSDKAppLinkUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 282B10273E830454869FB2DD72DA1655 /* FBSDKAppLinkUtility.m */; }; + BE0F6955D03D6DF536335CAC10A8CFC5 /* FBSDKAccessTokenCacheV3_21.h in Headers */ = {isa = PBXBuildFile; fileRef = 37D3094280BB79203F20BAD8FFE4AF8E /* FBSDKAccessTokenCacheV3_21.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BFAAE2E16A1F2007BD7CDF1DB8D2CDAD /* FBSDKAudioResourceLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 085F39BE5F3501C0FA67900013CBF413 /* FBSDKAudioResourceLoader.m */; }; + C0C7A1E73D584A4F93A286FA1753D5B1 /* FBSDKBridgeAPIProtocolWebV1.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF9C07CEE3BAA7ACAA4121D8FD81090 /* FBSDKBridgeAPIProtocolWebV1.m */; }; + C412C0A9241FD8CB88314EB3BD8E528C /* FBSDKWebDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = F3E4562D9905FCC1AFDD3E97DF4EB4D7 /* FBSDKWebDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C50BE142E604DE751E9B8AF5DD6B0363 /* FBSDKShareLinkContent.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4FE2BD24A106BA7261B9C4E322CBDE /* FBSDKShareLinkContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C58268D5A4D2A786576E0EAA5B50FB93 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 96085863967A021E0FF0ABDB20B02404 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7ACDDE36465ACAF629FEC233B1BF172 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F67FFB2A96EADAC53137E0DAF8DF3325 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7DCD67DF808CAC96CFFB404088D2CC5 /* FBSDKLikeActionControllerCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F6530E74EB6BE09CE289556ABF90140 /* FBSDKLikeActionControllerCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C8A8F4BE07EDC15A6921CD68990C0F98 /* FBSDKBridgeAPIResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D148ED4CEEB4A77740DB46CB8EBAD10 /* FBSDKBridgeAPIResponse.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C8E9B871537B5C88280E56A9778803A4 /* FBSDKAppEventsStateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2600A152E768DAD7797AFFBB9D45F03D /* FBSDKAppEventsStateManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C95B6FEA0DB3899E1F52C07D40DD4DA0 /* FBSDKDialogConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 717A2F909F9429472BE5288181A39CAB /* FBSDKDialogConfiguration.m */; }; + CA0A64C7187BFF5B6143C3D3A7FF8D94 /* FBSDKAppEvents+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = B986B60BD6445564D539745478FB987F /* FBSDKAppEvents+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CAA0F8074B35A2F73890310EC4521A0D /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 91E280AFCF4EB3736BA672DFDBFE4823 /* AFURLResponseSerialization.m */; }; + CB7A2EB58EBA82B7CE519F8C2EEAFBC4 /* FBSDKAccessTokenCacheV4.h in Headers */ = {isa = PBXBuildFile; fileRef = B54068342B71382F8BE19A8D9AAF9D85 /* FBSDKAccessTokenCacheV4.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CBC28D34E7E02B4E254099B15B674080 /* BFAppLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 307E586C9913BA331DF82B237461D24A /* BFAppLink.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CEF61BB75902C8E0148259A5DF63854E /* FBSDKAppInviteDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 78F1A4FA45E81AD337FA996B2AD8248C /* FBSDKAppInviteDialog.m */; }; + CF49B64886C0C73CE0EB0549FA20E21F /* FBSDKDynamicFrameworkLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D7D9D759A3D05CE84BBEDB5164C1F62 /* FBSDKDynamicFrameworkLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CF6A6DAB258596DF234FDDA9F2B214CF /* BFURL_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 93EEA8D94E4FA7FC25984FF3A4152CE8 /* BFURL_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CFFAEE251FC130E14DF2831B504F748D /* FBSDKAppGroupJoinDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = F183F2FB92C2EBC307921CE4906D5E98 /* FBSDKAppGroupJoinDialog.m */; }; + D070B784EFCA099C141EEAB69FBCC870 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CFB570F5447DD07FF5C658096CF5277 /* UIImageView+AFNetworking.m */; }; + D183B6B66F20B85A64F5B7603D0A473B /* FBSDKDialogConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 701EE70CD1027D551948BCACB19AEFC4 /* FBSDKDialogConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D1F17C848BA03A0D38CC8D8B815B75C8 /* FBSDKMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 18C289A6473A9A83C76CB08E0EE722B9 /* FBSDKMath.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D2C8A050CA49DB3967B01D9B9354FC16 /* FBSDKViewImpressionTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DCA73ECDED4D24D157E854B9A0153B /* FBSDKViewImpressionTracker.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D3CBA0C9A2F20A2AE8D9E8FA5F2326DA /* FBSDKKeychainStoreViaBundleID.m in Sources */ = {isa = PBXBuildFile; fileRef = 447BA83039BC3B92739CE7121BFFF508 /* FBSDKKeychainStoreViaBundleID.m */; }; + D4163483905F3CE49898DD8AAC0E0910 /* FBSDKAccessTokenCacheV3_17.m in Sources */ = {isa = PBXBuildFile; fileRef = AE36EBEAB6C1036E035A370DFF99A78A /* FBSDKAccessTokenCacheV3_17.m */; }; + D42A66A100E6AAB6AF472659973366E4 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 272643F56613CA0D336AE3DBF19DC404 /* Pods-dummy.m */; }; + D466AEB0B97EDC9663AFFD5F94C04630 /* FBSDKErrorRecoveryAttempter.m in Sources */ = {isa = PBXBuildFile; fileRef = B301B0B70E4E90079DD84F26918D4A8E /* FBSDKErrorRecoveryAttempter.m */; }; + D4A65C2E29ACB340587FD41196176F8A /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = FB3DD0DADAF8A63EB2A098F05C214D80 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D5EE317B7D0E35A376DF8328CEA3252B /* FBSDKAccessToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 28ADB7EAC9BC3C79D90FA2B7AD9491DF /* FBSDKAccessToken.m */; }; + D6B9D996B48B90EB489E54CDC7A9D401 /* BFTask.m in Sources */ = {isa = PBXBuildFile; fileRef = C0842CC84848AD64C6605B3413ED3306 /* BFTask.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D963CE53920E664E9CAD6F4B834B315C /* BFAppLinkReturnToRefererController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AA407824AFEB2AEEFFC68DF4DCEB3CF /* BFAppLinkReturnToRefererController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D97FDB91BBA6D010CA658A611FC4A9A1 /* FBSDKSystemAccountStoreAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = E335A77A6371CE3ADE026F58C0F17DF9 /* FBSDKSystemAccountStoreAdapter.m */; }; + DA880A2094CF94108583D78E4097D554 /* FBSDKAppGroupAddDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 39CA63DD851C05AE2EEB3219A8E40C4A /* FBSDKAppGroupAddDialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA96A28C136407B16A3F0C70656042AF /* FBSDKProfilePictureView.m in Sources */ = {isa = PBXBuildFile; fileRef = B21836A56CDDE5818D5D5F4F27AAD2E4 /* FBSDKProfilePictureView.m */; }; + DB2E92A71137AD2E6993E8B0CE682C89 /* AFURLConnectionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 620E2E07AFE6686E018575828ED8822D /* AFURLConnectionOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB42C604EF2F39D542F805AC6A05E090 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2B240D99C3FC6A7DC6C66A2434CA799 /* MobileCoreServices.framework */; }; + DCF16A999DCFC281A8744148B305482C /* FBSDKServerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 7989F275C86B2744E752EA3F99644B69 /* FBSDKServerConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DDAB1F17EC68C8B719BA8C80FB5DC317 /* FBSDKURLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BC594D9F8C42BF6978F73806E64FE2A /* FBSDKURLConnection.m */; }; + DE479B83E277F9913E9A6CBE17BD6B3E /* FBSDKAppGroupAddDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = EDEF09081B568F083D3EB0052DF71A24 /* FBSDKAppGroupAddDialog.m */; }; + DECD5915774351B8473476B041DD87D7 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FCBCFB66D3AF0BC63DD6482811A4ECB6 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E03421EE59E06D90EC9F0E07B93E1C2D /* FBSDKColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 971AE23BDE3CC034036AF3A5F3F40D78 /* FBSDKColor.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E0EAD57AC8EA4C3510C04CDDC9A28DE6 /* FBSDKBridgeAPIProtocolWebV2.h in Headers */ = {isa = PBXBuildFile; fileRef = 742779FECE16D8BA7466B48D50CE5E0B /* FBSDKBridgeAPIProtocolWebV2.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E10A2574E0EE99F47BC9CAC0AF33FC47 /* FBSDKAppLinkUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B52A085A3D62B3FF73FE55CABC473E5 /* FBSDKAppLinkUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E159EF1028A9794B189D47DD79C6A0CC /* FBSDKAccessTokenCacheV4.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F36036E90F38D20ECF2351FE6EDF11 /* FBSDKAccessTokenCacheV4.m */; }; + E15B9B510B4BFB5AAF2F8BFAC5EBC997 /* BFCancellationTokenRegistration.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A36356EA8459872F233FC4A5B6CB0C6 /* BFCancellationTokenRegistration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E19528B349AA57299BED8F28FFCDB92D /* FBSDKErrorConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 174F96153183FD58339BF7605DB524E5 /* FBSDKErrorConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E2D2F28DE8D25857A0143D0C99E1264C /* FBSDKShareOpenGraphContent.h in Headers */ = {isa = PBXBuildFile; fileRef = AFB9BEA809D5D095C99DCFD78BCF052B /* FBSDKShareOpenGraphContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E30BD9620B97DF000E8F31104048D432 /* FBSDKServerConfigurationManager+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = E3E6A108F38043D568733C03E5086DCA /* FBSDKServerConfigurationManager+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E346D04E3F0539B358C1194F02FB8809 /* FBSDKLikeButton+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D9C76FDCCC2AFC799E7C3167BC40640F /* FBSDKLikeButton+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E347F996B822D8480FF7B718185C46DD /* BFAppLinkReturnToRefererView.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F63D4C0244188DD5FEC301B489F240 /* BFAppLinkReturnToRefererView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E35FADAE8EF72A1419545CEE70610D27 /* FBSDKPaymentObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = B88AC3BD80A2ADD4F09E7A69AA5CA86F /* FBSDKPaymentObserver.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E461DC7FBE41300801EE6D160AE29860 /* FBSDKServerConfigurationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DD895E7DE10E3155FAA2894548F53B61 /* FBSDKServerConfigurationManager.m */; }; + E47D4E86203EFA7643A44E5109117967 /* FBSDKGraphRequestConnection+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 61D0077F67E9EFDC756CA1B826348CD6 /* FBSDKGraphRequestConnection+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E497F7EAC903A7C28D8CC1FD0D90CCDF /* FBSDKConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 55BAC2DB8986680BC30B5DD9041668B9 /* FBSDKConstants.m */; }; + E571D44B22235633760C6FB955906D99 /* FBSDKShareVideo.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B02BF6C38D852E3C8237A93B97A7B6 /* FBSDKShareVideo.m */; }; + E6D6A687F8FD1088F5EBB283308B0DC2 /* FBSDKGraphRequestPiggybackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C6F3BE3D5D0F4E92B3674A6C9C4049D2 /* FBSDKGraphRequestPiggybackManager.m */; }; + E6DD6ABB4FC13B60FA54C950FB6B262B /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 95DD0397FFC1322F252353AC0480B0F1 /* AFURLConnectionOperation.m */; }; + E7AC21B4D847D0F421132DCD478589F6 /* FBSDKBridgeAPIProtocolType.h in Headers */ = {isa = PBXBuildFile; fileRef = BD6F5FD84D870265A3054285625A8016 /* FBSDKBridgeAPIProtocolType.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E81433D0931C25789180EA53A62C940E /* FBSDKBridgeAPIResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E02D79E34E3DFF6FD8715DBEDF0320 /* FBSDKBridgeAPIResponse.m */; }; + E97B61F439BAE5B0BC4AE0382AF6E4B3 /* FBSDKPaymentObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD1C7B81FEE0AFF6A976EEB2B41D997 /* FBSDKPaymentObserver.m */; }; + E9BBD9ED8781DB4B08B9A35068B2E0D9 /* FBSDKSharingButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 787F6CD1CF33863E666B1398D4FA7844 /* FBSDKSharingButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA3208DE2E2A3C5B240A0C832A77DDCF /* FBSDKTriStateBOOL.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B910FEA04E93A550E336CD0AE37263 /* FBSDKTriStateBOOL.m */; }; + EBB6F0BB04FCFC82D12723EF3E740261 /* FBSDKLikeControl+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 657185599E8EBD605362D33E630303CD /* FBSDKLikeControl+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EBE1D926D326775167E082772E23D000 /* FBSDKShareOpenGraphObject.m in Sources */ = {isa = PBXBuildFile; fileRef = F7D7016519D25AA92F3FEFB94DC358FF /* FBSDKShareOpenGraphObject.m */; }; + EC5F8395D48ED1C0BE2C2D7EB7D9F4B9 /* BFTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B456D6651F811DF3185A02F4ADDB616 /* BFTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC7025C98AE47F5E2D9CBEA4AC041890 /* Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = C2330FD7D0E371C9B8679FDA53BC1A17 /* Bolts.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + EDB2BA3AEA3A7A4EC735BAF9804D75D4 /* FBSDKShareVideoContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 78F5FC2AE25B0CF79B83822C186DC996 /* FBSDKShareVideoContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE76A64B08255C079A379BC77864B85F /* FBSDKProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 70546F79ED989A805A363C6D952F1767 /* FBSDKProfile.m */; }; + EED88C9780961006A6F988AFECD7BED3 /* FBSDKLikeBoxBorderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 379DFF64A1CC405BF431D6BCEEF0BFC0 /* FBSDKLikeBoxBorderView.m */; }; + F08E19D8B440D85D564273B1A501B1FC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57F2B5E013FD1D42752E768761E043FC /* CoreGraphics.framework */; }; + F10CE2BA1CE785FB8EC2CE0595A7FBBE /* FBSDKLikeActionController.m in Sources */ = {isa = PBXBuildFile; fileRef = A73E06FFD2AEC3D6D8E87E74A22CE225 /* FBSDKLikeActionController.m */; }; + F1B80D56445F494B2F82BB577E4CB42A /* FBSDKShareOpenGraphValueContainer+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = E1B2EDB370766CCDF13A6AE75B49C55A /* FBSDKShareOpenGraphValueContainer+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F2614C38AA4BB27104AD7BAB99E2BDD3 /* FBSDKSharingContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EF317520E764E89AA7EF99C5196A2C9 /* FBSDKSharingContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2AF56F00E313B9CD0F4ADA3C5D73BDF /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A19DF616941A51576DD057A9FD8F4AD8 /* Security.framework */; }; + F48F08F807C465B2DC535CE521E66D97 /* FBSDKLikeBoxBorderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 635C518CBB0C52FCC123DF27A287BB5E /* FBSDKLikeBoxBorderView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F4A1512E8C4D8C8194CBB276BF72A552 /* AFHTTPRequestOperationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EAB66AE62D66F78EACA78373B48630FD /* AFHTTPRequestOperationManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F4B03681047157E5C357E584147F5A46 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = D87A74F5FE003D6FB5AF70863732E5C9 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F4DCBA2A42A38C6E7A755182DA50DEA2 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 11F566261D795BD0772871AAC0C7A196 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F4F96AF7AC5C83FA96E172128610B1F2 /* FBSDKBase64.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E355D3496070355652064869DD32661 /* FBSDKBase64.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F50BE85096146332D4C00C17546561DA /* BFCancellationToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 173AD07497467EB2CE6F078E62156181 /* BFCancellationToken.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F6C1716F0805EA68532FF09E380B40D7 /* BFWebViewAppLinkResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = A6F9B575406DB39396C02616631889BB /* BFWebViewAppLinkResolver.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F7E42776080FF0BDBE07365A2AFE2834 /* FBSDKLikeBoxView.m in Sources */ = {isa = PBXBuildFile; fileRef = 484EF6885EB0A6D83FBBC5B4DB016C38 /* FBSDKLikeBoxView.m */; }; + F9198070ED60C8E1F3AF0910B05EA446 /* FBSDKLikeButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 28AE686AF4D4A27CA0AD6C6A854F9EA0 /* FBSDKLikeButton.m */; }; + FA27E23894DFC2F77A0EA14C2D1A3DD4 /* FBSDKMonotonicTime.m in Sources */ = {isa = PBXBuildFile; fileRef = 958123A39C74BFB5B42758653A99EF03 /* FBSDKMonotonicTime.m */; }; + FB9237E38009CB01D2D2BC136D5924B7 /* BFCancellationTokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A81CBDBA497DB3045953FAD61DAC11C7 /* BFCancellationTokenSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FCDC22BD5A90775000A728831060EDCC /* BFCancellationTokenRegistration.m in Sources */ = {isa = PBXBuildFile; fileRef = DBBEEB167D7BE32668BD7D69B8CB73E0 /* BFCancellationTokenRegistration.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + FD6F966F458CEE40B07A2367BA3BC8EC /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 45B852719FC1E2E22521633C20BFD642 /* UIProgressView+AFNetworking.m */; }; + FDF39F9BC888D9146BC087518C89A8F6 /* FBSDKTypeUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = A48FF8279FC537A0D479881CE0382475 /* FBSDKTypeUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FEAB4AF7F2C57BDEFD6081038CFD20FB /* FBSDKLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 00C82D45FC8F798DB5BBBD21B9B8F4DC /* FBSDKLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FF6C07931C151FAE59F3FB55F032AF23 /* FBSDKAppEventsState.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4D614389C6B8EBE493619F413EAA4 /* FBSDKAppEventsState.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1BD9E4E1851B054D16E88E72186755AA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A48601FEE4437A924848DB48369BA809; + remoteInfo = Bolts; + }; + 4344EF62FB5DFF627E06D3834642E63F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 410B25DF16EA5C5B3E2698F74F9625FB; + remoteInfo = AFNetworking; + }; + 5F9ACE740BBE74B9EF18ED10D402EBFB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A48601FEE4437A924848DB48369BA809; + remoteInfo = Bolts; + }; + 665C00EDA998F3310E3AA1D64A0AC160 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 81D7FE2A0FD9258247B1232874B837DA; + remoteInfo = FBSDKCoreKit; + }; + B05D26F76A7077C30E0DCB99776E075A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C78CAB9013653EB1A250B2DFD3BC7666; + remoteInfo = FBSDKShareKit; + }; + F2525FB3B5405DC4B1BAF37F01F4D2AB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 81D7FE2A0FD9258247B1232874B837DA; + remoteInfo = FBSDKCoreKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00C82D45FC8F798DB5BBBD21B9B8F4DC /* FBSDKLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLogger.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h; sourceTree = ""; }; + 01836F2CBF2A5A05ADFA09AE218FF214 /* BFExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFExecutor.h; path = Bolts/Common/BFExecutor.h; sourceTree = ""; }; + 019C4125D19F0A03512DE346B5EE7279 /* FBSDKMessengerIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMessengerIcon.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m; sourceTree = ""; }; + 01CD4F30BE0D4FECD106A3350A907E25 /* FBSDKLikeControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeControl.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h; sourceTree = ""; }; + 062DC1459AC8AB2EC471B2D75A99089C /* FBSDKLikeActionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeActionController.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h; sourceTree = ""; }; + 085F39BE5F3501C0FA67900013CBF413 /* FBSDKAudioResourceLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAudioResourceLoader.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m; sourceTree = ""; }; + 08C06A80244BAE195E0EB1D4F62CD476 /* BoltsVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BoltsVersion.h; path = Bolts/Common/BoltsVersion.h; sourceTree = ""; }; + 09EA75F5375F5276D93A285AA47AE389 /* FBSDKBridgeAPIProtocolWebV2.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIProtocolWebV2.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m; sourceTree = ""; }; + 0AEC190845E7BC9C364549267A08BDD1 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + 0B200546211F4DEBAA824FCCB1D6B5AD /* FBSDKLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLogger.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m; sourceTree = ""; }; + 0B456D6651F811DF3185A02F4ADDB616 /* BFTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTask.h; path = Bolts/Common/BFTask.h; sourceTree = ""; }; + 0B4E083908C5DC414BBCC49C85B2C648 /* FBSDKWebDialogView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKWebDialogView.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m; sourceTree = ""; }; + 0BFA01E4E85363554DE20FA0E400E702 /* BFCancellationToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationToken.h; path = Bolts/Common/BFCancellationToken.h; sourceTree = ""; }; + 0C56B3E5B5068C0ABEC2C0105D19F910 /* FBSDKError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKError.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m; sourceTree = ""; }; + 0C81562DB154359BC507ADD05074ABCE /* FBSDKSharePhotoContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSharePhotoContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m; sourceTree = ""; }; + 0CCECB75018C831ECC6167EFBFAD25C0 /* FBSDKShareOpenGraphContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m; sourceTree = ""; }; + 0D931456CA6CE772593D8847739A7868 /* FBSDKSharePhoto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharePhoto.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h; sourceTree = ""; }; + 0E62053FFC7CBC0B8DBB6F4117470B15 /* FBSDKGameRequestDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGameRequestDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h; sourceTree = ""; }; + 0F3ECD653E76F1AB4851DCF2B8D601F3 /* FBSDKAppLinkResolver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppLinkResolver.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h; sourceTree = ""; }; + 10834806BD7B412BC24F347361FA2C8E /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; + 10EDFC8DE37B8D5DAD245062B9420869 /* FBSDKGameRequestFrictionlessRecipientCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGameRequestFrictionlessRecipientCache.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h; sourceTree = ""; }; + 117616DCAF25DE7F8762F5811B575C08 /* FBSDKURLConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKURLConnection.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h; sourceTree = ""; }; + 11F566261D795BD0772871AAC0C7A196 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; + 14BB886B52CE8890301B019E94AFCFBC /* FBSDKShareKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSDKShareKit.xcconfig; sourceTree = ""; }; + 14F63D4C0244188DD5FEC301B489F240 /* BFAppLinkReturnToRefererView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkReturnToRefererView.h; path = Bolts/iOS/BFAppLinkReturnToRefererView.h; sourceTree = ""; }; + 16889DB82DB0951456DD4E5C94BDE9F6 /* BFWebViewAppLinkResolver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFWebViewAppLinkResolver.h; path = Bolts/iOS/BFWebViewAppLinkResolver.h; sourceTree = ""; }; + 16ADD761D2DE6CCEF7AC9E77E566B496 /* FBSDKAppEventsDeviceInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsDeviceInfo.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h; sourceTree = ""; }; + 173AD07497467EB2CE6F078E62156181 /* BFCancellationToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationToken.m; path = Bolts/Common/BFCancellationToken.m; sourceTree = ""; }; + 174F96153183FD58339BF7605DB524E5 /* FBSDKErrorConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKErrorConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h; sourceTree = ""; }; + 17BAAFC7EF54937CB6A4A7CECADEF0E9 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; + 186052602EB811A441DB131C622C903A /* FBSDKShareDialogMode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareDialogMode.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h; sourceTree = ""; }; + 18C289A6473A9A83C76CB08E0EE722B9 /* FBSDKMath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMath.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h; sourceTree = ""; }; + 18D1807557C9540D45C2BE8983801328 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + 1C2D52447D3617C4435BBC9C23299611 /* FBSDKGraphErrorRecoveryProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphErrorRecoveryProcessor.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h; sourceTree = ""; }; + 1CD251398B9DE5770EC9C5F5CA1075CC /* FBSDKCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCopying.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h; sourceTree = ""; }; + 1EAF235F0554DD9B769F3F848A38DD1B /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; + 1F3B4AA48D82F6B18B44186973A469E1 /* FBSDKCoreKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCoreKit.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h; sourceTree = ""; }; + 1F52F6102FEDAEFA505CEF809314B9BD /* FBSDKGraphRequestBody.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestBody.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m; sourceTree = ""; }; + 215A384B0288A0E296EDF086D07D6775 /* FBSDKAppInviteDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppInviteDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h; sourceTree = ""; }; + 21C77DE090A2DBA387648130B7CD73FE /* FBSDKMessageDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMessageDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m; sourceTree = ""; }; + 2250337F1EA2F90F41D343A24E9D8D64 /* libAFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAFNetworking.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 237F169830057CBFED7527C1B12827F1 /* FBSDKGraphRequestDataAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestDataAttachment.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h; sourceTree = ""; }; + 2487D8C937C94995243E585E43469CE2 /* BFAppLinkResolving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkResolving.h; path = Bolts/iOS/BFAppLinkResolving.h; sourceTree = ""; }; + 2600A152E768DAD7797AFFBB9D45F03D /* FBSDKAppEventsStateManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsStateManager.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h; sourceTree = ""; }; + 26357E64513F91968E51C27F13425B58 /* Bolts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Bolts.h; path = Bolts/Common/Bolts.h; sourceTree = ""; }; + 26B094E3F3FE334849DF9622936BDE41 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 272643F56613CA0D336AE3DBF19DC404 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; + 282B10273E830454869FB2DD72DA1655 /* FBSDKAppLinkUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppLinkUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m; sourceTree = ""; }; + 28ADB7EAC9BC3C79D90FA2B7AD9491DF /* FBSDKAccessToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessToken.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m; sourceTree = ""; }; + 28AE686AF4D4A27CA0AD6C6A854F9EA0 /* FBSDKLikeButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m; sourceTree = ""; }; + 2AA908FC7B7A735FE7D401D5B65BFCA8 /* FBSDKShareDialogMode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareDialogMode.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m; sourceTree = ""; }; + 2B52A085A3D62B3FF73FE55CABC473E5 /* FBSDKAppLinkUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppLinkUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h; sourceTree = ""; }; + 2BF6D70AC2E104E4088407E9C2CD59FC /* FBSDKErrorRecoveryConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKErrorRecoveryConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h; sourceTree = ""; }; + 2C2A6EE9ED2159134298DE8AAABAFD9F /* FBSDKAppInviteContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppInviteContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m; sourceTree = ""; }; + 2C43111C27DDA6A45D700E4964BC1BFD /* FBSDKShareDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareDefines.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h; sourceTree = ""; }; + 2CD5B01679610DE9E10FB53B9B4FCFF8 /* FBSDKLikeButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h; sourceTree = ""; }; + 2F24229DAC68EAFE5C960C85D81C4881 /* FBSDKAppGroupJoinDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppGroupJoinDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h; sourceTree = ""; }; + 2F39F0B74294A1DFCDF5F565086D5ECC /* FBSDKIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKIcon.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h; sourceTree = ""; }; + 2FA4FA3CA61B6466B77AFF7E7AC93C7B /* FBSDKErrorRecoveryAttempter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKErrorRecoveryAttempter.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h; sourceTree = ""; }; + 307E586C9913BA331DF82B237461D24A /* BFAppLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLink.h; path = Bolts/iOS/BFAppLink.h; sourceTree = ""; }; + 30F32EA195D4638DC3E88E5E6F1E7C60 /* FBSDKLikeObjectType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeObjectType.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h; sourceTree = ""; }; + 30FDA5553C084D8F7CBC4B5053FD198D /* BFAppLinkTarget.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkTarget.h; path = Bolts/iOS/BFAppLinkTarget.h; sourceTree = ""; }; + 32B4541137A20F243E9B1AA7F4CD999B /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; + 3388639DA75D2D412F6D40C2FDC14322 /* FBSDKShareDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m; sourceTree = ""; }; + 33E79838EE7B2EED417A1C0408DF63CA /* FBSDKUIUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKUIUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h; sourceTree = ""; }; + 344019E43C6A7FF9F2AEB23DFE905659 /* BFCancellationTokenSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenSource.m; path = Bolts/Common/BFCancellationTokenSource.m; sourceTree = ""; }; + 3552DB6CD22B9C8E75785855D5F15E89 /* FBSDKAccessTokenCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCache.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h; sourceTree = ""; }; + 35799F882BCB00E2D1F8D25E72BD40DD /* FBSDKLikeControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeControl.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m; sourceTree = ""; }; + 376A0BE5E5AEABC84DB6E92BE0DCCEF6 /* FBSDKLikeButtonPopWAV.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeButtonPopWAV.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m; sourceTree = ""; }; + 379DFF64A1CC405BF431D6BCEEF0BFC0 /* FBSDKLikeBoxBorderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeBoxBorderView.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m; sourceTree = ""; }; + 37D3094280BB79203F20BAD8FFE4AF8E /* FBSDKAccessTokenCacheV3_21.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV3_21.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h; sourceTree = ""; }; + 37DB56D75062CC75FCB0966E1C6E8A8E /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; + 398DEB86D597B8C3B2654B6E997FF90A /* FBSDKInternalUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKInternalUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m; sourceTree = ""; }; + 39B917A93A505CB3B7C1CDA2E4AD9133 /* FBSDKTypeUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTypeUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m; sourceTree = ""; }; + 39CA63DD851C05AE2EEB3219A8E40C4A /* FBSDKAppGroupAddDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppGroupAddDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h; sourceTree = ""; }; + 3A3748CB4300C1D9F5D42C93D6D1C714 /* FBSDKGraphRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequest.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m; sourceTree = ""; }; + 3A5E58E18C6F2A97D95380BEA2472FD2 /* FBSDKShareAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareAPI.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m; sourceTree = ""; }; + 3A672A669918D7E198D40138A23D21B0 /* FBSDKCoreKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSDKCoreKit-prefix.pch"; sourceTree = ""; }; + 3AA6E509E642D26DD297C87905B58D65 /* FBSDKSettings+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKSettings+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h"; sourceTree = ""; }; + 3AD63CD75E9A0FDE40A72D11D0E391D2 /* FBSDKAccessTokenCacheV3_17.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV3_17.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h; sourceTree = ""; }; + 3B12F9655AC33B77EA212845EC5197DA /* FBSDKAudioResourceLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAudioResourceLoader.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h; sourceTree = ""; }; + 3B9629D41F3CB0D6362C249BAEF4DD8B /* FBSDKCloseIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCloseIcon.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h; sourceTree = ""; }; + 3C57B7083C6C0CD398E81F06426E9B5C /* FBSDKCoreKit+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKCoreKit+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h"; sourceTree = ""; }; + 3C63272E74DFFA3CCDDC5DE14E0A0310 /* UIAlertView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertView+AFNetworking.m"; path = "UIKit+AFNetworking/UIAlertView+AFNetworking.m"; sourceTree = ""; }; + 3DFC4532E3E61D37A013015223C842C1 /* FBSDKSettings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSettings.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h; sourceTree = ""; }; + 3E1ED945F691785269DE32DE62A3E72D /* FBSDKServerConfiguration+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKServerConfiguration+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h"; sourceTree = ""; }; + 3E355D3496070355652064869DD32661 /* FBSDKBase64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBase64.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h; sourceTree = ""; }; + 3E3BF8F324C012ECB14CF54C1279F64C /* BFAppLinkNavigation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkNavigation.h; path = Bolts/iOS/BFAppLinkNavigation.h; sourceTree = ""; }; + 40D5497F670A19328EE48A170A9601E7 /* FBSDKGameRequestContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGameRequestContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h; sourceTree = ""; }; + 43F80A56E649ED7ABA711D267EE68079 /* FBSDKShareOpenGraphValueContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphValueContainer.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m; sourceTree = ""; }; + 447BA83039BC3B92739CE7121BFFF508 /* FBSDKKeychainStoreViaBundleID.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKKeychainStoreViaBundleID.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m; sourceTree = ""; }; + 44EBDEC66EB767895CA3F95522A427ED /* FBSDKGraphRequestConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestConnection.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h; sourceTree = ""; }; + 451845E88AA08B7394A5CB0105D07918 /* FBSDKConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKConstants.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h; sourceTree = ""; }; + 45B852719FC1E2E22521633C20BFD642 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; + 4713CC066D5B38EB6FF939A23C5FB140 /* FBSDKBridgeAPICrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPICrypto.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m; sourceTree = ""; }; + 482C8D7185406E073AC038302D8DB73E /* FBSDKShareOpenGraphValueContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphValueContainer.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h; sourceTree = ""; }; + 484EF6885EB0A6D83FBBC5B4DB016C38 /* FBSDKLikeBoxView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeBoxView.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m; sourceTree = ""; }; + 491456B665E9DA86DADB7373E06684B3 /* FBSDKAppLinkResolver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppLinkResolver.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m; sourceTree = ""; }; + 4A047409FA3546AD9B64533610C62FA1 /* FBSDKGraphRequestMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestMetadata.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h; sourceTree = ""; }; + 4A36356EA8459872F233FC4A5B6CB0C6 /* BFCancellationTokenRegistration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenRegistration.h; path = Bolts/Common/BFCancellationTokenRegistration.h; sourceTree = ""; }; + 4A5D9071C6C412E36472C5F19DAAC178 /* FBSDKGraphRequestBody.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestBody.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h; sourceTree = ""; }; + 4B9259909AA0735B04AA702F158F553D /* FBSDKAppGroupContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppGroupContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h; sourceTree = ""; }; + 4C4CC30B679BE94D4D58293805FE9558 /* FBSDKErrorConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKErrorConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m; sourceTree = ""; }; + 4CD1C7B81FEE0AFF6A976EEB2B41D997 /* FBSDKPaymentObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKPaymentObserver.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m; sourceTree = ""; }; + 4D6E1BF2FFD5BFBE698182F936C97B36 /* BFExecutor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFExecutor.m; path = Bolts/Common/BFExecutor.m; sourceTree = ""; }; + 4E0040CD74A9FEE0F9D432DE52EECF89 /* Bolts-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Bolts-dummy.m"; sourceTree = ""; }; + 4E762F23EC34ED4A6FF3312D84E33A40 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; + 4F3D2D0406EA2568E04C2651AE559235 /* FBSDKUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h; sourceTree = ""; }; + 4FBBE57B5789B844685BF7008B31D2C8 /* FBSDKIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKIcon.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m; sourceTree = ""; }; + 502A084BF003C1444C64E0BF9CB6EDE1 /* FBSDKAccessTokenCaching.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCaching.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h; sourceTree = ""; }; + 50614433F202CEBD51842BCD0B610E3C /* FBSDKAppEventsDeviceInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsDeviceInfo.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m; sourceTree = ""; }; + 511FCF3C5750F7F6CD3728CA06EBFA0A /* FBSDKAppGroupContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppGroupContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m; sourceTree = ""; }; + 5372D999245395E50C3D972BC275C238 /* FBSDKCoreKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSDKCoreKit.xcconfig; sourceTree = ""; }; + 557C06B136ECB94CA516DA4CA88B7CB3 /* FBSDKShareLinkContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareLinkContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m; sourceTree = ""; }; + 55BAC2DB8986680BC30B5DD9041668B9 /* FBSDKConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKConstants.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m; sourceTree = ""; }; + 55FB332B435E1E90DE6742055E91ACAC /* FBSDKButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKButton.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h; sourceTree = ""; }; + 57AE7F29419866F38B816BA54F3E2AEE /* FBSDKButton+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKButton+Subclass.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h"; sourceTree = ""; }; + 57F2B5E013FD1D42752E768761E043FC /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + 58B02BF6C38D852E3C8237A93B97A7B6 /* FBSDKShareVideo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareVideo.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m; sourceTree = ""; }; + 58D29DEBEC40D2D91FD9317FAAE2676F /* FBSDKTriStateBOOL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTriStateBOOL.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h; sourceTree = ""; }; + 59246A2C66033C4BACBB0005E7E2BBBD /* FBSDKBridgeAPIProtocolNativeV1.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIProtocolNativeV1.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m; sourceTree = ""; }; + 5A9EB4606ECF9DBA06957513B48B2199 /* FBSDKApplicationDelegate+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKApplicationDelegate+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h"; sourceTree = ""; }; + 5C60D55377287604B0959CAFD0140C75 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; + 5CEECC794A146848AE89A375494E23B9 /* FBSDKBridgeAPIProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocol.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h; sourceTree = ""; }; + 5E6B70CB24E9D9D440001D57E1A33C98 /* FBSDKApplicationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKApplicationDelegate.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h; sourceTree = ""; }; + 605AC8C10AAA019E78C4407F29E422DB /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + 619453A302401BD0FF8424613BFEF1DC /* FBSDKTestUsersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTestUsersManager.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m; sourceTree = ""; }; + 61D0077F67E9EFDC756CA1B826348CD6 /* FBSDKGraphRequestConnection+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKGraphRequestConnection+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h"; sourceTree = ""; }; + 620E2E07AFE6686E018575828ED8822D /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLConnectionOperation.h; path = AFNetworking/AFURLConnectionOperation.h; sourceTree = ""; }; + 622FE43EF2CDE47C167B385D664605FA /* FBSDKShareVideoContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareVideoContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m; sourceTree = ""; }; + 62395CA9230E642A74C75E7BC54689FA /* FBSDKKeychainStoreViaBundleID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKKeychainStoreViaBundleID.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h; sourceTree = ""; }; + 62F62F695E15CD919E5DE760DFBE16FC /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; + 63588F04E1066D4FF9F51E6660A9AC8D /* FBSDKSettings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSettings.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m; sourceTree = ""; }; + 635C518CBB0C52FCC123DF27A287BB5E /* FBSDKLikeBoxBorderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeBoxBorderView.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h; sourceTree = ""; }; + 63F5C2286E5E866A99ADCB9BDCD47193 /* FBSDKProfile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKProfile.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h; sourceTree = ""; }; + 657185599E8EBD605362D33E630303CD /* FBSDKLikeControl+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLikeControl+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h"; sourceTree = ""; }; + 65D72F75D591A90F405EECAC26B5DF62 /* FBSDKShareButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m; sourceTree = ""; }; + 681B48FA09E393CDE89B1DEE5C65AFBA /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; + 6911BECA35E7518D864239B7E898EEF3 /* Pods-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-frameworks.sh"; sourceTree = ""; }; + 6996D4A4A081BCD46AC6805E66BC88EF /* BFAppLinkNavigation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkNavigation.m; path = Bolts/iOS/BFAppLinkNavigation.m; sourceTree = ""; }; + 69B4BAF446B6FBE961176084DB3DB55D /* FBSDKBridgeAPIRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIRequest.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m; sourceTree = ""; }; + 6AEE34A3234F5521D3DD1990BCAB7129 /* BFAppLinkReturnToRefererController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkReturnToRefererController.m; path = Bolts/iOS/BFAppLinkReturnToRefererController.m; sourceTree = ""; }; + 6CCB8D9AB6370A14BB4101EFD06CCCF3 /* FBSDKAccessTokenCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCache.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m; sourceTree = ""; }; + 6F5C3C43709D8464F81A2AFBDB93F607 /* libBolts.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBolts.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 701EE70CD1027D551948BCACB19AEFC4 /* FBSDKDialogConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKDialogConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h; sourceTree = ""; }; + 70546F79ED989A805A363C6D952F1767 /* FBSDKProfile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKProfile.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m; sourceTree = ""; }; + 71211E63A3051A65351D0631AC91E68F /* FBSDKAccessTokenCacheV3_21.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV3_21.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m; sourceTree = ""; }; + 717A2F909F9429472BE5288181A39CAB /* FBSDKDialogConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKDialogConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m; sourceTree = ""; }; + 71F5F3B038391B03B7AFC79B8FCE01E3 /* FBSDKAppInviteContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppInviteContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h; sourceTree = ""; }; + 71FD8339B436644656B46AF2800569A3 /* FBSDKCloseIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCloseIcon.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m; sourceTree = ""; }; + 7244A1F4E39D1B861FF0A42E44C9D4C4 /* FBSDKServerConfigurationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKServerConfigurationManager.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h; sourceTree = ""; }; + 73E6858AE5F915455C51828D993A9722 /* FBSDKURLOpening.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKURLOpening.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h; sourceTree = ""; }; + 742779FECE16D8BA7466B48D50CE5E0B /* FBSDKBridgeAPIProtocolWebV2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolWebV2.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h; sourceTree = ""; }; + 74E3A51689EE33380E0E6D49AB75E3EA /* FBSDKLikeObjectType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeObjectType.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m; sourceTree = ""; }; + 76C4D614389C6B8EBE493619F413EAA4 /* FBSDKAppEventsState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsState.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m; sourceTree = ""; }; + 787F6CD1CF33863E666B1398D4FA7844 /* FBSDKSharingButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharingButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h; sourceTree = ""; }; + 78F1A4FA45E81AD337FA996B2AD8248C /* FBSDKAppInviteDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppInviteDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m; sourceTree = ""; }; + 78F5FC2AE25B0CF79B83822C186DC996 /* FBSDKShareVideoContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareVideoContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h; sourceTree = ""; }; + 7989F275C86B2744E752EA3F99644B69 /* FBSDKServerConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKServerConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h; sourceTree = ""; }; + 79FFD024B17DCE13D082CD95D00FE966 /* FBSDKGraphRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequest.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h; sourceTree = ""; }; + 7C168D5DBDB78691493E24B13EF6B6A8 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 7CE333A8F39A243535D21286A772F09B /* FBSDKProfile+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKProfile+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h"; sourceTree = ""; }; + 7CFB570F5447DD07FF5C658096CF5277 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; + 7D07C68A2E25033692F6E556B7CE9E6B /* BFAppLinkTarget.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkTarget.m; path = Bolts/iOS/BFAppLinkTarget.m; sourceTree = ""; }; + 7D148ED4CEEB4A77740DB46CB8EBAD10 /* FBSDKBridgeAPIResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIResponse.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h; sourceTree = ""; }; + 7D6D458393B733BC6EA8DC2777E8A172 /* FBSDKMath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMath.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m; sourceTree = ""; }; + 7D86AF0FCC38E65C93DA09276FF4ECE0 /* FBSDKGraphErrorRecoveryProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphErrorRecoveryProcessor.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m; sourceTree = ""; }; + 7E110D8440D968D85B85E1012F110963 /* FBSDKLikeActionControllerCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeActionControllerCache.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m; sourceTree = ""; }; + 7F6530E74EB6BE09CE289556ABF90140 /* FBSDKLikeActionControllerCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeActionControllerCache.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h; sourceTree = ""; }; + 814C603402CCB04BEBE0B38DB0AEB3C1 /* BFAppLink_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLink_Internal.h; path = Bolts/iOS/BFAppLink_Internal.h; sourceTree = ""; }; + 816BF555AFEE3CD3AE12100B131A83F0 /* FBSDKAppEventsUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h; sourceTree = ""; }; + 82D411AF1F45945F96A6086C66B03BDB /* FBSDKBridgeAPIRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIRequest.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h; sourceTree = ""; }; + 8329EC43C296112416EFCA120DBF47DA /* FBSDKShareAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareAPI.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h; sourceTree = ""; }; + 83F36036E90F38D20ECF2351FE6EDF11 /* FBSDKAccessTokenCacheV4.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV4.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m; sourceTree = ""; }; + 849DBE9A96F80DBB5149CE3F9522356A /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + 85F33B8AF603CD1A3169F25DDA70827E /* BFTaskCompletionSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTaskCompletionSource.m; path = Bolts/Common/BFTaskCompletionSource.m; sourceTree = ""; }; + 8683F956D11B266E5AC2EEE8FE623B5B /* FBSDKGraphRequestMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestMetadata.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m; sourceTree = ""; }; + 872A8C33F24359B9BF74DEC4043BF40C /* FBSDKLikeBoxView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeBoxView.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h; sourceTree = ""; }; + 8770E3F45D9D28E6808D3DA057AEFE1C /* FBSDKBridgeAPIProtocolNativeV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolNativeV1.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h; sourceTree = ""; }; + 88A0DF096288204256BA664820E1A820 /* FBSDKShareLinkContent+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKShareLinkContent+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h"; sourceTree = ""; }; + 89E7DB57536C56FAC42F394738CA2311 /* FBSDKBoltsMeasurementEventListener.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBoltsMeasurementEventListener.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m; sourceTree = ""; }; + 8A8B8938D737E489B9B045A09217963B /* FBSDKShareKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSDKShareKit-dummy.m"; sourceTree = ""; }; + 8AA407824AFEB2AEEFFC68DF4DCEB3CF /* BFAppLinkReturnToRefererController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkReturnToRefererController.h; path = Bolts/iOS/BFAppLinkReturnToRefererController.h; sourceTree = ""; }; + 8ABDD0F86776A326D3DFCF22DD6175A6 /* FBSDKBridgeAPIRequest+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKBridgeAPIRequest+Private.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h"; sourceTree = ""; }; + 8AD7A8F85D8F7188A06DF8A234636B04 /* FBSDKLikeDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeDialog.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m; sourceTree = ""; }; + 8D09418454A8A965CBE2790A329C5645 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; + 8D0B7B0085DFF6689C0EAC6D60B9034D /* AFHTTPRequestOperationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPRequestOperationManager.m; path = AFNetworking/AFHTTPRequestOperationManager.m; sourceTree = ""; }; + 8D7D9D759A3D05CE84BBEDB5164C1F62 /* FBSDKDynamicFrameworkLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKDynamicFrameworkLoader.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h; sourceTree = ""; }; + 90DAB60A732E4D9944A9E2CC0A597C8B /* FBSDKShareOpenGraphAction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphAction.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m; sourceTree = ""; }; + 91E280AFCF4EB3736BA672DFDBFE4823 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + 92CEBE36EDFA59A8301F37FB767E221F /* FBSDKTestUsersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTestUsersManager.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h; sourceTree = ""; }; + 93ABAFAC2462AF3375B097DE8390ADE2 /* FBSDKLikeButtonPopWAV.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeButtonPopWAV.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h; sourceTree = ""; }; + 93EEA8D94E4FA7FC25984FF3A4152CE8 /* BFURL_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFURL_Internal.h; path = Bolts/iOS/BFURL_Internal.h; sourceTree = ""; }; + 942F6F6C77996401AB990F23374234C9 /* FBSDKShareError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareError.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h; sourceTree = ""; }; + 958123A39C74BFB5B42758653A99EF03 /* FBSDKMonotonicTime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMonotonicTime.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m; sourceTree = ""; }; + 95DD0397FFC1322F252353AC0480B0F1 /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLConnectionOperation.m; path = AFNetworking/AFURLConnectionOperation.m; sourceTree = ""; }; + 96085863967A021E0FF0ABDB20B02404 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + 964E98DB49EDC3B31D82F3BBCD5E514C /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPRequestOperation.m; path = AFNetworking/AFHTTPRequestOperation.m; sourceTree = ""; }; + 96A85F8F12895068432B3C50F55B32DF /* FBSDKError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKError.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h; sourceTree = ""; }; + 970121E059FA826E3FE6EA9708D0D535 /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; + 971AE23BDE3CC034036AF3A5F3F40D78 /* FBSDKColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKColor.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h; sourceTree = ""; }; + 9786F4E6C8BC376227E52C3606CFDCCB /* BFAppLinkReturnToRefererView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkReturnToRefererView.m; path = Bolts/iOS/BFAppLinkReturnToRefererView.m; sourceTree = ""; }; + 97932698D8DFBACB494F81AA6F55DA3A /* BFTaskCompletionSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTaskCompletionSource.h; path = Bolts/Common/BFTaskCompletionSource.h; sourceTree = ""; }; + 98C98CDFB3F20F2925F6CD1F141BB14F /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; + 9973CF7402B4BEBC2177DD8FFDC4A246 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; + 99E7F0778A133A014C1B246703530484 /* AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.xcconfig; sourceTree = ""; }; + 9BC594D9F8C42BF6978F73806E64FE2A /* FBSDKURLConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKURLConnection.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m; sourceTree = ""; }; + 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 9C5C8DA98DCECDD589CFD4A9DAF2C662 /* FBSDKMessageDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMessageDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h; sourceTree = ""; }; + 9C9E110C906DE6A77B7966080430AE8C /* _FBSDKTemporaryErrorRecoveryAttempter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _FBSDKTemporaryErrorRecoveryAttempter.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m; sourceTree = ""; }; + 9D5BD492AACF346D740215BF393A42F0 /* FBSDKAppEvents.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEvents.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h; sourceTree = ""; }; + 9EB80277705A405E45FC321621F25720 /* FBSDKContainerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKContainerViewController.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h; sourceTree = ""; }; + 9EE6EFFCB4E4F4E60D14688C458E4FFC /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; + 9EEF01D1B3F7F6B77F33A3D9A0BFABA4 /* BFAppLinkReturnToRefererView_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkReturnToRefererView_Internal.h; path = Bolts/iOS/BFAppLinkReturnToRefererView_Internal.h; sourceTree = ""; }; + 9EF317520E764E89AA7EF99C5196A2C9 /* FBSDKSharingContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharingContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h; sourceTree = ""; }; + 9F566A99D95B4CCDA3B38E3B6FF7F538 /* FBSDKLogo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLogo.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m; sourceTree = ""; }; + A045BB8B22C09E49B724B38DE65AD3FF /* FBSDKSharePhotoContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharePhotoContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h; sourceTree = ""; }; + A0CB4C8273D5ED9A15D9D5E43C79AA87 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; + A19DF616941A51576DD057A9FD8F4AD8 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + A1A36D34413696BE466E2CA0AFF194DA /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; + A2666624A8562A06689715F06F8012A7 /* FBSDKShareUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareUtility.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m; sourceTree = ""; }; + A334906C1281DD4C315FFEEA1ECB14DD /* FBSDKGraphRequestConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestConnection.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m; sourceTree = ""; }; + A48FF8279FC537A0D479881CE0382475 /* FBSDKTypeUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTypeUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h; sourceTree = ""; }; + A518E1C2D3DD64966CBE968E38F64C0E /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; + A57815DCE354EDF3506D212E155D5E3A /* BFDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFDefines.h; path = Bolts/Common/BFDefines.h; sourceTree = ""; }; + A6F9B575406DB39396C02616631889BB /* BFWebViewAppLinkResolver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFWebViewAppLinkResolver.m; path = Bolts/iOS/BFWebViewAppLinkResolver.m; sourceTree = ""; }; + A73E06FFD2AEC3D6D8E87E74A22CE225 /* FBSDKLikeActionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeActionController.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m; sourceTree = ""; }; + A81CBDBA497DB3045953FAD61DAC11C7 /* BFCancellationTokenSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenSource.h; path = Bolts/Common/BFCancellationTokenSource.h; sourceTree = ""; }; + A9E02D79E34E3DFF6FD8715DBEDF0320 /* FBSDKBridgeAPIResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIResponse.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m; sourceTree = ""; }; + AA6E8F49344E0EB40DC229A33DD637A0 /* FBSDKBridgeAPICrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPICrypto.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h; sourceTree = ""; }; + AA9B1BFDBFB83B26C0CDD3F7BED9A4C6 /* FBSDKCoreKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSDKCoreKit-dummy.m"; sourceTree = ""; }; + AAF9C07CEE3BAA7ACAA4121D8FD81090 /* FBSDKBridgeAPIProtocolWebV1.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIProtocolWebV1.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m; sourceTree = ""; }; + ACE84033C653128CDBA05F32C9B118F6 /* FBSDKShareDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h; sourceTree = ""; }; + AE36EBEAB6C1036E035A370DFF99A78A /* FBSDKAccessTokenCacheV3_17.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV3_17.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m; sourceTree = ""; }; + AE6725846D1148F2B93BA63A67BE928F /* FBSDKLogo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLogo.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h; sourceTree = ""; }; + AED7C066E630477FC67F9C998362AAB5 /* FBSDKColor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKColor.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m; sourceTree = ""; }; + AF20D633640B12C177853252FA9BB984 /* FBSDKServerConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKServerConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m; sourceTree = ""; }; + AFB9BEA809D5D095C99DCFD78BCF052B /* FBSDKShareOpenGraphContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h; sourceTree = ""; }; + B0E9256C497CC7E961D15960DED14507 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; + B21836A56CDDE5818D5D5F4F27AAD2E4 /* FBSDKProfilePictureView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKProfilePictureView.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m; sourceTree = ""; }; + B21A583F9BA43A147842E4686672A494 /* FBSDKKeychainStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKKeychainStore.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h; sourceTree = ""; }; + B2FB269417A53A47EA02D735AB2B648E /* FBSDKAppEvents.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEvents.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m; sourceTree = ""; }; + B301B0B70E4E90079DD84F26918D4A8E /* FBSDKErrorRecoveryAttempter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKErrorRecoveryAttempter.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m; sourceTree = ""; }; + B33D72933F04FA071C1E7E2DED768752 /* FBSDKShareOpenGraphAction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphAction.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h; sourceTree = ""; }; + B4234D36B7E267CE0C5DBB7FC188C95C /* FBSDKGameRequestContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGameRequestContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m; sourceTree = ""; }; + B54068342B71382F8BE19A8D9AAF9D85 /* FBSDKAccessTokenCacheV4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV4.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h; sourceTree = ""; }; + B76F6B60316A6F28FDBE4F090B96BFEA /* FBSDKMessengerIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMessengerIcon.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h; sourceTree = ""; }; + B7D9A45BC1932C60309FB30832E435D0 /* FBSDKViewImpressionTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKViewImpressionTracker.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m; sourceTree = ""; }; + B83478E98F3E802D34B1A388407E05B0 /* FBSDKContainerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKContainerViewController.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m; sourceTree = ""; }; + B8542D3CF7CEE2D9AA1647A5F6EBBFCE /* FBSDKGameRequestDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGameRequestDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m; sourceTree = ""; }; + B88AC3BD80A2ADD4F09E7A69AA5CA86F /* FBSDKPaymentObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKPaymentObserver.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h; sourceTree = ""; }; + B8B74CC909B2A7A9AD38F8130E2C902E /* FBSDKSharePhoto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSharePhoto.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m; sourceTree = ""; }; + B986B60BD6445564D539745478FB987F /* FBSDKAppEvents+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKAppEvents+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h"; sourceTree = ""; }; + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BA74722B7C68275BF230E648AC2F9EB2 /* FBSDKAccessTokenCacheV3.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV3.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h; sourceTree = ""; }; + BBDE8D7E5224DD27717593F9568D736B /* FBSDKLiking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLiking.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h; sourceTree = ""; }; + BD6F5FD84D870265A3054285625A8016 /* FBSDKBridgeAPIProtocolType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolType.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h; sourceTree = ""; }; + BD7AB9C8CE4F7FAC4AA9C21B6436D171 /* FBSDKGraphRequestDataAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestDataAttachment.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m; sourceTree = ""; }; + BF4FE2BD24A106BA7261B9C4E322CBDE /* FBSDKShareLinkContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareLinkContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h; sourceTree = ""; }; + C0842CC84848AD64C6605B3413ED3306 /* BFTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTask.m; path = Bolts/Common/BFTask.m; sourceTree = ""; }; + C0F56DF3DE892E2F69B2A05670573456 /* FBSDKShareConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareConstants.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h; sourceTree = ""; }; + C1B665940C6E872D3C4F9F45C1584D5E /* FBSDKGameRequestFrictionlessRecipientCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGameRequestFrictionlessRecipientCache.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m; sourceTree = ""; }; + C1E87324285B5BB14E5D8C29E8ECED34 /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPRequestOperation.h; path = AFNetworking/AFHTTPRequestOperation.h; sourceTree = ""; }; + C2330FD7D0E371C9B8679FDA53BC1A17 /* Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Bolts.m; path = Bolts/Common/Bolts.m; sourceTree = ""; }; + C2B240D99C3FC6A7DC6C66A2434CA799 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + C2B910FEA04E93A550E336CD0AE37263 /* FBSDKTriStateBOOL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTriStateBOOL.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m; sourceTree = ""; }; + C32DEAD26534788790CD79C9EED0DD7B /* FBSDKLikeDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeDialog.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h; sourceTree = ""; }; + C354EAF888944E5583C78F3BA0725666 /* FBSDKBoltsMeasurementEventListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBoltsMeasurementEventListener.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h; sourceTree = ""; }; + C3DCA73ECDED4D24D157E854B9A0153B /* FBSDKViewImpressionTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKViewImpressionTracker.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h; sourceTree = ""; }; + C4008AE978714C2939117D47D770EAAA /* FBSDKShareError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareError.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m; sourceTree = ""; }; + C6F3BE3D5D0F4E92B3674A6C9C4049D2 /* FBSDKGraphRequestPiggybackManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestPiggybackManager.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m; sourceTree = ""; }; + C7B45749F7EE5706D0A4AECC8BBEB46E /* FBSDKKeychainStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKKeychainStore.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m; sourceTree = ""; }; + C89E18861C33DBD02440A0236BABF441 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; + C8AA61E15065B666BC54CDE7CC210EE1 /* FBSDKShareConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareConstants.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m; sourceTree = ""; }; + CB6C51F40B3416542CBFBF6D55B32E22 /* FBSDKAppEventsState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsState.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h; sourceTree = ""; }; + CC2C004066771DC458B8D3EDC130B0D9 /* FBSDKBridgeAPIProtocolWebV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolWebV1.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h; sourceTree = ""; }; + CC5A41F359C40F92D1FB980A30F06A28 /* Bolts.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bolts.xcconfig; sourceTree = ""; }; + CD70059B9065BEA37C71F253919DA723 /* FBSDKWebDialogView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKWebDialogView.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h; sourceTree = ""; }; + CDDBEA1384A41C459CD9825355A75FA9 /* FBSDKTimeSpentData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTimeSpentData.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m; sourceTree = ""; }; + D090AB018AA204B9A85FEB742D9D1B66 /* FBSDKSharing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharing.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h; sourceTree = ""; }; + D189CD6E7022F5E3795253EB16E31B44 /* FBSDKMaleSilhouetteIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMaleSilhouetteIcon.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h; sourceTree = ""; }; + D1CE1F3E4858E2DEB082FB34A0666050 /* FBSDKDynamicFrameworkLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKDynamicFrameworkLoader.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.m; sourceTree = ""; }; + D280713A1343A40C24E0C825EABA1CE0 /* FBSDKBase64.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBase64.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m; sourceTree = ""; }; + D3A6188717A7865C7CDC5E6B9E4C2974 /* UIAlertView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertView+AFNetworking.h"; path = "UIKit+AFNetworking/UIAlertView+AFNetworking.h"; sourceTree = ""; }; + D4279B24F97345021312F957E499D0A6 /* FBSDKGraphRequest+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKGraphRequest+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h"; sourceTree = ""; }; + D5B5EE23580C7EE674493EA966D9E152 /* BFAppLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLink.m; path = Bolts/iOS/BFAppLink.m; sourceTree = ""; }; + D637D586849D95210171B7314E16B819 /* FBSDKAppEventsStateManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsStateManager.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m; sourceTree = ""; }; + D7DBF26EAC60AC8145109B1287B7BB9B /* FBSDKSendButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSendButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m; sourceTree = ""; }; + D87A74F5FE003D6FB5AF70863732E5C9 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; + D95E6FDA2D10FD860C64D7EB686B6348 /* FBSDKShareKit+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKShareKit+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h"; sourceTree = ""; }; + D9C76FDCCC2AFC799E7C3167BC40640F /* FBSDKLikeButton+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLikeButton+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h"; sourceTree = ""; }; + DA1B570FD8EBBA84C4728B76B494D7D8 /* BFMeasurementEvent_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFMeasurementEvent_Internal.h; path = Bolts/iOS/BFMeasurementEvent_Internal.h; sourceTree = ""; }; + DBBEEB167D7BE32668BD7D69B8CB73E0 /* BFCancellationTokenRegistration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenRegistration.m; path = Bolts/Common/BFCancellationTokenRegistration.m; sourceTree = ""; }; + DBC262389D86131D9D30610AB85E86F0 /* FBSDKSendButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSendButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h; sourceTree = ""; }; + DC4796735C12A93B95D67010D3896DDF /* FBSDKButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKButton.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m; sourceTree = ""; }; + DC4D1B53E565D3099084E5803F62D86B /* FBSDKTimeSpentData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTimeSpentData.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h; sourceTree = ""; }; + DCA84971ACA835D473FF3670D6AAA225 /* FBSDKGraphRequestPiggybackManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestPiggybackManager.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h; sourceTree = ""; }; + DD895E7DE10E3155FAA2894548F53B61 /* FBSDKServerConfigurationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKServerConfigurationManager.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m; sourceTree = ""; }; + DF7B63028500BA56AC65151BF4686EC3 /* BFMeasurementEvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFMeasurementEvent.m; path = Bolts/iOS/BFMeasurementEvent.m; sourceTree = ""; }; + DF8CAC0800562C284C3D65E7D665C530 /* libFBSDKCoreKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFBSDKCoreKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; + E01BB74E43EBC6E579F4E9BE2168AF46 /* FBSDKCheckmarkIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCheckmarkIcon.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h; sourceTree = ""; }; + E089A4EC1B9A49BB7EF108F65091CB80 /* FBSDKUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m; sourceTree = ""; }; + E1B2EDB370766CCDF13A6AE75B49C55A /* FBSDKShareOpenGraphValueContainer+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKShareOpenGraphValueContainer+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h"; sourceTree = ""; }; + E335A77A6371CE3ADE026F58C0F17DF9 /* FBSDKSystemAccountStoreAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSystemAccountStoreAdapter.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m; sourceTree = ""; }; + E3E6A108F38043D568733C03E5086DCA /* FBSDKServerConfigurationManager+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKServerConfigurationManager+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h"; sourceTree = ""; }; + E57DB9A900B43FD789451E87CCE7A828 /* FBSDKShareKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSDKShareKit-prefix.pch"; sourceTree = ""; }; + E787ECD99234F0177D0C154074233A9B /* FBSDKWebDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKWebDialog.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m; sourceTree = ""; }; + E7EACD97913E41CA60721A3FF33C300B /* FBSDKErrorRecoveryConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKErrorRecoveryConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m; sourceTree = ""; }; + E8091747ED012950E38E4FD3C2BADD49 /* FBSDKCrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCrypto.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m; sourceTree = ""; }; + E82EF3A27D2B4D98EE687DC6AC6AF9F4 /* FBSDKShareOpenGraphObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphObject.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h; sourceTree = ""; }; + E879DEF720F6075AFEC24C1F2310C5DE /* FBSDKAccessToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessToken.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h; sourceTree = ""; }; + E88C8801AAF683626FD1F1A19E21B788 /* FBSDKShareUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareUtility.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h; sourceTree = ""; }; + E99299396BCFBC6832C2249D4E851BC1 /* FBSDKShareButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h; sourceTree = ""; }; + EAB66AE62D66F78EACA78373B48630FD /* AFHTTPRequestOperationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPRequestOperationManager.h; path = AFNetworking/AFHTTPRequestOperationManager.h; sourceTree = ""; }; + EB01103EF88BDD2D63A48AB1B1029D95 /* FBSDKInternalUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKInternalUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h; sourceTree = ""; }; + EC6A6AB602095141AC0E4DC5009D0163 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; + ECBBA43BD2613AD7F55AE39385F989BF /* FBSDKMaleSilhouetteIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMaleSilhouetteIcon.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m; sourceTree = ""; }; + EDEF09081B568F083D3EB0052DF71A24 /* FBSDKAppGroupAddDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppGroupAddDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m; sourceTree = ""; }; + EF7F31B4CFDDB34FE09B69309E94BEBE /* FBSDKCrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCrypto.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h; sourceTree = ""; }; + EF8C0DC6F01F77FB80CACDA326D9088F /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; + EFC55F0B619CEB0B97C3C235D50AF2D5 /* BFURL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFURL.m; path = Bolts/iOS/BFURL.m; sourceTree = ""; }; + EFF75AA840A717A63E0FFB5D14BC1BA0 /* FBSDKCheckmarkIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCheckmarkIcon.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m; sourceTree = ""; }; + F018E05A0D968A32CF67ACD6172BFF26 /* FBSDKMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMacros.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h; sourceTree = ""; }; + F0EC6D867BCE4FB94683D0E032A446B9 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; + F13CAFC013EC2759ECDC78375FBE5546 /* FBSDKMutableCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMutableCopying.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h; sourceTree = ""; }; + F183F2FB92C2EBC307921CE4906D5E98 /* FBSDKAppGroupJoinDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppGroupJoinDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m; sourceTree = ""; }; + F1CA1FF4409BDC377E68687D11F7033A /* _FBSDKTemporaryErrorRecoveryAttempter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _FBSDKTemporaryErrorRecoveryAttempter.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h; sourceTree = ""; }; + F2865B9A148712BD8A7876B34F00E8B0 /* FBSDKProfilePictureView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKProfilePictureView.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h; sourceTree = ""; }; + F3E4562D9905FCC1AFDD3E97DF4EB4D7 /* FBSDKWebDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKWebDialog.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h; sourceTree = ""; }; + F5409B97F9D2EDFB9B38AFFD9173482D /* FBSDKShareVideo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareVideo.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h; sourceTree = ""; }; + F57EED0783FADB24B6109EF61CCD1DB1 /* FBSDKApplicationDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKApplicationDelegate.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m; sourceTree = ""; }; + F580B4FA66804A8EE1DD91EAE8415277 /* BFMeasurementEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFMeasurementEvent.h; path = Bolts/iOS/BFMeasurementEvent.h; sourceTree = ""; }; + F5D16F303E935B275648EEBD42532800 /* FBSDKMonotonicTime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMonotonicTime.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h; sourceTree = ""; }; + F5D91CD1D3BAAFA035B1F65ECE6D3791 /* FBSDKShareKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareKit.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h; sourceTree = ""; }; + F675A17D1121BF0CC7957CD722DBE164 /* Bolts-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Bolts-prefix.pch"; sourceTree = ""; }; + F67FFB2A96EADAC53137E0DAF8DF3325 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; + F7D7016519D25AA92F3FEFB94DC358FF /* FBSDKShareOpenGraphObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphObject.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m; sourceTree = ""; }; + F9172376F742F18B5381BCD8C91A2A7F /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; + F9961C4E64F5C3ACBBC54733669D0ECD /* FBSDKAppEventsUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m; sourceTree = ""; }; + F9CB53CDDE68E68176FDF6DDEF6575C4 /* FBSDKAccessTokenCacheV3.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV3.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m; sourceTree = ""; }; + FA61719DA40A89D49DB2CF2A54C509EB /* FBSDKSystemAccountStoreAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSystemAccountStoreAdapter.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h; sourceTree = ""; }; + FAD3BF0B2A50192561F7681E8D426EA1 /* BFURL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFURL.h; path = Bolts/iOS/BFURL.h; sourceTree = ""; }; + FB3DD0DADAF8A63EB2A098F05C214D80 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; + FCBCFB66D3AF0BC63DD6482811A4ECB6 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + FEC84A813A010E44BE85287A63099D7E /* libFBSDKShareKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFBSDKShareKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 06397B19B46BC23B4020A7016F06E806 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 097DE14824DA65BDF81E4C5A2D73566F /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4B6FCC51F24F6991AAA4CC61597FD2DA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D9641967C1ACD51CE3ACACF1B1D2860 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AB6236FDABEA71A344A72311A20E9129 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 60F370DA778C2C58337885BA2E21047C /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E777CC223E33975CFF446FF32A8981C0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9EF32C9762B79DF6386F46170BC63CFD /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F428C0A5C7AEF469CC7F9B7E6EC0003A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F08E19D8B440D85D564273B1A501B1FC /* CoreGraphics.framework in Frameworks */, + 0F8217A7033D4B1169408CA2DEBFA592 /* Foundation.framework in Frameworks */, + DB42C604EF2F39D542F805AC6A05E090 /* MobileCoreServices.framework in Frameworks */, + F2AF56F00E313B9CD0F4ADA3C5D73BDF /* Security.framework in Frameworks */, + BA025A85A850C1E24A6C92F4C29E5531 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 037C0CA694176A3C0915F62C9D20B3E6 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + B3D1D13E0C6553800746CB8FD61CF946 /* Pods */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 1002012BB6B1D05E612A1DE9A148CEBC /* Support Files */ = { + isa = PBXGroup; + children = ( + CC5A41F359C40F92D1FB980A30F06A28 /* Bolts.xcconfig */, + 4E0040CD74A9FEE0F9D432DE52EECF89 /* Bolts-dummy.m */, + F675A17D1121BF0CC7957CD722DBE164 /* Bolts-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/Bolts"; + sourceTree = ""; + }; + 1C45A5CA4837E7E66B3E6CC1B2970E3C /* UIKit */ = { + isa = PBXGroup; + children = ( + 11F566261D795BD0772871AAC0C7A196 /* AFNetworkActivityIndicatorManager.h */, + EF8C0DC6F01F77FB80CACDA326D9088F /* AFNetworkActivityIndicatorManager.m */, + 0AEC190845E7BC9C364549267A08BDD1 /* UIActivityIndicatorView+AFNetworking.h */, + 18D1807557C9540D45C2BE8983801328 /* UIActivityIndicatorView+AFNetworking.m */, + D3A6188717A7865C7CDC5E6B9E4C2974 /* UIAlertView+AFNetworking.h */, + 3C63272E74DFFA3CCDDC5DE14E0A0310 /* UIAlertView+AFNetworking.m */, + 17BAAFC7EF54937CB6A4A7CECADEF0E9 /* UIButton+AFNetworking.h */, + 849DBE9A96F80DBB5149CE3F9522356A /* UIButton+AFNetworking.m */, + 1EAF235F0554DD9B769F3F848A38DD1B /* UIImage+AFNetworking.h */, + FB3DD0DADAF8A63EB2A098F05C214D80 /* UIImageView+AFNetworking.h */, + 7CFB570F5447DD07FF5C658096CF5277 /* UIImageView+AFNetworking.m */, + D87A74F5FE003D6FB5AF70863732E5C9 /* UIKit+AFNetworking.h */, + F67FFB2A96EADAC53137E0DAF8DF3325 /* UIProgressView+AFNetworking.h */, + 45B852719FC1E2E22521633C20BFD642 /* UIProgressView+AFNetworking.m */, + 96085863967A021E0FF0ABDB20B02404 /* UIRefreshControl+AFNetworking.h */, + 605AC8C10AAA019E78C4407F29E422DB /* UIRefreshControl+AFNetworking.m */, + 970121E059FA826E3FE6EA9708D0D535 /* UIWebView+AFNetworking.h */, + A0CB4C8273D5ED9A15D9D5E43C79AA87 /* UIWebView+AFNetworking.m */, + ); + name = UIKit; + sourceTree = ""; + }; + 1C8F5950E57CA3E922090B159DC768D3 /* Pods */ = { + isa = PBXGroup; + children = ( + F1D45C5E55A76CE41644E12A20666292 /* AFNetworking */, + 498B87F5606CA19992221177089AF51F /* Bolts */, + D3DE9F02CB2A07ECB27BE9D0DE135F19 /* FBSDKCoreKit */, + 949972CFA24F37C7101A99703A6B5FFE /* FBSDKShareKit */, + ); + name = Pods; + sourceTree = ""; + }; + 20B56609144CE204DFA8221F742B2D76 /* Frameworks */ = { + isa = PBXGroup; + children = ( + FFD977C5D23FB16656C5D57197BAA49C /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 40200456C49731F5CAB184DAE274D205 /* Serialization */ = { + isa = PBXGroup; + children = ( + 32B4541137A20F243E9B1AA7F4CD999B /* AFURLRequestSerialization.h */, + F9172376F742F18B5381BCD8C91A2A7F /* AFURLRequestSerialization.m */, + 681B48FA09E393CDE89B1DEE5C65AFBA /* AFURLResponseSerialization.h */, + 91E280AFCF4EB3736BA672DFDBFE4823 /* AFURLResponseSerialization.m */, + ); + name = Serialization; + sourceTree = ""; + }; + 498B87F5606CA19992221177089AF51F /* Bolts */ = { + isa = PBXGroup; + children = ( + CCB8F96AD56A82DBE48A53ADE40DC481 /* AppLinks */, + 1002012BB6B1D05E612A1DE9A148CEBC /* Support Files */, + 84FBC481294F8298E203D44918B723FF /* Tasks */, + ); + path = Bolts; + sourceTree = ""; + }; + 4CE3B5BBD02C96A69A667C98D649758B /* Support Files */ = { + isa = PBXGroup; + children = ( + 99E7F0778A133A014C1B246703530484 /* AFNetworking.xcconfig */, + C89E18861C33DBD02440A0236BABF441 /* AFNetworking-dummy.m */, + A518E1C2D3DD64966CBE968E38F64C0E /* AFNetworking-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/AFNetworking"; + sourceTree = ""; + }; + 516769B3C8A6A0870FC44F66DCB61E80 /* Security */ = { + isa = PBXGroup; + children = ( + 62F62F695E15CD919E5DE760DFBE16FC /* AFSecurityPolicy.h */, + 9973CF7402B4BEBC2177DD8FFDC4A246 /* AFSecurityPolicy.m */, + ); + name = Security; + sourceTree = ""; + }; + 7263DEE05245863A54C4EBCB6A356485 /* NSURLConnection */ = { + isa = PBXGroup; + children = ( + C1E87324285B5BB14E5D8C29E8ECED34 /* AFHTTPRequestOperation.h */, + 964E98DB49EDC3B31D82F3BBCD5E514C /* AFHTTPRequestOperation.m */, + EAB66AE62D66F78EACA78373B48630FD /* AFHTTPRequestOperationManager.h */, + 8D0B7B0085DFF6689C0EAC6D60B9034D /* AFHTTPRequestOperationManager.m */, + 620E2E07AFE6686E018575828ED8822D /* AFURLConnectionOperation.h */, + 95DD0397FFC1322F252353AC0480B0F1 /* AFURLConnectionOperation.m */, + ); + name = NSURLConnection; + sourceTree = ""; + }; + 73052AF592E709A55A796F7A1B27D155 /* no-arc */ = { + isa = PBXGroup; + children = ( + D1CE1F3E4858E2DEB082FB34A0666050 /* FBSDKDynamicFrameworkLoader.m */, + ); + name = "no-arc"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + 20B56609144CE204DFA8221F742B2D76 /* Frameworks */, + 1C8F5950E57CA3E922090B159DC768D3 /* Pods */, + F4676A70D6365769FE91D7E7AADEE5CC /* Products */, + 037C0CA694176A3C0915F62C9D20B3E6 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 84FBC481294F8298E203D44918B723FF /* Tasks */ = { + isa = PBXGroup; + children = ( + 0BFA01E4E85363554DE20FA0E400E702 /* BFCancellationToken.h */, + 173AD07497467EB2CE6F078E62156181 /* BFCancellationToken.m */, + 4A36356EA8459872F233FC4A5B6CB0C6 /* BFCancellationTokenRegistration.h */, + DBBEEB167D7BE32668BD7D69B8CB73E0 /* BFCancellationTokenRegistration.m */, + A81CBDBA497DB3045953FAD61DAC11C7 /* BFCancellationTokenSource.h */, + 344019E43C6A7FF9F2AEB23DFE905659 /* BFCancellationTokenSource.m */, + A57815DCE354EDF3506D212E155D5E3A /* BFDefines.h */, + 01836F2CBF2A5A05ADFA09AE218FF214 /* BFExecutor.h */, + 4D6E1BF2FFD5BFBE698182F936C97B36 /* BFExecutor.m */, + 0B456D6651F811DF3185A02F4ADDB616 /* BFTask.h */, + C0842CC84848AD64C6605B3413ED3306 /* BFTask.m */, + 97932698D8DFBACB494F81AA6F55DA3A /* BFTaskCompletionSource.h */, + 85F33B8AF603CD1A3169F25DDA70827E /* BFTaskCompletionSource.m */, + 26357E64513F91968E51C27F13425B58 /* Bolts.h */, + C2330FD7D0E371C9B8679FDA53BC1A17 /* Bolts.m */, + 08C06A80244BAE195E0EB1D4F62CD476 /* BoltsVersion.h */, + ); + name = Tasks; + sourceTree = ""; + }; + 949972CFA24F37C7101A99703A6B5FFE /* FBSDKShareKit */ = { + isa = PBXGroup; + children = ( + 39CA63DD851C05AE2EEB3219A8E40C4A /* FBSDKAppGroupAddDialog.h */, + EDEF09081B568F083D3EB0052DF71A24 /* FBSDKAppGroupAddDialog.m */, + 4B9259909AA0735B04AA702F158F553D /* FBSDKAppGroupContent.h */, + 511FCF3C5750F7F6CD3728CA06EBFA0A /* FBSDKAppGroupContent.m */, + 2F24229DAC68EAFE5C960C85D81C4881 /* FBSDKAppGroupJoinDialog.h */, + F183F2FB92C2EBC307921CE4906D5E98 /* FBSDKAppGroupJoinDialog.m */, + 71F5F3B038391B03B7AFC79B8FCE01E3 /* FBSDKAppInviteContent.h */, + 2C2A6EE9ED2159134298DE8AAABAFD9F /* FBSDKAppInviteContent.m */, + 215A384B0288A0E296EDF086D07D6775 /* FBSDKAppInviteDialog.h */, + 78F1A4FA45E81AD337FA996B2AD8248C /* FBSDKAppInviteDialog.m */, + E01BB74E43EBC6E579F4E9BE2168AF46 /* FBSDKCheckmarkIcon.h */, + EFF75AA840A717A63E0FFB5D14BC1BA0 /* FBSDKCheckmarkIcon.m */, + 40D5497F670A19328EE48A170A9601E7 /* FBSDKGameRequestContent.h */, + B4234D36B7E267CE0C5DBB7FC188C95C /* FBSDKGameRequestContent.m */, + 0E62053FFC7CBC0B8DBB6F4117470B15 /* FBSDKGameRequestDialog.h */, + B8542D3CF7CEE2D9AA1647A5F6EBBFCE /* FBSDKGameRequestDialog.m */, + 10EDFC8DE37B8D5DAD245062B9420869 /* FBSDKGameRequestFrictionlessRecipientCache.h */, + C1B665940C6E872D3C4F9F45C1584D5E /* FBSDKGameRequestFrictionlessRecipientCache.m */, + 062DC1459AC8AB2EC471B2D75A99089C /* FBSDKLikeActionController.h */, + A73E06FFD2AEC3D6D8E87E74A22CE225 /* FBSDKLikeActionController.m */, + 7F6530E74EB6BE09CE289556ABF90140 /* FBSDKLikeActionControllerCache.h */, + 7E110D8440D968D85B85E1012F110963 /* FBSDKLikeActionControllerCache.m */, + 635C518CBB0C52FCC123DF27A287BB5E /* FBSDKLikeBoxBorderView.h */, + 379DFF64A1CC405BF431D6BCEEF0BFC0 /* FBSDKLikeBoxBorderView.m */, + 872A8C33F24359B9BF74DEC4043BF40C /* FBSDKLikeBoxView.h */, + 484EF6885EB0A6D83FBBC5B4DB016C38 /* FBSDKLikeBoxView.m */, + 2CD5B01679610DE9E10FB53B9B4FCFF8 /* FBSDKLikeButton.h */, + 28AE686AF4D4A27CA0AD6C6A854F9EA0 /* FBSDKLikeButton.m */, + D9C76FDCCC2AFC799E7C3167BC40640F /* FBSDKLikeButton+Internal.h */, + 93ABAFAC2462AF3375B097DE8390ADE2 /* FBSDKLikeButtonPopWAV.h */, + 376A0BE5E5AEABC84DB6E92BE0DCCEF6 /* FBSDKLikeButtonPopWAV.m */, + 01CD4F30BE0D4FECD106A3350A907E25 /* FBSDKLikeControl.h */, + 35799F882BCB00E2D1F8D25E72BD40DD /* FBSDKLikeControl.m */, + 657185599E8EBD605362D33E630303CD /* FBSDKLikeControl+Internal.h */, + C32DEAD26534788790CD79C9EED0DD7B /* FBSDKLikeDialog.h */, + 8AD7A8F85D8F7188A06DF8A234636B04 /* FBSDKLikeDialog.m */, + 30F32EA195D4638DC3E88E5E6F1E7C60 /* FBSDKLikeObjectType.h */, + 74E3A51689EE33380E0E6D49AB75E3EA /* FBSDKLikeObjectType.m */, + BBDE8D7E5224DD27717593F9568D736B /* FBSDKLiking.h */, + 9C5C8DA98DCECDD589CFD4A9DAF2C662 /* FBSDKMessageDialog.h */, + 21C77DE090A2DBA387648130B7CD73FE /* FBSDKMessageDialog.m */, + B76F6B60316A6F28FDBE4F090B96BFEA /* FBSDKMessengerIcon.h */, + 019C4125D19F0A03512DE346B5EE7279 /* FBSDKMessengerIcon.m */, + DBC262389D86131D9D30610AB85E86F0 /* FBSDKSendButton.h */, + D7DBF26EAC60AC8145109B1287B7BB9B /* FBSDKSendButton.m */, + 8329EC43C296112416EFCA120DBF47DA /* FBSDKShareAPI.h */, + 3A5E58E18C6F2A97D95380BEA2472FD2 /* FBSDKShareAPI.m */, + E99299396BCFBC6832C2249D4E851BC1 /* FBSDKShareButton.h */, + 65D72F75D591A90F405EECAC26B5DF62 /* FBSDKShareButton.m */, + C0F56DF3DE892E2F69B2A05670573456 /* FBSDKShareConstants.h */, + C8AA61E15065B666BC54CDE7CC210EE1 /* FBSDKShareConstants.m */, + 2C43111C27DDA6A45D700E4964BC1BFD /* FBSDKShareDefines.h */, + ACE84033C653128CDBA05F32C9B118F6 /* FBSDKShareDialog.h */, + 3388639DA75D2D412F6D40C2FDC14322 /* FBSDKShareDialog.m */, + 186052602EB811A441DB131C622C903A /* FBSDKShareDialogMode.h */, + 2AA908FC7B7A735FE7D401D5B65BFCA8 /* FBSDKShareDialogMode.m */, + 942F6F6C77996401AB990F23374234C9 /* FBSDKShareError.h */, + C4008AE978714C2939117D47D770EAAA /* FBSDKShareError.m */, + F5D91CD1D3BAAFA035B1F65ECE6D3791 /* FBSDKShareKit.h */, + D95E6FDA2D10FD860C64D7EB686B6348 /* FBSDKShareKit+Internal.h */, + BF4FE2BD24A106BA7261B9C4E322CBDE /* FBSDKShareLinkContent.h */, + 557C06B136ECB94CA516DA4CA88B7CB3 /* FBSDKShareLinkContent.m */, + 88A0DF096288204256BA664820E1A820 /* FBSDKShareLinkContent+Internal.h */, + B33D72933F04FA071C1E7E2DED768752 /* FBSDKShareOpenGraphAction.h */, + 90DAB60A732E4D9944A9E2CC0A597C8B /* FBSDKShareOpenGraphAction.m */, + AFB9BEA809D5D095C99DCFD78BCF052B /* FBSDKShareOpenGraphContent.h */, + 0CCECB75018C831ECC6167EFBFAD25C0 /* FBSDKShareOpenGraphContent.m */, + E82EF3A27D2B4D98EE687DC6AC6AF9F4 /* FBSDKShareOpenGraphObject.h */, + F7D7016519D25AA92F3FEFB94DC358FF /* FBSDKShareOpenGraphObject.m */, + 482C8D7185406E073AC038302D8DB73E /* FBSDKShareOpenGraphValueContainer.h */, + 43F80A56E649ED7ABA711D267EE68079 /* FBSDKShareOpenGraphValueContainer.m */, + E1B2EDB370766CCDF13A6AE75B49C55A /* FBSDKShareOpenGraphValueContainer+Internal.h */, + 0D931456CA6CE772593D8847739A7868 /* FBSDKSharePhoto.h */, + B8B74CC909B2A7A9AD38F8130E2C902E /* FBSDKSharePhoto.m */, + A045BB8B22C09E49B724B38DE65AD3FF /* FBSDKSharePhotoContent.h */, + 0C81562DB154359BC507ADD05074ABCE /* FBSDKSharePhotoContent.m */, + E88C8801AAF683626FD1F1A19E21B788 /* FBSDKShareUtility.h */, + A2666624A8562A06689715F06F8012A7 /* FBSDKShareUtility.m */, + F5409B97F9D2EDFB9B38AFFD9173482D /* FBSDKShareVideo.h */, + 58B02BF6C38D852E3C8237A93B97A7B6 /* FBSDKShareVideo.m */, + 78F5FC2AE25B0CF79B83822C186DC996 /* FBSDKShareVideoContent.h */, + 622FE43EF2CDE47C167B385D664605FA /* FBSDKShareVideoContent.m */, + D090AB018AA204B9A85FEB742D9D1B66 /* FBSDKSharing.h */, + 787F6CD1CF33863E666B1398D4FA7844 /* FBSDKSharingButton.h */, + 9EF317520E764E89AA7EF99C5196A2C9 /* FBSDKSharingContent.h */, + E6BFFBC337C755242EC36925886D01AE /* Support Files */, + ); + path = FBSDKShareKit; + sourceTree = ""; + }; + B3D1D13E0C6553800746CB8FD61CF946 /* Pods */ = { + isa = PBXGroup; + children = ( + 37DB56D75062CC75FCB0966E1C6E8A8E /* Pods-acknowledgements.markdown */, + 10834806BD7B412BC24F347361FA2C8E /* Pods-acknowledgements.plist */, + 272643F56613CA0D336AE3DBF19DC404 /* Pods-dummy.m */, + 6911BECA35E7518D864239B7E898EEF3 /* Pods-frameworks.sh */, + A1A36D34413696BE466E2CA0AFF194DA /* Pods-resources.sh */, + 4E762F23EC34ED4A6FF3312D84E33A40 /* Pods.debug.xcconfig */, + 98C98CDFB3F20F2925F6CD1F141BB14F /* Pods.release.xcconfig */, + ); + name = Pods; + path = "Target Support Files/Pods"; + sourceTree = ""; + }; + C1918B78853CA42BAC712DA2AAD3843C /* Reachability */ = { + isa = PBXGroup; + children = ( + 5C60D55377287604B0959CAFD0140C75 /* AFNetworkReachabilityManager.h */, + 9EE6EFFCB4E4F4E60D14688C458E4FFC /* AFNetworkReachabilityManager.m */, + ); + name = Reachability; + sourceTree = ""; + }; + CCB8F96AD56A82DBE48A53ADE40DC481 /* AppLinks */ = { + isa = PBXGroup; + children = ( + 307E586C9913BA331DF82B237461D24A /* BFAppLink.h */, + D5B5EE23580C7EE674493EA966D9E152 /* BFAppLink.m */, + 814C603402CCB04BEBE0B38DB0AEB3C1 /* BFAppLink_Internal.h */, + 3E3BF8F324C012ECB14CF54C1279F64C /* BFAppLinkNavigation.h */, + 6996D4A4A081BCD46AC6805E66BC88EF /* BFAppLinkNavigation.m */, + 2487D8C937C94995243E585E43469CE2 /* BFAppLinkResolving.h */, + 8AA407824AFEB2AEEFFC68DF4DCEB3CF /* BFAppLinkReturnToRefererController.h */, + 6AEE34A3234F5521D3DD1990BCAB7129 /* BFAppLinkReturnToRefererController.m */, + 14F63D4C0244188DD5FEC301B489F240 /* BFAppLinkReturnToRefererView.h */, + 9786F4E6C8BC376227E52C3606CFDCCB /* BFAppLinkReturnToRefererView.m */, + 9EEF01D1B3F7F6B77F33A3D9A0BFABA4 /* BFAppLinkReturnToRefererView_Internal.h */, + 30FDA5553C084D8F7CBC4B5053FD198D /* BFAppLinkTarget.h */, + 7D07C68A2E25033692F6E556B7CE9E6B /* BFAppLinkTarget.m */, + F580B4FA66804A8EE1DD91EAE8415277 /* BFMeasurementEvent.h */, + DF7B63028500BA56AC65151BF4686EC3 /* BFMeasurementEvent.m */, + DA1B570FD8EBBA84C4728B76B494D7D8 /* BFMeasurementEvent_Internal.h */, + FAD3BF0B2A50192561F7681E8D426EA1 /* BFURL.h */, + EFC55F0B619CEB0B97C3C235D50AF2D5 /* BFURL.m */, + 93EEA8D94E4FA7FC25984FF3A4152CE8 /* BFURL_Internal.h */, + 16889DB82DB0951456DD4E5C94BDE9F6 /* BFWebViewAppLinkResolver.h */, + A6F9B575406DB39396C02616631889BB /* BFWebViewAppLinkResolver.m */, + ); + name = AppLinks; + sourceTree = ""; + }; + CEC3373236AE62095D55BCD09ECC27C0 /* Support Files */ = { + isa = PBXGroup; + children = ( + 5372D999245395E50C3D972BC275C238 /* FBSDKCoreKit.xcconfig */, + AA9B1BFDBFB83B26C0CDD3F7BED9A4C6 /* FBSDKCoreKit-dummy.m */, + 3A672A669918D7E198D40138A23D21B0 /* FBSDKCoreKit-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/FBSDKCoreKit"; + sourceTree = ""; + }; + D3DE9F02CB2A07ECB27BE9D0DE135F19 /* FBSDKCoreKit */ = { + isa = PBXGroup; + children = ( + E50A40547B018BDC5E22138EF43E4E9A /* arc */, + 73052AF592E709A55A796F7A1B27D155 /* no-arc */, + CEC3373236AE62095D55BCD09ECC27C0 /* Support Files */, + ); + path = FBSDKCoreKit; + sourceTree = ""; + }; + E50A40547B018BDC5E22138EF43E4E9A /* arc */ = { + isa = PBXGroup; + children = ( + F1CA1FF4409BDC377E68687D11F7033A /* _FBSDKTemporaryErrorRecoveryAttempter.h */, + 9C9E110C906DE6A77B7966080430AE8C /* _FBSDKTemporaryErrorRecoveryAttempter.m */, + E879DEF720F6075AFEC24C1F2310C5DE /* FBSDKAccessToken.h */, + 28ADB7EAC9BC3C79D90FA2B7AD9491DF /* FBSDKAccessToken.m */, + 3552DB6CD22B9C8E75785855D5F15E89 /* FBSDKAccessTokenCache.h */, + 6CCB8D9AB6370A14BB4101EFD06CCCF3 /* FBSDKAccessTokenCache.m */, + BA74722B7C68275BF230E648AC2F9EB2 /* FBSDKAccessTokenCacheV3.h */, + F9CB53CDDE68E68176FDF6DDEF6575C4 /* FBSDKAccessTokenCacheV3.m */, + 3AD63CD75E9A0FDE40A72D11D0E391D2 /* FBSDKAccessTokenCacheV3_17.h */, + AE36EBEAB6C1036E035A370DFF99A78A /* FBSDKAccessTokenCacheV3_17.m */, + 37D3094280BB79203F20BAD8FFE4AF8E /* FBSDKAccessTokenCacheV3_21.h */, + 71211E63A3051A65351D0631AC91E68F /* FBSDKAccessTokenCacheV3_21.m */, + B54068342B71382F8BE19A8D9AAF9D85 /* FBSDKAccessTokenCacheV4.h */, + 83F36036E90F38D20ECF2351FE6EDF11 /* FBSDKAccessTokenCacheV4.m */, + 502A084BF003C1444C64E0BF9CB6EDE1 /* FBSDKAccessTokenCaching.h */, + 9D5BD492AACF346D740215BF393A42F0 /* FBSDKAppEvents.h */, + B2FB269417A53A47EA02D735AB2B648E /* FBSDKAppEvents.m */, + B986B60BD6445564D539745478FB987F /* FBSDKAppEvents+Internal.h */, + 16ADD761D2DE6CCEF7AC9E77E566B496 /* FBSDKAppEventsDeviceInfo.h */, + 50614433F202CEBD51842BCD0B610E3C /* FBSDKAppEventsDeviceInfo.m */, + CB6C51F40B3416542CBFBF6D55B32E22 /* FBSDKAppEventsState.h */, + 76C4D614389C6B8EBE493619F413EAA4 /* FBSDKAppEventsState.m */, + 2600A152E768DAD7797AFFBB9D45F03D /* FBSDKAppEventsStateManager.h */, + D637D586849D95210171B7314E16B819 /* FBSDKAppEventsStateManager.m */, + 816BF555AFEE3CD3AE12100B131A83F0 /* FBSDKAppEventsUtility.h */, + F9961C4E64F5C3ACBBC54733669D0ECD /* FBSDKAppEventsUtility.m */, + 5E6B70CB24E9D9D440001D57E1A33C98 /* FBSDKApplicationDelegate.h */, + F57EED0783FADB24B6109EF61CCD1DB1 /* FBSDKApplicationDelegate.m */, + 5A9EB4606ECF9DBA06957513B48B2199 /* FBSDKApplicationDelegate+Internal.h */, + 0F3ECD653E76F1AB4851DCF2B8D601F3 /* FBSDKAppLinkResolver.h */, + 491456B665E9DA86DADB7373E06684B3 /* FBSDKAppLinkResolver.m */, + 2B52A085A3D62B3FF73FE55CABC473E5 /* FBSDKAppLinkUtility.h */, + 282B10273E830454869FB2DD72DA1655 /* FBSDKAppLinkUtility.m */, + 3B12F9655AC33B77EA212845EC5197DA /* FBSDKAudioResourceLoader.h */, + 085F39BE5F3501C0FA67900013CBF413 /* FBSDKAudioResourceLoader.m */, + 3E355D3496070355652064869DD32661 /* FBSDKBase64.h */, + D280713A1343A40C24E0C825EABA1CE0 /* FBSDKBase64.m */, + C354EAF888944E5583C78F3BA0725666 /* FBSDKBoltsMeasurementEventListener.h */, + 89E7DB57536C56FAC42F394738CA2311 /* FBSDKBoltsMeasurementEventListener.m */, + AA6E8F49344E0EB40DC229A33DD637A0 /* FBSDKBridgeAPICrypto.h */, + 4713CC066D5B38EB6FF939A23C5FB140 /* FBSDKBridgeAPICrypto.m */, + 5CEECC794A146848AE89A375494E23B9 /* FBSDKBridgeAPIProtocol.h */, + 8770E3F45D9D28E6808D3DA057AEFE1C /* FBSDKBridgeAPIProtocolNativeV1.h */, + 59246A2C66033C4BACBB0005E7E2BBBD /* FBSDKBridgeAPIProtocolNativeV1.m */, + BD6F5FD84D870265A3054285625A8016 /* FBSDKBridgeAPIProtocolType.h */, + CC2C004066771DC458B8D3EDC130B0D9 /* FBSDKBridgeAPIProtocolWebV1.h */, + AAF9C07CEE3BAA7ACAA4121D8FD81090 /* FBSDKBridgeAPIProtocolWebV1.m */, + 742779FECE16D8BA7466B48D50CE5E0B /* FBSDKBridgeAPIProtocolWebV2.h */, + 09EA75F5375F5276D93A285AA47AE389 /* FBSDKBridgeAPIProtocolWebV2.m */, + 82D411AF1F45945F96A6086C66B03BDB /* FBSDKBridgeAPIRequest.h */, + 69B4BAF446B6FBE961176084DB3DB55D /* FBSDKBridgeAPIRequest.m */, + 8ABDD0F86776A326D3DFCF22DD6175A6 /* FBSDKBridgeAPIRequest+Private.h */, + 7D148ED4CEEB4A77740DB46CB8EBAD10 /* FBSDKBridgeAPIResponse.h */, + A9E02D79E34E3DFF6FD8715DBEDF0320 /* FBSDKBridgeAPIResponse.m */, + 55FB332B435E1E90DE6742055E91ACAC /* FBSDKButton.h */, + DC4796735C12A93B95D67010D3896DDF /* FBSDKButton.m */, + 57AE7F29419866F38B816BA54F3E2AEE /* FBSDKButton+Subclass.h */, + 3B9629D41F3CB0D6362C249BAEF4DD8B /* FBSDKCloseIcon.h */, + 71FD8339B436644656B46AF2800569A3 /* FBSDKCloseIcon.m */, + 971AE23BDE3CC034036AF3A5F3F40D78 /* FBSDKColor.h */, + AED7C066E630477FC67F9C998362AAB5 /* FBSDKColor.m */, + 451845E88AA08B7394A5CB0105D07918 /* FBSDKConstants.h */, + 55BAC2DB8986680BC30B5DD9041668B9 /* FBSDKConstants.m */, + 9EB80277705A405E45FC321621F25720 /* FBSDKContainerViewController.h */, + B83478E98F3E802D34B1A388407E05B0 /* FBSDKContainerViewController.m */, + 1CD251398B9DE5770EC9C5F5CA1075CC /* FBSDKCopying.h */, + 1F3B4AA48D82F6B18B44186973A469E1 /* FBSDKCoreKit.h */, + 3C57B7083C6C0CD398E81F06426E9B5C /* FBSDKCoreKit+Internal.h */, + EF7F31B4CFDDB34FE09B69309E94BEBE /* FBSDKCrypto.h */, + E8091747ED012950E38E4FD3C2BADD49 /* FBSDKCrypto.m */, + 701EE70CD1027D551948BCACB19AEFC4 /* FBSDKDialogConfiguration.h */, + 717A2F909F9429472BE5288181A39CAB /* FBSDKDialogConfiguration.m */, + 8D7D9D759A3D05CE84BBEDB5164C1F62 /* FBSDKDynamicFrameworkLoader.h */, + 96A85F8F12895068432B3C50F55B32DF /* FBSDKError.h */, + 0C56B3E5B5068C0ABEC2C0105D19F910 /* FBSDKError.m */, + 174F96153183FD58339BF7605DB524E5 /* FBSDKErrorConfiguration.h */, + 4C4CC30B679BE94D4D58293805FE9558 /* FBSDKErrorConfiguration.m */, + 2FA4FA3CA61B6466B77AFF7E7AC93C7B /* FBSDKErrorRecoveryAttempter.h */, + B301B0B70E4E90079DD84F26918D4A8E /* FBSDKErrorRecoveryAttempter.m */, + 2BF6D70AC2E104E4088407E9C2CD59FC /* FBSDKErrorRecoveryConfiguration.h */, + E7EACD97913E41CA60721A3FF33C300B /* FBSDKErrorRecoveryConfiguration.m */, + 1C2D52447D3617C4435BBC9C23299611 /* FBSDKGraphErrorRecoveryProcessor.h */, + 7D86AF0FCC38E65C93DA09276FF4ECE0 /* FBSDKGraphErrorRecoveryProcessor.m */, + 79FFD024B17DCE13D082CD95D00FE966 /* FBSDKGraphRequest.h */, + 3A3748CB4300C1D9F5D42C93D6D1C714 /* FBSDKGraphRequest.m */, + D4279B24F97345021312F957E499D0A6 /* FBSDKGraphRequest+Internal.h */, + 4A5D9071C6C412E36472C5F19DAAC178 /* FBSDKGraphRequestBody.h */, + 1F52F6102FEDAEFA505CEF809314B9BD /* FBSDKGraphRequestBody.m */, + 44EBDEC66EB767895CA3F95522A427ED /* FBSDKGraphRequestConnection.h */, + A334906C1281DD4C315FFEEA1ECB14DD /* FBSDKGraphRequestConnection.m */, + 61D0077F67E9EFDC756CA1B826348CD6 /* FBSDKGraphRequestConnection+Internal.h */, + 237F169830057CBFED7527C1B12827F1 /* FBSDKGraphRequestDataAttachment.h */, + BD7AB9C8CE4F7FAC4AA9C21B6436D171 /* FBSDKGraphRequestDataAttachment.m */, + 4A047409FA3546AD9B64533610C62FA1 /* FBSDKGraphRequestMetadata.h */, + 8683F956D11B266E5AC2EEE8FE623B5B /* FBSDKGraphRequestMetadata.m */, + DCA84971ACA835D473FF3670D6AAA225 /* FBSDKGraphRequestPiggybackManager.h */, + C6F3BE3D5D0F4E92B3674A6C9C4049D2 /* FBSDKGraphRequestPiggybackManager.m */, + 2F39F0B74294A1DFCDF5F565086D5ECC /* FBSDKIcon.h */, + 4FBBE57B5789B844685BF7008B31D2C8 /* FBSDKIcon.m */, + EB01103EF88BDD2D63A48AB1B1029D95 /* FBSDKInternalUtility.h */, + 398DEB86D597B8C3B2654B6E997FF90A /* FBSDKInternalUtility.m */, + B21A583F9BA43A147842E4686672A494 /* FBSDKKeychainStore.h */, + C7B45749F7EE5706D0A4AECC8BBEB46E /* FBSDKKeychainStore.m */, + 62395CA9230E642A74C75E7BC54689FA /* FBSDKKeychainStoreViaBundleID.h */, + 447BA83039BC3B92739CE7121BFFF508 /* FBSDKKeychainStoreViaBundleID.m */, + 00C82D45FC8F798DB5BBBD21B9B8F4DC /* FBSDKLogger.h */, + 0B200546211F4DEBAA824FCCB1D6B5AD /* FBSDKLogger.m */, + AE6725846D1148F2B93BA63A67BE928F /* FBSDKLogo.h */, + 9F566A99D95B4CCDA3B38E3B6FF7F538 /* FBSDKLogo.m */, + F018E05A0D968A32CF67ACD6172BFF26 /* FBSDKMacros.h */, + D189CD6E7022F5E3795253EB16E31B44 /* FBSDKMaleSilhouetteIcon.h */, + ECBBA43BD2613AD7F55AE39385F989BF /* FBSDKMaleSilhouetteIcon.m */, + 18C289A6473A9A83C76CB08E0EE722B9 /* FBSDKMath.h */, + 7D6D458393B733BC6EA8DC2777E8A172 /* FBSDKMath.m */, + F5D16F303E935B275648EEBD42532800 /* FBSDKMonotonicTime.h */, + 958123A39C74BFB5B42758653A99EF03 /* FBSDKMonotonicTime.m */, + F13CAFC013EC2759ECDC78375FBE5546 /* FBSDKMutableCopying.h */, + B88AC3BD80A2ADD4F09E7A69AA5CA86F /* FBSDKPaymentObserver.h */, + 4CD1C7B81FEE0AFF6A976EEB2B41D997 /* FBSDKPaymentObserver.m */, + 63F5C2286E5E866A99ADCB9BDCD47193 /* FBSDKProfile.h */, + 70546F79ED989A805A363C6D952F1767 /* FBSDKProfile.m */, + 7CE333A8F39A243535D21286A772F09B /* FBSDKProfile+Internal.h */, + F2865B9A148712BD8A7876B34F00E8B0 /* FBSDKProfilePictureView.h */, + B21836A56CDDE5818D5D5F4F27AAD2E4 /* FBSDKProfilePictureView.m */, + 7989F275C86B2744E752EA3F99644B69 /* FBSDKServerConfiguration.h */, + AF20D633640B12C177853252FA9BB984 /* FBSDKServerConfiguration.m */, + 3E1ED945F691785269DE32DE62A3E72D /* FBSDKServerConfiguration+Internal.h */, + 7244A1F4E39D1B861FF0A42E44C9D4C4 /* FBSDKServerConfigurationManager.h */, + DD895E7DE10E3155FAA2894548F53B61 /* FBSDKServerConfigurationManager.m */, + E3E6A108F38043D568733C03E5086DCA /* FBSDKServerConfigurationManager+Internal.h */, + 3DFC4532E3E61D37A013015223C842C1 /* FBSDKSettings.h */, + 63588F04E1066D4FF9F51E6660A9AC8D /* FBSDKSettings.m */, + 3AA6E509E642D26DD297C87905B58D65 /* FBSDKSettings+Internal.h */, + FA61719DA40A89D49DB2CF2A54C509EB /* FBSDKSystemAccountStoreAdapter.h */, + E335A77A6371CE3ADE026F58C0F17DF9 /* FBSDKSystemAccountStoreAdapter.m */, + 92CEBE36EDFA59A8301F37FB767E221F /* FBSDKTestUsersManager.h */, + 619453A302401BD0FF8424613BFEF1DC /* FBSDKTestUsersManager.m */, + DC4D1B53E565D3099084E5803F62D86B /* FBSDKTimeSpentData.h */, + CDDBEA1384A41C459CD9825355A75FA9 /* FBSDKTimeSpentData.m */, + 58D29DEBEC40D2D91FD9317FAAE2676F /* FBSDKTriStateBOOL.h */, + C2B910FEA04E93A550E336CD0AE37263 /* FBSDKTriStateBOOL.m */, + A48FF8279FC537A0D479881CE0382475 /* FBSDKTypeUtility.h */, + 39B917A93A505CB3B7C1CDA2E4AD9133 /* FBSDKTypeUtility.m */, + 33E79838EE7B2EED417A1C0408DF63CA /* FBSDKUIUtility.h */, + 117616DCAF25DE7F8762F5811B575C08 /* FBSDKURLConnection.h */, + 9BC594D9F8C42BF6978F73806E64FE2A /* FBSDKURLConnection.m */, + 73E6858AE5F915455C51828D993A9722 /* FBSDKURLOpening.h */, + 4F3D2D0406EA2568E04C2651AE559235 /* FBSDKUtility.h */, + E089A4EC1B9A49BB7EF108F65091CB80 /* FBSDKUtility.m */, + C3DCA73ECDED4D24D157E854B9A0153B /* FBSDKViewImpressionTracker.h */, + B7D9A45BC1932C60309FB30832E435D0 /* FBSDKViewImpressionTracker.m */, + F3E4562D9905FCC1AFDD3E97DF4EB4D7 /* FBSDKWebDialog.h */, + E787ECD99234F0177D0C154074233A9B /* FBSDKWebDialog.m */, + CD70059B9065BEA37C71F253919DA723 /* FBSDKWebDialogView.h */, + 0B4E083908C5DC414BBCC49C85B2C648 /* FBSDKWebDialogView.m */, + ); + name = arc; + sourceTree = ""; + }; + E6BFFBC337C755242EC36925886D01AE /* Support Files */ = { + isa = PBXGroup; + children = ( + 14BB886B52CE8890301B019E94AFCFBC /* FBSDKShareKit.xcconfig */, + 8A8B8938D737E489B9B045A09217963B /* FBSDKShareKit-dummy.m */, + E57DB9A900B43FD789451E87CCE7A828 /* FBSDKShareKit-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/FBSDKShareKit"; + sourceTree = ""; + }; + F1D45C5E55A76CE41644E12A20666292 /* AFNetworking */ = { + isa = PBXGroup; + children = ( + B0E9256C497CC7E961D15960DED14507 /* AFNetworking.h */, + 7263DEE05245863A54C4EBCB6A356485 /* NSURLConnection */, + FC7A23F40672FD3E31CF6A81B70F528D /* NSURLSession */, + C1918B78853CA42BAC712DA2AAD3843C /* Reachability */, + 516769B3C8A6A0870FC44F66DCB61E80 /* Security */, + 40200456C49731F5CAB184DAE274D205 /* Serialization */, + 4CE3B5BBD02C96A69A667C98D649758B /* Support Files */, + 1C45A5CA4837E7E66B3E6CC1B2970E3C /* UIKit */, + ); + path = AFNetworking; + sourceTree = ""; + }; + F4676A70D6365769FE91D7E7AADEE5CC /* Products */ = { + isa = PBXGroup; + children = ( + 2250337F1EA2F90F41D343A24E9D8D64 /* libAFNetworking.a */, + 6F5C3C43709D8464F81A2AFBDB93F607 /* libBolts.a */, + DF8CAC0800562C284C3D65E7D665C530 /* libFBSDKCoreKit.a */, + FEC84A813A010E44BE85287A63099D7E /* libFBSDKShareKit.a */, + 26B094E3F3FE334849DF9622936BDE41 /* libPods.a */, + ); + name = Products; + sourceTree = ""; + }; + FC7A23F40672FD3E31CF6A81B70F528D /* NSURLSession */ = { + isa = PBXGroup; + children = ( + FCBCFB66D3AF0BC63DD6482811A4ECB6 /* AFHTTPSessionManager.h */, + F0EC6D867BCE4FB94683D0E032A446B9 /* AFHTTPSessionManager.m */, + EC6A6AB602095141AC0E4DC5009D0163 /* AFURLSessionManager.h */, + 8D09418454A8A965CBE2790A329C5645 /* AFURLSessionManager.m */, + ); + name = NSURLSession; + sourceTree = ""; + }; + FFD977C5D23FB16656C5D57197BAA49C /* iOS */ = { + isa = PBXGroup; + children = ( + 57F2B5E013FD1D42752E768761E043FC /* CoreGraphics.framework */, + 9C31A9B26388001B26382C7C355DA572 /* Foundation.framework */, + C2B240D99C3FC6A7DC6C66A2434CA799 /* MobileCoreServices.framework */, + A19DF616941A51576DD057A9FD8F4AD8 /* Security.framework */, + 7C168D5DBDB78691493E24B13EF6B6A8 /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 19C2B07A862CD221D4D5B9309876BAC3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A11240D567F7A3207F0F9882ED2AB75 /* _FBSDKTemporaryErrorRecoveryAttempter.h in Headers */, + 530AC824CCD371BAA717F8ACAB33F958 /* FBSDKAccessToken.h in Headers */, + 3E16E0BEF69F5BA97F8E9F07A617E509 /* FBSDKAccessTokenCache.h in Headers */, + B2C7E9065BD6BF8E3F3017B802865B56 /* FBSDKAccessTokenCacheV3.h in Headers */, + 85030A540670174CA31F4F4226C54C4F /* FBSDKAccessTokenCacheV3_17.h in Headers */, + BE0F6955D03D6DF536335CAC10A8CFC5 /* FBSDKAccessTokenCacheV3_21.h in Headers */, + CB7A2EB58EBA82B7CE519F8C2EEAFBC4 /* FBSDKAccessTokenCacheV4.h in Headers */, + 6F5BB8563523FEB8914557A0C379361F /* FBSDKAccessTokenCaching.h in Headers */, + CA0A64C7187BFF5B6143C3D3A7FF8D94 /* FBSDKAppEvents+Internal.h in Headers */, + 0C08BCEA5FE46370A36AEF6BEFCC41EA /* FBSDKAppEvents.h in Headers */, + A6D8B881BC31F26E99F56A4B5144F72D /* FBSDKAppEventsDeviceInfo.h in Headers */, + 216D6126C206D951C489C95FD37BD8CF /* FBSDKAppEventsState.h in Headers */, + C8E9B871537B5C88280E56A9778803A4 /* FBSDKAppEventsStateManager.h in Headers */, + AB7CAA7D0CB1D37DB84BF83644CF6E41 /* FBSDKAppEventsUtility.h in Headers */, + 4EC1B8AAA4341E02B888E2CDBED626DD /* FBSDKApplicationDelegate+Internal.h in Headers */, + 01A9C95FB174BF00024C127D94FAE9F9 /* FBSDKApplicationDelegate.h in Headers */, + 9B516F3168787E2C9732AC0C00479971 /* FBSDKAppLinkResolver.h in Headers */, + E10A2574E0EE99F47BC9CAC0AF33FC47 /* FBSDKAppLinkUtility.h in Headers */, + 81A2A1E607483054B4C595CA92987E08 /* FBSDKAudioResourceLoader.h in Headers */, + F4F96AF7AC5C83FA96E172128610B1F2 /* FBSDKBase64.h in Headers */, + 555466B7EA6454B1E1968FB7A7BD1334 /* FBSDKBoltsMeasurementEventListener.h in Headers */, + 4727F1C349747A7F96CA2EE6098BA7E6 /* FBSDKBridgeAPICrypto.h in Headers */, + 809C53B31BE1AC40886B82DFD238136D /* FBSDKBridgeAPIProtocol.h in Headers */, + 00163060B2D0C8870906DF0994834474 /* FBSDKBridgeAPIProtocolNativeV1.h in Headers */, + E7AC21B4D847D0F421132DCD478589F6 /* FBSDKBridgeAPIProtocolType.h in Headers */, + A248810839C65E5881B7B7B3F264078F /* FBSDKBridgeAPIProtocolWebV1.h in Headers */, + E0EAD57AC8EA4C3510C04CDDC9A28DE6 /* FBSDKBridgeAPIProtocolWebV2.h in Headers */, + 90F2175480DE7324ADEEF602757134D7 /* FBSDKBridgeAPIRequest+Private.h in Headers */, + 67F789F4A32CA7A82DE43CD27AEA87BD /* FBSDKBridgeAPIRequest.h in Headers */, + C8A8F4BE07EDC15A6921CD68990C0F98 /* FBSDKBridgeAPIResponse.h in Headers */, + 33808782CCEF801D53209D523D9C7358 /* FBSDKButton+Subclass.h in Headers */, + 926F1FF1ADA93F8BE4339C7AE28BD968 /* FBSDKButton.h in Headers */, + 3C0DEBB740DFB646BB292668FF187A3C /* FBSDKCloseIcon.h in Headers */, + E03421EE59E06D90EC9F0E07B93E1C2D /* FBSDKColor.h in Headers */, + 22E435D60724A7D16B950FC453C5E34C /* FBSDKConstants.h in Headers */, + 587ED101545A953414998ABFA4479B5D /* FBSDKContainerViewController.h in Headers */, + 138917EC340B4D359138CD16C4383D1D /* FBSDKCopying.h in Headers */, + 7051CE40FD16869F0BF9CD028A658782 /* FBSDKCoreKit+Internal.h in Headers */, + 156967851249D30F7710773EC47EB1F3 /* FBSDKCoreKit.h in Headers */, + 73518A8EAF46D85112E2CB85D02BF9C0 /* FBSDKCrypto.h in Headers */, + D183B6B66F20B85A64F5B7603D0A473B /* FBSDKDialogConfiguration.h in Headers */, + CF49B64886C0C73CE0EB0549FA20E21F /* FBSDKDynamicFrameworkLoader.h in Headers */, + AE279B6C3893C1BB12A7D761A8F70EA1 /* FBSDKError.h in Headers */, + E19528B349AA57299BED8F28FFCDB92D /* FBSDKErrorConfiguration.h in Headers */, + 77CF177F2CDC9BEBEF5BE1DD296E1E2C /* FBSDKErrorRecoveryAttempter.h in Headers */, + 1B732797EE1CF10C328DFDC742E866A6 /* FBSDKErrorRecoveryConfiguration.h in Headers */, + 7F35603B737B2A4B465CAE4B481C34BB /* FBSDKGraphErrorRecoveryProcessor.h in Headers */, + 62DDEB5456833B4AD3A84F7AADBE9099 /* FBSDKGraphRequest+Internal.h in Headers */, + AB8D18ED889E13CC5F738DD1A59CC510 /* FBSDKGraphRequest.h in Headers */, + 949F1878AC4A43632EFADACFC8140683 /* FBSDKGraphRequestBody.h in Headers */, + E47D4E86203EFA7643A44E5109117967 /* FBSDKGraphRequestConnection+Internal.h in Headers */, + A5E23287231B8CED31D97C44BA2702F9 /* FBSDKGraphRequestConnection.h in Headers */, + 50570F0F317C5A916AD5BE1D82F49641 /* FBSDKGraphRequestDataAttachment.h in Headers */, + 23F22339DEDBD778AB5D1DA13BFECC4F /* FBSDKGraphRequestMetadata.h in Headers */, + 4029E4F75B527907B5ADAD8E3E0264E2 /* FBSDKGraphRequestPiggybackManager.h in Headers */, + A9821C932984F979E72D5984C1E3A87E /* FBSDKIcon.h in Headers */, + 2453E44572F93FE8CFB1E9C2B07F8142 /* FBSDKInternalUtility.h in Headers */, + 31B7827480A2AD779C80D1E428F0F758 /* FBSDKKeychainStore.h in Headers */, + 8E3F310FB34E020A985BF37D34582619 /* FBSDKKeychainStoreViaBundleID.h in Headers */, + FEAB4AF7F2C57BDEFD6081038CFD20FB /* FBSDKLogger.h in Headers */, + 392F1056919E38CEDEB5A545DA4C820B /* FBSDKLogo.h in Headers */, + 307D54623092903A6C49A7C219BA3252 /* FBSDKMacros.h in Headers */, + 61BCC6DAB9276D969FCC0F848B69DB86 /* FBSDKMaleSilhouetteIcon.h in Headers */, + D1F17C848BA03A0D38CC8D8B815B75C8 /* FBSDKMath.h in Headers */, + 2617C1651BDE360A04512FF5DFEE55B1 /* FBSDKMonotonicTime.h in Headers */, + 5F2CF6350F306F78D40161C01EEDD731 /* FBSDKMutableCopying.h in Headers */, + E35FADAE8EF72A1419545CEE70610D27 /* FBSDKPaymentObserver.h in Headers */, + 9EFC61F27D88241A96D3FB13EF831E02 /* FBSDKProfile+Internal.h in Headers */, + 6B00AF25CFB12372D5281D7B9D51E3E2 /* FBSDKProfile.h in Headers */, + 78952ACEF38C155ADF7CA3B63C38A5E6 /* FBSDKProfilePictureView.h in Headers */, + 924D2586BFCD36A807E0E047454317A8 /* FBSDKServerConfiguration+Internal.h in Headers */, + DCF16A999DCFC281A8744148B305482C /* FBSDKServerConfiguration.h in Headers */, + E30BD9620B97DF000E8F31104048D432 /* FBSDKServerConfigurationManager+Internal.h in Headers */, + 444F2DDB714D8D83F59764F223E6EE70 /* FBSDKServerConfigurationManager.h in Headers */, + 210C00EF879DEDEA7EB09EC8C91A80A2 /* FBSDKSettings+Internal.h in Headers */, + 52474B3F869DBA64CC57CC8E1031F87B /* FBSDKSettings.h in Headers */, + 24FA587A203EB1838E92394C128065EA /* FBSDKSystemAccountStoreAdapter.h in Headers */, + 3C31ED01B7466FD05173FEB6F86953BA /* FBSDKTestUsersManager.h in Headers */, + 89E9143B078C3D9D56CDA6BE3AAA16D3 /* FBSDKTimeSpentData.h in Headers */, + 7569FD90D7667E15A7B67B62E4A72E5D /* FBSDKTriStateBOOL.h in Headers */, + FDF39F9BC888D9146BC087518C89A8F6 /* FBSDKTypeUtility.h in Headers */, + 1DFA8E2E3190F5321761EE4BE95C9ADC /* FBSDKUIUtility.h in Headers */, + 72DDA136310E1878B3393479B38B83F9 /* FBSDKURLConnection.h in Headers */, + 4505527808576A44D861B0A13154F425 /* FBSDKURLOpening.h in Headers */, + 1002547EB73320964BC1B10D757EAE2D /* FBSDKUtility.h in Headers */, + D2C8A050CA49DB3967B01D9B9354FC16 /* FBSDKViewImpressionTracker.h in Headers */, + C412C0A9241FD8CB88314EB3BD8E528C /* FBSDKWebDialog.h in Headers */, + A55D4E06A15BD0D7189518E2B96DB8A3 /* FBSDKWebDialogView.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 24CC375AC6BF6375B73651BB0872C62A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CBC28D34E7E02B4E254099B15B674080 /* BFAppLink.h in Headers */, + 336B220F124974D444746D194367422A /* BFAppLink_Internal.h in Headers */, + 96E1FE094390E35BE4E0D715675C16B0 /* BFAppLinkNavigation.h in Headers */, + 49A306F39FCE73FFB0E1A6589D331F35 /* BFAppLinkResolving.h in Headers */, + D963CE53920E664E9CAD6F4B834B315C /* BFAppLinkReturnToRefererController.h in Headers */, + E347F996B822D8480FF7B718185C46DD /* BFAppLinkReturnToRefererView.h in Headers */, + 5AF64E5EEA043722E238A8C5EE47A63A /* BFAppLinkReturnToRefererView_Internal.h in Headers */, + 5449D946ADE982013F5C2069E0BE45F0 /* BFAppLinkTarget.h in Headers */, + 06CC5B30A43EF1C3B526DEE380D8FE8A /* BFCancellationToken.h in Headers */, + E15B9B510B4BFB5AAF2F8BFAC5EBC997 /* BFCancellationTokenRegistration.h in Headers */, + FB9237E38009CB01D2D2BC136D5924B7 /* BFCancellationTokenSource.h in Headers */, + 7171DEAFC5A2F780E670B8395EF8F07B /* BFDefines.h in Headers */, + 012374FC7BF3C42864F8A6D9790C7836 /* BFExecutor.h in Headers */, + 80511BB81FC091E526BECA78607C0FC2 /* BFMeasurementEvent.h in Headers */, + 12D4BF5F8785937DA809F9D90E6FB565 /* BFMeasurementEvent_Internal.h in Headers */, + EC5F8395D48ED1C0BE2C2D7EB7D9F4B9 /* BFTask.h in Headers */, + 6D2E47E46AED98D49CD7E1D7DCA449B3 /* BFTaskCompletionSource.h in Headers */, + 2FBCC263A4CF83AF299AAC0CEE750AD6 /* BFURL.h in Headers */, + CF6A6DAB258596DF234FDDA9F2B214CF /* BFURL_Internal.h in Headers */, + 5208CEE9E04A230A895075F81179E9C0 /* BFWebViewAppLinkResolver.h in Headers */, + 4508BEB10E935ADE1BBC8AD18BB3F581 /* Bolts.h in Headers */, + 43A7D7D1E2E0828AC2FCD3155471E59E /* BoltsVersion.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3EB13134BE830329BA711C2AA10931C8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + DA880A2094CF94108583D78E4097D554 /* FBSDKAppGroupAddDialog.h in Headers */, + 5A1CB5B72C92E43BF844377DC72DA072 /* FBSDKAppGroupContent.h in Headers */, + 1BBA57EDDB94507AC5DAA85D6489D942 /* FBSDKAppGroupJoinDialog.h in Headers */, + 54D559AFA627AFA735FB0D6D878F5D7F /* FBSDKAppInviteContent.h in Headers */, + B17336576943ADD8ABE250E808D8B72D /* FBSDKAppInviteDialog.h in Headers */, + 35599C4F9F10FC09064011AE354E20C5 /* FBSDKCheckmarkIcon.h in Headers */, + 0BB5BE4B4A8C410F2248DE8D14BB4663 /* FBSDKGameRequestContent.h in Headers */, + 74D22BA7DDF7C44219CE3E793CE0AC6F /* FBSDKGameRequestDialog.h in Headers */, + 92D14F626066984B8740E9484071B7C1 /* FBSDKGameRequestFrictionlessRecipientCache.h in Headers */, + B84F69EEEA9898307D85749FD54502D0 /* FBSDKLikeActionController.h in Headers */, + C7DCD67DF808CAC96CFFB404088D2CC5 /* FBSDKLikeActionControllerCache.h in Headers */, + F48F08F807C465B2DC535CE521E66D97 /* FBSDKLikeBoxBorderView.h in Headers */, + 20CA33378056E289649C0616BF5C5E08 /* FBSDKLikeBoxView.h in Headers */, + E346D04E3F0539B358C1194F02FB8809 /* FBSDKLikeButton+Internal.h in Headers */, + 0E089188D74319CC3ED824652B776895 /* FBSDKLikeButton.h in Headers */, + 5FCA3879482A03418CCB75CE50EEA9C1 /* FBSDKLikeButtonPopWAV.h in Headers */, + EBB6F0BB04FCFC82D12723EF3E740261 /* FBSDKLikeControl+Internal.h in Headers */, + 7B38759EF062D9FF703E7D297DAB27E6 /* FBSDKLikeControl.h in Headers */, + B25E3751AB01594311494F5E9AFC5322 /* FBSDKLikeDialog.h in Headers */, + 34FE928299E6FCBB43826BDB66144FD7 /* FBSDKLikeObjectType.h in Headers */, + 097CE360D698CD7CC46F59B370318ED1 /* FBSDKLiking.h in Headers */, + 87E208C4BC2E8A5C74E1D01087F195FF /* FBSDKMessageDialog.h in Headers */, + 2DC488DF3C90086C17087C2BB72189AA /* FBSDKMessengerIcon.h in Headers */, + 0DB80F6F97A5BEB7A1839EBAF3FCA9AF /* FBSDKSendButton.h in Headers */, + A72805273E466C273A4B10C6ACB993AA /* FBSDKShareAPI.h in Headers */, + 64BD30EF98CC4A38D8BF92656D4A6AD0 /* FBSDKShareButton.h in Headers */, + B220008A1D3DD1B6628E2AC2A64A02AA /* FBSDKShareConstants.h in Headers */, + A1FCC931AC4A1A8D148E28C4572BB307 /* FBSDKShareDefines.h in Headers */, + 10B85E5BCE0729452FFC72D7BB376F59 /* FBSDKShareDialog.h in Headers */, + 44731A7D10EF496E7DED3DCA05410767 /* FBSDKShareDialogMode.h in Headers */, + A161B6BDF507ABF1322BB74A9D437D4B /* FBSDKShareError.h in Headers */, + 8AF36C0CC65E3A5D7AF4AEA8BEA5F8DD /* FBSDKShareKit+Internal.h in Headers */, + 205E1195DEF1603010BA47F3A8A39ACA /* FBSDKShareKit.h in Headers */, + 6EA031F1089FBD5D7E5DACD68EDC2F5A /* FBSDKShareLinkContent+Internal.h in Headers */, + C50BE142E604DE751E9B8AF5DD6B0363 /* FBSDKShareLinkContent.h in Headers */, + 488F77FF13E79A72AD87E8B838E827E4 /* FBSDKShareOpenGraphAction.h in Headers */, + E2D2F28DE8D25857A0143D0C99E1264C /* FBSDKShareOpenGraphContent.h in Headers */, + 3F7A18D123E044CFAC2A0D1322E727BF /* FBSDKShareOpenGraphObject.h in Headers */, + F1B80D56445F494B2F82BB577E4CB42A /* FBSDKShareOpenGraphValueContainer+Internal.h in Headers */, + 18C091723B432584B085686061A0CEE0 /* FBSDKShareOpenGraphValueContainer.h in Headers */, + 76EACBDAB632DF356DEB855DD97A09A6 /* FBSDKSharePhoto.h in Headers */, + 435602DE03BDC37F6F724BE3A943F1AB /* FBSDKSharePhotoContent.h in Headers */, + 1AD36782B0606C9AB186A075420F1EA3 /* FBSDKShareUtility.h in Headers */, + 22080662EA8952370B284F798F16D4B2 /* FBSDKShareVideo.h in Headers */, + EDB2BA3AEA3A7A4EC735BAF9804D75D4 /* FBSDKShareVideoContent.h in Headers */, + 4E5A7BE76B5EC309DAB207FAFB7FE7FC /* FBSDKSharing.h in Headers */, + E9BBD9ED8781DB4B08B9A35068B2E0D9 /* FBSDKSharingButton.h in Headers */, + F2614C38AA4BB27104AD7BAB99E2BDD3 /* FBSDKSharingContent.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E9C26A9D9761804867532D147CEA1D5A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 211D4EA06F5920376A069ACB55DF6006 /* AFHTTPRequestOperation.h in Headers */, + F4A1512E8C4D8C8194CBB276BF72A552 /* AFHTTPRequestOperationManager.h in Headers */, + DECD5915774351B8473476B041DD87D7 /* AFHTTPSessionManager.h in Headers */, + F4DCBA2A42A38C6E7A755182DA50DEA2 /* AFNetworkActivityIndicatorManager.h in Headers */, + 2B8269A87473D9F1259E9BD98E7588D3 /* AFNetworking.h in Headers */, + 78449FCC01114171AA3CCB45C6666206 /* AFNetworkReachabilityManager.h in Headers */, + 1CBDB47B210A0C2448C14A610BC6D4D6 /* AFSecurityPolicy.h in Headers */, + DB2E92A71137AD2E6993E8B0CE682C89 /* AFURLConnectionOperation.h in Headers */, + 495F717651B12E6496C72D16BCC28C29 /* AFURLRequestSerialization.h in Headers */, + 1E310D0CE3BE27EF253B6D822B0AEE5E /* AFURLResponseSerialization.h in Headers */, + 5CF0E043147B69E77976A2CCADFF18CA /* AFURLSessionManager.h in Headers */, + A28588D1CCB5253CF80509F30A1AF1A5 /* UIActivityIndicatorView+AFNetworking.h in Headers */, + 399AC825EE10F70364CE7B0AA89F466D /* UIAlertView+AFNetworking.h in Headers */, + 3A5B54373A45916EC8DE74D060DE5503 /* UIButton+AFNetworking.h in Headers */, + 903A0E1F82A29D285902CBB5A0828BE9 /* UIImage+AFNetworking.h in Headers */, + D4A65C2E29ACB340587FD41196176F8A /* UIImageView+AFNetworking.h in Headers */, + F4B03681047157E5C357E584147F5A46 /* UIKit+AFNetworking.h in Headers */, + C7ACDDE36465ACAF629FEC233B1BF172 /* UIProgressView+AFNetworking.h in Headers */, + C58268D5A4D2A786576E0EAA5B50FB93 /* UIRefreshControl+AFNetworking.h in Headers */, + A4EE8D1BEE38B87066BAA1B09A047356 /* UIWebView+AFNetworking.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 410B25DF16EA5C5B3E2698F74F9625FB /* AFNetworking */ = { + isa = PBXNativeTarget; + buildConfigurationList = 41F6B64BF089D072A394601910D14E7B /* Build configuration list for PBXNativeTarget "AFNetworking" */; + buildPhases = ( + 9D44B0AD2D97CB2AA74B614C1E92EDCF /* Sources */, + F428C0A5C7AEF469CC7F9B7E6EC0003A /* Frameworks */, + E9C26A9D9761804867532D147CEA1D5A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AFNetworking; + productName = AFNetworking; + productReference = 2250337F1EA2F90F41D343A24E9D8D64 /* libAFNetworking.a */; + productType = "com.apple.product-type.library.static"; + }; + 81D7FE2A0FD9258247B1232874B837DA /* FBSDKCoreKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D5140DAF776FF373AAB7D42B9292675 /* Build configuration list for PBXNativeTarget "FBSDKCoreKit" */; + buildPhases = ( + 678CA587F9F0CD82C2737EC72B7D49E6 /* Sources */, + 06397B19B46BC23B4020A7016F06E806 /* Frameworks */, + 19C2B07A862CD221D4D5B9309876BAC3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + F7688FE10814D6B183CC1B9B3F9F7B56 /* PBXTargetDependency */, + ); + name = FBSDKCoreKit; + productName = FBSDKCoreKit; + productReference = DF8CAC0800562C284C3D65E7D665C530 /* libFBSDKCoreKit.a */; + productType = "com.apple.product-type.library.static"; + }; + A48601FEE4437A924848DB48369BA809 /* Bolts */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA34C800AB38CCECE78A9E7D6EB38344 /* Build configuration list for PBXNativeTarget "Bolts" */; + buildPhases = ( + 020ACAA02DAD5E45B62595CFFE1CC884 /* Sources */, + 4B6FCC51F24F6991AAA4CC61597FD2DA /* Frameworks */, + 24CC375AC6BF6375B73651BB0872C62A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Bolts; + productName = Bolts; + productReference = 6F5C3C43709D8464F81A2AFBDB93F607 /* libBolts.a */; + productType = "com.apple.product-type.library.static"; + }; + BAEBBFC883BE338E7E8BBCC9BDD992A8 /* Pods */ = { + isa = PBXNativeTarget; + buildConfigurationList = A1DC29CC7457F692C9B9A15C76384D54 /* Build configuration list for PBXNativeTarget "Pods" */; + buildPhases = ( + B5DBC939689F59143DBA55AB445CDFAC /* Sources */, + E777CC223E33975CFF446FF32A8981C0 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + A0A49FF25F83E7AB56EF2BA0858C0A28 /* PBXTargetDependency */, + 35B5C907D81CA752B162FABE07FCF33E /* PBXTargetDependency */, + B625A994822A8BF243421755790D0A2F /* PBXTargetDependency */, + 3AFAAC5C0600B56077379F0EBF7781B3 /* PBXTargetDependency */, + ); + name = Pods; + productName = Pods; + productReference = 26B094E3F3FE334849DF9622936BDE41 /* libPods.a */; + productType = "com.apple.product-type.library.static"; + }; + C78CAB9013653EB1A250B2DFD3BC7666 /* FBSDKShareKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 58770B39DB702F4BF658BBDB3D144297 /* Build configuration list for PBXNativeTarget "FBSDKShareKit" */; + buildPhases = ( + 6D58EE024B08316911051FCE3FA6EBDC /* Sources */, + AB6236FDABEA71A344A72311A20E9129 /* Frameworks */, + 3EB13134BE830329BA711C2AA10931C8 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + CD37FC7A32B6A7B6629457EB67E933A8 /* PBXTargetDependency */, + ); + name = FBSDKShareKit; + productName = FBSDKShareKit; + productReference = FEC84A813A010E44BE85287A63099D7E /* libFBSDKShareKit.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = F4676A70D6365769FE91D7E7AADEE5CC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 410B25DF16EA5C5B3E2698F74F9625FB /* AFNetworking */, + A48601FEE4437A924848DB48369BA809 /* Bolts */, + 81D7FE2A0FD9258247B1232874B837DA /* FBSDKCoreKit */, + C78CAB9013653EB1A250B2DFD3BC7666 /* FBSDKShareKit */, + BAEBBFC883BE338E7E8BBCC9BDD992A8 /* Pods */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 020ACAA02DAD5E45B62595CFFE1CC884 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 07B38C643DE61100C2471A5E2061DB6D /* BFAppLink.m in Sources */, + 58F4A4DF57C22014622BB042607EB8EE /* BFAppLinkNavigation.m in Sources */, + B1B5542A3966742AC81F380E955AA85B /* BFAppLinkReturnToRefererController.m in Sources */, + A0F75CBE72EE4F9B74838F6F01191D06 /* BFAppLinkReturnToRefererView.m in Sources */, + 1540A63B0BF8B0C782AE91A5B67FEF38 /* BFAppLinkTarget.m in Sources */, + F50BE85096146332D4C00C17546561DA /* BFCancellationToken.m in Sources */, + FCDC22BD5A90775000A728831060EDCC /* BFCancellationTokenRegistration.m in Sources */, + 196864B89AC2C8A21D31595D9A7E05A0 /* BFCancellationTokenSource.m in Sources */, + B68EF6DB36966D13E557D2247702E8C5 /* BFExecutor.m in Sources */, + 18D7A90C450EC893C4428E23D8B47E9F /* BFMeasurementEvent.m in Sources */, + D6B9D996B48B90EB489E54CDC7A9D401 /* BFTask.m in Sources */, + 0AAD3502C3D2BB1E3E7F4377C5111691 /* BFTaskCompletionSource.m in Sources */, + 4426214315E4D8313D27EE3F16CF8C13 /* BFURL.m in Sources */, + F6C1716F0805EA68532FF09E380B40D7 /* BFWebViewAppLinkResolver.m in Sources */, + 634D85A94A89FB79C887AEB085DECA60 /* Bolts-dummy.m in Sources */, + EC7025C98AE47F5E2D9CBEA4AC041890 /* Bolts.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 678CA587F9F0CD82C2737EC72B7D49E6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB1151A40AE6E5AA064A5AAC684EEF46 /* _FBSDKTemporaryErrorRecoveryAttempter.m in Sources */, + D5EE317B7D0E35A376DF8328CEA3252B /* FBSDKAccessToken.m in Sources */, + 33E51CF359A60B9BF66BE9C279AB3E43 /* FBSDKAccessTokenCache.m in Sources */, + 9B7B596E21B20063D8870D27F93990BF /* FBSDKAccessTokenCacheV3.m in Sources */, + D4163483905F3CE49898DD8AAC0E0910 /* FBSDKAccessTokenCacheV3_17.m in Sources */, + 4BC610C052636A802256616F808FD2AE /* FBSDKAccessTokenCacheV3_21.m in Sources */, + E159EF1028A9794B189D47DD79C6A0CC /* FBSDKAccessTokenCacheV4.m in Sources */, + 74B1B04C2705C12FDA25D308C6F8F669 /* FBSDKAppEvents.m in Sources */, + 3B88684885F6A92894F9B1C6DF2CB127 /* FBSDKAppEventsDeviceInfo.m in Sources */, + FF6C07931C151FAE59F3FB55F032AF23 /* FBSDKAppEventsState.m in Sources */, + A9D01434F1CFFFF1277E3429A43FA1C0 /* FBSDKAppEventsStateManager.m in Sources */, + 2A2484F1773729BB256973910B7340DB /* FBSDKAppEventsUtility.m in Sources */, + 1D840EA09132B2B34413FA16BD0E1AA5 /* FBSDKApplicationDelegate.m in Sources */, + 7CE53AEEEB82A1729F0A343B85F1FA7E /* FBSDKAppLinkResolver.m in Sources */, + BC852E5C003C0E1C337D9C642F826513 /* FBSDKAppLinkUtility.m in Sources */, + BFAAE2E16A1F2007BD7CDF1DB8D2CDAD /* FBSDKAudioResourceLoader.m in Sources */, + 25C893D3F81918CA2748927B5F02A595 /* FBSDKBase64.m in Sources */, + 8D9E418F4BF4FF9ABF3F4E5932589C3D /* FBSDKBoltsMeasurementEventListener.m in Sources */, + 77B5397CB9EB225E9C0BB7318B12E949 /* FBSDKBridgeAPICrypto.m in Sources */, + 86444AC2A924F63C45BEC54A0DDB7E8E /* FBSDKBridgeAPIProtocolNativeV1.m in Sources */, + C0C7A1E73D584A4F93A286FA1753D5B1 /* FBSDKBridgeAPIProtocolWebV1.m in Sources */, + 2E87F7494BC2023ED83CCB2C93E67B69 /* FBSDKBridgeAPIProtocolWebV2.m in Sources */, + 1345483A67FB02C778D2D3639930AED7 /* FBSDKBridgeAPIRequest.m in Sources */, + E81433D0931C25789180EA53A62C940E /* FBSDKBridgeAPIResponse.m in Sources */, + 18CF81105FB6E0685A26F83F128F4E47 /* FBSDKButton.m in Sources */, + 6C6B44FB16E5ABD292E2D77D89DDFF32 /* FBSDKCloseIcon.m in Sources */, + 8392255CCB63818562D4F58555DDDB08 /* FBSDKColor.m in Sources */, + E497F7EAC903A7C28D8CC1FD0D90CCDF /* FBSDKConstants.m in Sources */, + 905D0A5FE23B08D47AA9AB3F584B626D /* FBSDKContainerViewController.m in Sources */, + A4AA61EF4E7E175383F829835B3690B6 /* FBSDKCoreKit-dummy.m in Sources */, + 9E1DFD298D2638A443CF2EA5B47BFC51 /* FBSDKCrypto.m in Sources */, + C95B6FEA0DB3899E1F52C07D40DD4DA0 /* FBSDKDialogConfiguration.m in Sources */, + 2A9CDB714501BF7551C376135E06CB77 /* FBSDKDynamicFrameworkLoader.m in Sources */, + 9D1E20F07E1C09F60E2F35F6119A0F42 /* FBSDKError.m in Sources */, + 2F4C116B777496BAB15E7D6442D221BF /* FBSDKErrorConfiguration.m in Sources */, + D466AEB0B97EDC9663AFFD5F94C04630 /* FBSDKErrorRecoveryAttempter.m in Sources */, + 3B34B9CF9A34E235FD457006303C757D /* FBSDKErrorRecoveryConfiguration.m in Sources */, + 8CDAFE25429AD7F8885827F293890076 /* FBSDKGraphErrorRecoveryProcessor.m in Sources */, + 41CCAB61BAA581E58CB30F56F9F372F4 /* FBSDKGraphRequest.m in Sources */, + 1F2BB357DDF0A1CE916761ED5DBB98D2 /* FBSDKGraphRequestBody.m in Sources */, + 9F3D3656F5864DED6AF668D1AB68975E /* FBSDKGraphRequestConnection.m in Sources */, + 361A366D11CECA15C3B45FC3ACEDA050 /* FBSDKGraphRequestDataAttachment.m in Sources */, + 591FE63D036F4A539784293BCAD97493 /* FBSDKGraphRequestMetadata.m in Sources */, + E6D6A687F8FD1088F5EBB283308B0DC2 /* FBSDKGraphRequestPiggybackManager.m in Sources */, + A661008071892B0148336A0636FC59A1 /* FBSDKIcon.m in Sources */, + A18206D679C80B4AFF6654B5677DBFDB /* FBSDKInternalUtility.m in Sources */, + 41DDB4BD2A89F44F733C82B65BE76ACA /* FBSDKKeychainStore.m in Sources */, + D3CBA0C9A2F20A2AE8D9E8FA5F2326DA /* FBSDKKeychainStoreViaBundleID.m in Sources */, + 774E19492156820F5CC848D34D9AA4A6 /* FBSDKLogger.m in Sources */, + 25435509864D8830160361E72AA5E31F /* FBSDKLogo.m in Sources */, + 83C5AD87D4B7BF94A4B000FC4C254798 /* FBSDKMaleSilhouetteIcon.m in Sources */, + 97996933B25E24DAF9D18F8E188B03CA /* FBSDKMath.m in Sources */, + FA27E23894DFC2F77A0EA14C2D1A3DD4 /* FBSDKMonotonicTime.m in Sources */, + E97B61F439BAE5B0BC4AE0382AF6E4B3 /* FBSDKPaymentObserver.m in Sources */, + EE76A64B08255C079A379BC77864B85F /* FBSDKProfile.m in Sources */, + DA96A28C136407B16A3F0C70656042AF /* FBSDKProfilePictureView.m in Sources */, + 42F787E07A69C27C09E049303C8E8530 /* FBSDKServerConfiguration.m in Sources */, + E461DC7FBE41300801EE6D160AE29860 /* FBSDKServerConfigurationManager.m in Sources */, + 82360B32AC1B887E85DC592D62CB046F /* FBSDKSettings.m in Sources */, + D97FDB91BBA6D010CA658A611FC4A9A1 /* FBSDKSystemAccountStoreAdapter.m in Sources */, + 264457704BDD888C92CAAEBE20E709FC /* FBSDKTestUsersManager.m in Sources */, + 1D66DABAD4D2C36AAF8062BE3D55C7DB /* FBSDKTimeSpentData.m in Sources */, + EA3208DE2E2A3C5B240A0C832A77DDCF /* FBSDKTriStateBOOL.m in Sources */, + 5E1AB8EC72407D7A56EE8074AC99F4AC /* FBSDKTypeUtility.m in Sources */, + DDAB1F17EC68C8B719BA8C80FB5DC317 /* FBSDKURLConnection.m in Sources */, + 69F828062553D0A5623207630EB9FB21 /* FBSDKUtility.m in Sources */, + 9AB561BA236CB930E21B38DE886155A6 /* FBSDKViewImpressionTracker.m in Sources */, + 578485DD86226126B8E08842D826D2DC /* FBSDKWebDialog.m in Sources */, + 899C1F6FEAF906667F0E67D51EDA44FD /* FBSDKWebDialogView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D58EE024B08316911051FCE3FA6EBDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DE479B83E277F9913E9A6CBE17BD6B3E /* FBSDKAppGroupAddDialog.m in Sources */, + 18EAF4167A160D50758673E49250402C /* FBSDKAppGroupContent.m in Sources */, + CFFAEE251FC130E14DF2831B504F748D /* FBSDKAppGroupJoinDialog.m in Sources */, + 0A6A5BA0942FF096A2D641E8F49C0F79 /* FBSDKAppInviteContent.m in Sources */, + CEF61BB75902C8E0148259A5DF63854E /* FBSDKAppInviteDialog.m in Sources */, + 3053488EEEBCD0385576315DBE9EC11E /* FBSDKCheckmarkIcon.m in Sources */, + 8071A999E075ED48380A5AAACDA0E0E9 /* FBSDKGameRequestContent.m in Sources */, + 8C66B8A503EE7CDAF2C8B843D7839113 /* FBSDKGameRequestDialog.m in Sources */, + 3C6DF2FA1EA6BE60192A77E7270D6212 /* FBSDKGameRequestFrictionlessRecipientCache.m in Sources */, + F10CE2BA1CE785FB8EC2CE0595A7FBBE /* FBSDKLikeActionController.m in Sources */, + 2FB0531893E490ACEC556B0F43C44591 /* FBSDKLikeActionControllerCache.m in Sources */, + EED88C9780961006A6F988AFECD7BED3 /* FBSDKLikeBoxBorderView.m in Sources */, + F7E42776080FF0BDBE07365A2AFE2834 /* FBSDKLikeBoxView.m in Sources */, + F9198070ED60C8E1F3AF0910B05EA446 /* FBSDKLikeButton.m in Sources */, + 796EC3DD53C2C28010D03E1E323A1DDB /* FBSDKLikeButtonPopWAV.m in Sources */, + 3DDFA2D0FCEE1978143B685D1C3A9D7A /* FBSDKLikeControl.m in Sources */, + 21E2ED6EFD8559848B98705909DEA010 /* FBSDKLikeDialog.m in Sources */, + B28E7BE90D0898F34164A3649D16E978 /* FBSDKLikeObjectType.m in Sources */, + 081F6FAFE0FC8BD6EFC6A517B0ADB614 /* FBSDKMessageDialog.m in Sources */, + 4A7FBB52488D368CFDFDB1B6516C2CE4 /* FBSDKMessengerIcon.m in Sources */, + B4035BD0031BD154E70AF698B10B48A7 /* FBSDKSendButton.m in Sources */, + 1E8874FFFC0B19D20C001681F1942855 /* FBSDKShareAPI.m in Sources */, + 34B1786FA4EBC179AC660B83CF1A4F82 /* FBSDKShareButton.m in Sources */, + 4458C6C127D3030A17A791B3BA9A0CE0 /* FBSDKShareConstants.m in Sources */, + 4A4CF9C7D69DC9049FD677165FADA59E /* FBSDKShareDialog.m in Sources */, + 827A9685D68B9BD092DD85970625C1F2 /* FBSDKShareDialogMode.m in Sources */, + 98350E1EE789CEB57D91ADF6F225D62E /* FBSDKShareError.m in Sources */, + 2BFE426FBB2EF7A91EAC0893828A3F5C /* FBSDKShareKit-dummy.m in Sources */, + 16E3CEBF59A2D8E5A9B04AF979FDF14A /* FBSDKShareLinkContent.m in Sources */, + BAF2CCC3F6782690F1534565B877278F /* FBSDKShareOpenGraphAction.m in Sources */, + A31552A8B1F14534DDBA1DFC4E09C195 /* FBSDKShareOpenGraphContent.m in Sources */, + EBE1D926D326775167E082772E23D000 /* FBSDKShareOpenGraphObject.m in Sources */, + 51F742896037EA588D6157B105922B77 /* FBSDKShareOpenGraphValueContainer.m in Sources */, + 2763640E3F9F25BCE1BC36B60364A740 /* FBSDKSharePhoto.m in Sources */, + 2B868B020F9C681F76C506EF6BC9A801 /* FBSDKSharePhotoContent.m in Sources */, + 29E9B7D045DD5219B0D17A1289A1E228 /* FBSDKShareUtility.m in Sources */, + E571D44B22235633760C6FB955906D99 /* FBSDKShareVideo.m in Sources */, + 57503516957EEFAFFAD7A789730E7B9C /* FBSDKShareVideoContent.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9D44B0AD2D97CB2AA74B614C1E92EDCF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 876C2EF5FE318346CDCB4BFE25A9D5B2 /* AFHTTPRequestOperation.m in Sources */, + 472A6BFCC6207D98F787649BDF44A1BE /* AFHTTPRequestOperationManager.m in Sources */, + 2CF66E8669A348C421E93F2F67C6A61E /* AFHTTPSessionManager.m in Sources */, + B2B5DEC33B644F946C59F656AAAA8146 /* AFNetworkActivityIndicatorManager.m in Sources */, + B9DAA002CF3E0E8EBE9B6E9A7778CFD4 /* AFNetworking-dummy.m in Sources */, + BC7993B7436D4D7FADE6DD554DA52769 /* AFNetworkReachabilityManager.m in Sources */, + B12AD2EE044D6F7424F75F1506B516B2 /* AFSecurityPolicy.m in Sources */, + E6DD6ABB4FC13B60FA54C950FB6B262B /* AFURLConnectionOperation.m in Sources */, + 3033C63AC334D346E9461D0942D8FB69 /* AFURLRequestSerialization.m in Sources */, + CAA0F8074B35A2F73890310EC4521A0D /* AFURLResponseSerialization.m in Sources */, + 6CC4B79C1FEE1E7B3F2860ADA479D381 /* AFURLSessionManager.m in Sources */, + AE607E682415FAA160B33C7C13A8475B /* UIActivityIndicatorView+AFNetworking.m in Sources */, + 9B47A1441B897F71505D8BE670B0940B /* UIAlertView+AFNetworking.m in Sources */, + 99E82D6DC032555656E37AF2367B20D3 /* UIButton+AFNetworking.m in Sources */, + D070B784EFCA099C141EEAB69FBCC870 /* UIImageView+AFNetworking.m in Sources */, + FD6F966F458CEE40B07A2367BA3BC8EC /* UIProgressView+AFNetworking.m in Sources */, + 854BC4449D8CAD0F2799B021D1914C3B /* UIRefreshControl+AFNetworking.m in Sources */, + 9A04E971065AF4281E43947994A53D07 /* UIWebView+AFNetworking.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B5DBC939689F59143DBA55AB445CDFAC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D42A66A100E6AAB6AF472659973366E4 /* Pods-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 35B5C907D81CA752B162FABE07FCF33E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Bolts; + target = A48601FEE4437A924848DB48369BA809 /* Bolts */; + targetProxy = 1BD9E4E1851B054D16E88E72186755AA /* PBXContainerItemProxy */; + }; + 3AFAAC5C0600B56077379F0EBF7781B3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FBSDKShareKit; + target = C78CAB9013653EB1A250B2DFD3BC7666 /* FBSDKShareKit */; + targetProxy = B05D26F76A7077C30E0DCB99776E075A /* PBXContainerItemProxy */; + }; + A0A49FF25F83E7AB56EF2BA0858C0A28 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AFNetworking; + target = 410B25DF16EA5C5B3E2698F74F9625FB /* AFNetworking */; + targetProxy = 4344EF62FB5DFF627E06D3834642E63F /* PBXContainerItemProxy */; + }; + B625A994822A8BF243421755790D0A2F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FBSDKCoreKit; + target = 81D7FE2A0FD9258247B1232874B837DA /* FBSDKCoreKit */; + targetProxy = 665C00EDA998F3310E3AA1D64A0AC160 /* PBXContainerItemProxy */; + }; + CD37FC7A32B6A7B6629457EB67E933A8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FBSDKCoreKit; + target = 81D7FE2A0FD9258247B1232874B837DA /* FBSDKCoreKit */; + targetProxy = F2525FB3B5405DC4B1BAF37F01F4D2AB /* PBXContainerItemProxy */; + }; + F7688FE10814D6B183CC1B9B3F9F7B56 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Bolts; + target = A48601FEE4437A924848DB48369BA809 /* Bolts */; + targetProxy = 5F9ACE740BBE74B9EF18ED10D402EBFB /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0BEB7BFC34D620410E8215AD748D2773 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5372D999245395E50C3D972BC275C238 /* FBSDKCoreKit.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 209E94899E6B4FE507E0CF7D788E0268 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14BB886B52CE8890301B019E94AFCFBC /* FBSDKShareKit.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 24B25368AAF504B554D4C856BA9E3045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 99E7F0778A133A014C1B246703530484 /* AFNetworking.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 5CE5176205D06FF3FFE3DDDA9291E44B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 658C1A12EF15301743B29B1908F2C375 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5372D999245395E50C3D972BC275C238 /* FBSDKCoreKit.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 74857149DC1E0D599B8A01A78349A926 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B0523405BF6210BE41C3DD642D2CCF13 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 98C98CDFB3F20F2925F6CD1F141BB14F /* Pods.release.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + D3D469AD90AC72A8E2986FBE998DA83E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 99E7F0778A133A014C1B246703530484 /* AFNetworking.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + E6F99486C4730AA5797898005863FB56 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14BB886B52CE8890301B019E94AFCFBC /* FBSDKShareKit.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + E8E3ABDAF12C8378694EE61A9091F787 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CC5A41F359C40F92D1FB980A30F06A28 /* Bolts.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Bolts/Bolts-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + F5526807BF2C14D6BD59E488B888E604 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CC5A41F359C40F92D1FB980A30F06A28 /* Bolts.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Bolts/Bolts-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + FCC3BB43FE4B8EE1F56FE60E0078978A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E762F23EC34ED4A6FF3312D84E33A40 /* Pods.debug.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5CE5176205D06FF3FFE3DDDA9291E44B /* Debug */, + 74857149DC1E0D599B8A01A78349A926 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 41F6B64BF089D072A394601910D14E7B /* Build configuration list for PBXNativeTarget "AFNetworking" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24B25368AAF504B554D4C856BA9E3045 /* Debug */, + D3D469AD90AC72A8E2986FBE998DA83E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 58770B39DB702F4BF658BBDB3D144297 /* Build configuration list for PBXNativeTarget "FBSDKShareKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E6F99486C4730AA5797898005863FB56 /* Debug */, + 209E94899E6B4FE507E0CF7D788E0268 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D5140DAF776FF373AAB7D42B9292675 /* Build configuration list for PBXNativeTarget "FBSDKCoreKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 658C1A12EF15301743B29B1908F2C375 /* Debug */, + 0BEB7BFC34D620410E8215AD748D2773 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A1DC29CC7457F692C9B9A15C76384D54 /* Build configuration list for PBXNativeTarget "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FCC3BB43FE4B8EE1F56FE60E0078978A /* Debug */, + B0523405BF6210BE41C3DD642D2CCF13 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CA34C800AB38CCECE78A9E7D6EB38344 /* Build configuration list for PBXNativeTarget "Bolts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E8E3ABDAF12C8378694EE61A9091F787 /* Debug */, + F5526807BF2C14D6BD59E488B888E604 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m b/Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m new file mode 100644 index 0000000..6a29cf8 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_AFNetworking : NSObject +@end +@implementation PodsDummy_AFNetworking +@end diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch b/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch new file mode 100644 index 0000000..1e116a3 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch @@ -0,0 +1,11 @@ +#ifdef __OBJC__ +#import +#endif + +#ifndef TARGET_OS_IOS + #define TARGET_OS_IOS TARGET_OS_IPHONE +#endif + +#ifndef TARGET_OS_WATCH + #define TARGET_OS_WATCH 0 +#endif diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig b/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig new file mode 100644 index 0000000..94e31da --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AFNetworking" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_LDFLAGS = -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/Bolts/Bolts-dummy.m b/Pods/Target Support Files/Bolts/Bolts-dummy.m new file mode 100644 index 0000000..aeabf61 --- /dev/null +++ b/Pods/Target Support Files/Bolts/Bolts-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Bolts : NSObject +@end +@implementation PodsDummy_Bolts +@end diff --git a/Pods/Target Support Files/Bolts/Bolts-prefix.pch b/Pods/Target Support Files/Bolts/Bolts-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/Bolts/Bolts-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/Bolts/Bolts.xcconfig b/Pods/Target Support Files/Bolts/Bolts.xcconfig new file mode 100644 index 0000000..b8908b0 --- /dev/null +++ b/Pods/Target Support Files/Bolts/Bolts.xcconfig @@ -0,0 +1,4 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Bolts" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m new file mode 100644 index 0000000..eb4f9df --- /dev/null +++ b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FBSDKCoreKit : NSObject +@end +@implementation PodsDummy_FBSDKCoreKit +@end diff --git a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig new file mode 100644 index 0000000..194d046 --- /dev/null +++ b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_LDFLAGS = -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m new file mode 100644 index 0000000..8f70249 --- /dev/null +++ b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FBSDKShareKit : NSObject +@end +@implementation PodsDummy_FBSDKShareKit +@end diff --git a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig new file mode 100644 index 0000000..11bcdd1 --- /dev/null +++ b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSDKShareKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_LDFLAGS = -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown new file mode 100644 index 0000000..b283853 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown @@ -0,0 +1,101 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AFNetworking + +Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +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. + + +## Bolts + +BSD License + +For Bolts software + +Copyright (c) 2013-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## FBSDKCoreKit + +Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +copy, modify, and distribute this software in source code or binary form for use +in connection with the web services and APIs provided by Facebook. + +As with any software that integrates with the Facebook platform, your use of +this software is subject to the Facebook Developer Principles and Policies +[http://developers.facebook.com/policy/]. This copyright 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. + + +## FBSDKShareKit + +Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +copy, modify, and distribute this software in source code or binary form for use +in connection with the web services and APIs provided by Facebook. + +As with any software that integrates with the Facebook platform, your use of +this software is subject to the Facebook Developer Principles and Policies +[http://developers.facebook.com/policy/]. This copyright 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. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/Pods/Target Support Files/Pods/Pods-acknowledgements.plist new file mode 100644 index 0000000..34c2f1e --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-acknowledgements.plist @@ -0,0 +1,143 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +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. + + Title + AFNetworking + Type + PSGroupSpecifier + + + FooterText + BSD License + +For Bolts software + +Copyright (c) 2013-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Title + Bolts + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +copy, modify, and distribute this software in source code or binary form for use +in connection with the web services and APIs provided by Facebook. + +As with any software that integrates with the Facebook platform, your use of +this software is subject to the Facebook Developer Principles and Policies +[http://developers.facebook.com/policy/]. This copyright 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. + + Title + FBSDKCoreKit + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +copy, modify, and distribute this software in source code or binary form for use +in connection with the web services and APIs provided by Facebook. + +As with any software that integrates with the Facebook platform, your use of +this software is subject to the Facebook Developer Principles and Policies +[http://developers.facebook.com/policy/]. This copyright 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. + + Title + FBSDKShareKit + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods/Pods-dummy.m b/Pods/Target Support Files/Pods/Pods-dummy.m new file mode 100644 index 0000000..ade64bd --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods : NSObject +@end +@implementation PodsDummy_Pods +@end diff --git a/Pods/Target Support Files/Pods/Pods-frameworks.sh b/Pods/Target Support Files/Pods/Pods-frameworks.sh new file mode 100755 index 0000000..6f76344 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-frameworks.sh @@ -0,0 +1,84 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + diff --git a/Pods/Target Support Files/Pods/Pods-resources.sh b/Pods/Target Support Files/Pods/Pods-resources.sh new file mode 100755 index 0000000..16774fb --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/Pods/Target Support Files/Pods/Pods.debug.xcconfig new file mode 100644 index 0000000..9d38451 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods.debug.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"Bolts" -l"FBSDKCoreKit" -l"FBSDKShareKit" -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods/Pods.release.xcconfig b/Pods/Target Support Files/Pods/Pods.release.xcconfig new file mode 100644 index 0000000..9d38451 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods.release.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"Bolts" -l"FBSDKCoreKit" -l"FBSDKShareKit" -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/UNIT2PracticeProject.xcodeproj/project.pbxproj b/UNIT2PracticeProject.xcodeproj/project.pbxproj index 9e5463b..1285f2d 100644 --- a/UNIT2PracticeProject.xcodeproj/project.pbxproj +++ b/UNIT2PracticeProject.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 78882C0759DAABCCBBF267D6 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 196536DFD13DA4A9B2F67F70 /* libPods.a */; }; AB0F265E1BCC5387006685AB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F265D1BCC5387006685AB /* main.m */; }; AB0F26611BCC5387006685AB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26601BCC5387006685AB /* AppDelegate.m */; }; AB0F26641BCC5387006685AB /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26631BCC5387006685AB /* RootViewController.m */; }; @@ -21,9 +22,16 @@ AB626ED11BD016D6005BC70B /* EntryListTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ED01BD016D6005BC70B /* EntryListTableViewController.m */; settings = {ASSET_TAGS = (); }; }; AB626ED61BD01BA4005BC70B /* PhotoAlbum.m in Sources */ = {isa = PBXBuildFile; fileRef = AB626ED51BD01BA4005BC70B /* PhotoAlbum.m */; settings = {ASSET_TAGS = (); }; }; ABF8076C1BD401A400853411 /* ImageSingleton.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF8076B1BD401A400853411 /* ImageSingleton.m */; settings = {ASSET_TAGS = (); }; }; + EBB12DD71BD5C945001027B8 /* CollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB12DD61BD5C945001027B8 /* CollectionViewCell.m */; settings = {ASSET_TAGS = (); }; }; + EBB12DDA1BD5C9E1001027B8 /* MeetUpCVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB12DD91BD5C9E1001027B8 /* MeetUpCVC.m */; settings = {ASSET_TAGS = (); }; }; + EBB12DDD1BD5C9F2001027B8 /* ObjectsInMeetUp.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB12DDC1BD5C9F2001027B8 /* ObjectsInMeetUp.m */; settings = {ASSET_TAGS = (); }; }; + EBB12DE01BD5CA6D001027B8 /* DetailMeetUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB12DDF1BD5CA6D001027B8 /* DetailMeetUpViewController.m */; settings = {ASSET_TAGS = (); }; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 0F0A099F832F2DA3DDCF3FCC /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; + 196536DFD13DA4A9B2F67F70 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 2DE94031048D68D9CB939801 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; AB0F26591BCC5387006685AB /* UNIT2PracticeProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UNIT2PracticeProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB0F265D1BCC5387006685AB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; AB0F265F1BCC5387006685AB /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -50,6 +58,14 @@ AB626ED81BD01C01005BC70B /* JournalEntryObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JournalEntryObject.m; sourceTree = ""; }; ABF8076A1BD401A400853411 /* ImageSingleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageSingleton.h; sourceTree = ""; }; ABF8076B1BD401A400853411 /* ImageSingleton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageSingleton.m; sourceTree = ""; }; + EBB12DD51BD5C945001027B8 /* CollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionViewCell.h; sourceTree = ""; }; + EBB12DD61BD5C945001027B8 /* CollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewCell.m; sourceTree = ""; }; + EBB12DD81BD5C9E1001027B8 /* MeetUpCVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MeetUpCVC.h; sourceTree = ""; }; + EBB12DD91BD5C9E1001027B8 /* MeetUpCVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MeetUpCVC.m; sourceTree = ""; }; + EBB12DDB1BD5C9F2001027B8 /* ObjectsInMeetUp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectsInMeetUp.h; sourceTree = ""; }; + EBB12DDC1BD5C9F2001027B8 /* ObjectsInMeetUp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjectsInMeetUp.m; sourceTree = ""; }; + EBB12DDE1BD5CA6D001027B8 /* DetailMeetUpViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailMeetUpViewController.h; sourceTree = ""; }; + EBB12DDF1BD5CA6D001027B8 /* DetailMeetUpViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailMeetUpViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -57,17 +73,37 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78882C0759DAABCCBBF267D6 /* libPods.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 2A249663F855D47B8CC825A3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 196536DFD13DA4A9B2F67F70 /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 70CDF7B00A16BD314DFFC657 /* Pods */ = { + isa = PBXGroup; + children = ( + 0F0A099F832F2DA3DDCF3FCC /* Pods.debug.xcconfig */, + 2DE94031048D68D9CB939801 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; AB0F26501BCC5387006685AB = { isa = PBXGroup; children = ( AB0F265B1BCC5387006685AB /* UNIT2PracticeProject */, AB0F265A1BCC5387006685AB /* Products */, + 70CDF7B00A16BD314DFFC657 /* Pods */, + 2A249663F855D47B8CC825A3 /* Frameworks */, ); sourceTree = ""; }; @@ -82,6 +118,7 @@ AB0F265B1BCC5387006685AB /* UNIT2PracticeProject */ = { isa = PBXGroup; children = ( + AB0F266B1BCC5387006685AB /* Main.storyboard */, AB0F265F1BCC5387006685AB /* AppDelegate.h */, AB0F26601BCC5387006685AB /* AppDelegate.m */, AB0F26621BCC5387006685AB /* RootViewController.h */, @@ -90,10 +127,10 @@ AB0F26661BCC5387006685AB /* DataViewController.m */, AB0F26681BCC5387006685AB /* ModelController.h */, AB0F26691BCC5387006685AB /* ModelController.m */, + EBB12DD41BD5C8E1001027B8 /* MeetUp */, ABF8076D1BD4444E00853411 /* Singletons */, AB626ED31BD01B26005BC70B /* Journal Entry Creation */, AB626ED21BD01B10005BC70B /* Entry List TableView */, - AB0F266B1BCC5387006685AB /* Main.storyboard */, AB0F266E1BCC5387006685AB /* Assets.xcassets */, AB0F26701BCC5387006685AB /* LaunchScreen.storyboard */, AB0F26731BCC5387006685AB /* Info.plist */, @@ -143,6 +180,21 @@ name = Singletons; sourceTree = ""; }; + EBB12DD41BD5C8E1001027B8 /* MeetUp */ = { + isa = PBXGroup; + children = ( + EBB12DDB1BD5C9F2001027B8 /* ObjectsInMeetUp.h */, + EBB12DDC1BD5C9F2001027B8 /* ObjectsInMeetUp.m */, + EBB12DD81BD5C9E1001027B8 /* MeetUpCVC.h */, + EBB12DD91BD5C9E1001027B8 /* MeetUpCVC.m */, + EBB12DD51BD5C945001027B8 /* CollectionViewCell.h */, + EBB12DD61BD5C945001027B8 /* CollectionViewCell.m */, + EBB12DDE1BD5CA6D001027B8 /* DetailMeetUpViewController.h */, + EBB12DDF1BD5CA6D001027B8 /* DetailMeetUpViewController.m */, + ); + name = MeetUp; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -150,9 +202,12 @@ isa = PBXNativeTarget; buildConfigurationList = AB0F26761BCC5387006685AB /* Build configuration list for PBXNativeTarget "UNIT2PracticeProject" */; buildPhases = ( + 1D49440730E166D0EC66FF2F /* Check Pods Manifest.lock */, AB0F26551BCC5387006685AB /* Sources */, AB0F26561BCC5387006685AB /* Frameworks */, AB0F26571BCC5387006685AB /* Resources */, + 09BBEA61D33E2BBBD52B913F /* Embed Pods Frameworks */, + 45C91AE27244E85B0F763C00 /* Copy Pods Resources */, ); buildRules = ( ); @@ -208,6 +263,54 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 09BBEA61D33E2BBBD52B913F /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 1D49440730E166D0EC66FF2F /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 45C91AE27244E85B0F763C00 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ AB0F26551BCC5387006685AB /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -219,10 +322,14 @@ AB0F26671BCC5387006685AB /* DataViewController.m in Sources */, AB0F26611BCC5387006685AB /* AppDelegate.m in Sources */, AB0F266A1BCC5387006685AB /* ModelController.m in Sources */, + EBB12DD71BD5C945001027B8 /* CollectionViewCell.m in Sources */, + EBB12DDD1BD5C9F2001027B8 /* ObjectsInMeetUp.m in Sources */, AB0F265E1BCC5387006685AB /* main.m in Sources */, AB0F26641BCC5387006685AB /* RootViewController.m in Sources */, AB626ED11BD016D6005BC70B /* EntryListTableViewController.m in Sources */, + EBB12DE01BD5CA6D001027B8 /* DetailMeetUpViewController.m in Sources */, AB626ECE1BD014BD005BC70B /* NewEntryInputViewController.m in Sources */, + EBB12DDA1BD5C9E1001027B8 /* MeetUpCVC.m in Sources */, AB626ED61BD01BA4005BC70B /* PhotoAlbum.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -333,6 +440,7 @@ }; AB0F26771BCC5387006685AB /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0F0A099F832F2DA3DDCF3FCC /* Pods.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = UNIT2PracticeProject/Info.plist; @@ -344,6 +452,7 @@ }; AB0F26781BCC5387006685AB /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2DE94031048D68D9CB939801 /* Pods.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = UNIT2PracticeProject/Info.plist; diff --git a/UNIT2PracticeProject.xcworkspace/contents.xcworkspacedata b/UNIT2PracticeProject.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a0fe5bc --- /dev/null +++ b/UNIT2PracticeProject.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/615377296_o.jpg b/UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/615377296_o.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f30ef5b982da2e7a0a11e40bedaac5e63e00d7c9 GIT binary patch literal 111815 zcmbSyWmH^2)8-6rfdGTM1cx9)fZ*;f!5zXtAh^3TxWnM?BoJH@Tmyt*AOv@UC%CiZ z{l48jXMgSP<;*$5bai(? z105Y56B7dq2lN658ykm=fDjKvMNUIaMNUac%gDt{OV7bTNy#F>%E8S827_ssg+v8; zMY#CDy#EFPVq#+AVB?U!ctOfbM@h%~|9n050Pr!8xlsYgKzaZYJ`fon_%r~Z0RVug z&)WV|_`fe85;6)Z8af6h7WT71^Gg5{5E&T>1sN3;1?5>f;JF=uf{#i-$0LbGsA+*t z?*iftNiM=*kZR~9(whFm$Y<#qiit%`LP|#diiw$pl?}}QMnF*Lt+b4+oV~qA$f)QTXi92YdPZheHmta$w5+_MvZ}iAOH*@8 zYg>CqU;n`1(D2CU7<>jXJNI+`*TVY7=GOMk?(e<*zo%#C7nfJpH@E+A0iSXH&+ET{ z{U5mSpK&3fpdh25|HB1D@_POtu1t_1)NGVs}W$oK$pz~5gLX;ZXk#`nY5iFH!& z@lgL?;wL5QZE+OYYTRD=1%?sn!GJdb@m^WRLD_;d2WF4A;7FgI9mQuU#kPd%AY2G` z6=@+q<(G*kfat&0@_lFVxo;2Wc0Hn1wIwu$=AusJ$PZRefK|DI%WS{zPk^iG$~P}r z>)^p09H;sIKc4_!;{~T)-(LjX{hrlb({4>-jfjzH%=aG^>x>tkY@=d!yRg!z`2z$U zZBp5Nj>3*POJytwBllXcW_WP>H*Qu*84B`32=18;b#;1Q`;oQur>Hx<=R9@u-rqt)PTIF?l0&xCYHFt2=MqcQq z|4o#E^}qRP^FQ9~|ASDG3{wpblMP*KCB(b2|MyFoQTy3r!@tQ?=bfD)oeH9?^IU3N zrOerk|9Y~tC!MGNN0kQ%x*@9Ne7@Pu?|=PDrg9#ApI5-XBjqhQN*rDt53&DVq5;kG z?C{gn0{-E941@!-2>e8QC99dl{~6J*se6nWLrAZ9*RyG6hL(N=G{{D|@`%ho0Sy16 z8~Dsgy!*KgzFDr9HHHUXzz$tf{_p$XvLlO{>A4Ld#W2JpU1OcA@gpYVb}eXJ?|wr0 z^5+S|`QcDyh+0q=BqBD}RsFstDL@~Q?;eh$H2jEau#ZJ}QL?0opk_s>9486FZU|FK8xl*R+kIX}ZlIo$}^ zq21?Z1`>k&6!B;4n;zR}2z+%7g2KAEX~U+h^cdr*xz#HSIfTU;^ZYL_+m z*nC!SLXN}!1o(-THh2oa^PjeCPX_)^vsCHrc*Jc$-X?DFlf`u6tFiQnSal1(XnMV{ zd%{jrRl$kKAw6+9chen9o<~3xqBrMaU(9DaF^W3bNFKXs)gB{Tp681mh&CqA(jhgE zCOLc+Z;PEuzK+Rw!Dt(vm0>BhOP%(kT@|f87$>{T_;SfE!8`V^7p>UVoO8dc<$X*= zA9T{W78lQ#gPBTz>m)vL+&_rGUPe)5klhZ@wQtG4|K3A&R9G%7T&~v|mTW#m!D; z-Egu6wXeyEg{1M4Z=s&pjpNdRCeZ|I1t;1n0#AVDoU=+w#qPGiuji{Pcqf|HBsRm) zhf+&oSIk3I=3f_hH@o7yx?ArF1abNc3~hHV#Pf(>C?}#78qqNg->p9Qs(-N;U&?&E zdjcHHLNL$p#PS}h3gU?+t9H6=sl8zzv)sXU19@vF1%s?NnH z69QO}cC(QVm%Uv3bBTzZeADcCX?nt&ie)ZG3;SF-0`D~~EINOPxW+UB6!v@dOdx#Qn4f#z$ zGgh5tG%my@X6|Ee_8K{x@T`;^>*^gI1#!NdaFm|dIcC}L?SK5GfF+9mShu`{9okFr zIi6cA4(_v^U(6?Fm5&VS2HOjGuz%aLvN!fa){-}RtA~q0*B1J?v#iuy5|`voiB`1KV~tTD{B)GN!WVCDiSu z0K=S1AO8*NeIA7C&7&>{_d>P*mCEj8wp>v5ATfonog8DDFtW1`dI_O2=qT*&hT^wE z#m7d2Xnh+`(dC{8RD4sm-SOtuIN$W8AU@foX7W^pnU|4z&+Zdne5@jrQ)27pBl%_x zWe}eRm7I?a1~Z-8w3z0t4i66`(3WxYIssxQ%zNNd!+gRIqI?*19X>Db=kId0n(9b< z@Ju|=S&VreNyds0ud0y4C_vhJKo(#cc-F~N#P4vKM%V5k<*E%ZxG~4xYvM zDW+JG9xra60N#j9rLUgKAxXm4Ggz1un3O35=vXYDjZ;p2WDy13F1a*a0c<2N*I@z$ zzdx#GZ4GT4_2VFk!kcpQW^8$1T&lJ#j_y7Ze$<96QgT?4?ka zmURuWVJKoqVnd&M9qO3ih9#gIyZyYm5Cr~nF9ohlGH=Mk6O;VNDNqdZH*8y5gZL*U zwa;h_!>8WNiv8zdn(H(3^C3n&tJ1fEx|zc!n>lMiX2s!;!rf32-$Ya3#q|@w4goEz z{iTlbM$Z0aVJKf`K9o;dB3oFU&!FneEbL)ZXgs7--PH zt}~`SvCo4%(*S-BVmEP_1yNPSSEW2S$vSaA0nHo-A? z`dv*HWP%#|ZGj6L)r&!hhF@+WV%$ABYE#!2|3q17-CAU6iNH-H>JbHka`yh=L&39e zoI(e;?W99xvzI7hgdX|s_vywTSlUL~GaokZ_g@vt+<@S`{ZKngR9d$bNbnPY!;>-K z1vqjEP4af8HPKL(wqYj(yAyp!i-m&%@Y1KkMTHIfd`|`4k#tYhdM`|EUS5vjqI^Bf z9WD4pxZezU*%G=jRM3)Vf|~&a>f)yLfpkxW=WH$(LpOCHt;Lt0&jJYsiOZH(fswsy zmMPuH^eLx1NQS4SE@|rymkB#xlqUgp(vzqWmZ74*iH1n0tQ5uq*d){-isdA9Wn1q2 zOh44Yb)-iU#!c}oSNG$0o@iL(h-rkR|jgx1Ue*P$8FlBd_*e6`kK}#hsj8(X|YT+Y?z*h0FWlIij?HP;E3)yKVUOSqBt@a%>>-LPR$MwY!mac0Lia@773p=eaBNyq%G(;P z6ZO{xrW+mcgnis5zofl9M2c*T!_CsdE{<90|3r*_OH(pBOm5NMK`k{?x#a)Un3vj+ zTBCMkW|iC8m~k;?)C1?%n%A7yi~dtz&7j4}*O`k>Q|J4tuF13I?;ydE45@}Zt#(;@ z2^%qUQp4j*!7HW?VltzZ_uvM#OQ^_}xA;4|D<3SOp}tM9`nsszA{HG%)DX^lS{mPT zG>2)CSW3;NAXYuEVbU#UmNYYkZA)(p^%Ej4_4OW5fGP1ljbVWiwf_pC2#L(5TGG?j%-1GIo5zIY}wgouc5M z(^=)+Kh($>GFh76(v0Pi+^+UK0oc+^37*aScbU~HYgpRgw^6%>_Qn&yxWF*Wc*wVp zPd!23P(maDQrO9Qb)Y6CU61FYC$i`^M>CdAjp%sX4jCB+*Rm(^wVVpP;X9B>k$muR=Z5F2dY+g{n5pJ}{5)UEroCmJ*J!#*Sh5iF9q`B2Rvp0ty9)@#-w94g4wCNAS1)Jzi#ZTNN0!;36=(71W4f@MvM{B%YXECop>Jvq6Gm@&t63IhHt{Sls^Uzi?Q2_YB5=w^-1=YEkC8aBix;uSGEePNtD?-A9Y zBIU9Z!8pg5>tE{(Q0bsPXKmiwtS3Nse-E39AqGX$H%}$42Hg54)Q; zGxeX28en1CJ&Os=|`ulq^vo*@wB6b*qpq zI_bcRHbJpj^u?WCd=BSeUXf~qa zjE}yf3_^BO+Pd1`;7JBc(~(Bt1l#UJip04tLDQ9g+8T~BFS_HH3G@({6zTlr|Y23L*TI{p&^3YLV zSM*_|QBt}W%OY7S11If(w9G!#h@Yfc5B7Gno@pQAr@ji-5a^GP@^#sXPJ!#(NfgtH zPr7eqLdIx4mj*q@G+c8NJ-6 zQtX$I2ek$EkxBtaJ2SKB?;jlF_z%!GH?br0_pG*G+1jA5G|#KqoO=+BcuDZKqxwRw zSGK*$4GG!h3cT&*3Dx#`Tlfmr3V|+K++*b7)b9?o$))MlyF~Y;1S@axm%?!x#CG}R45*@C#T4S4$^JO}1*xBYg-Q}<1<$&2S_aTW zyi0Niufx;l4PJP;_GB>sEdhxunIaQBf;6+_EdTe2(-Y46MZ(gz6shU6$9OsQ{&p^bKm z6@}*6)4h#j8CD8_e_F8KOxdlN%Z{WXeFWo3Mvs*0 z-6UeTdz@GE1eisjX53cEQjJ?PKxr%~UU|@c=vy5>pYv*t6nYm!O^N4RcG2bl3{&EF?niDOC85&RR4Q63)Hb_^F$za2XpR;t$lH_QN%(0wS}bJ6_%G247Alk%GXnxxg=etoM|!D(-l|Z> zSr+{+K?nJS2N97F#r*A^01tK9))^R>ntnK~+wmUVp5+DnR_}H+zLt6v5}#gRO(jFg zD}5v?u3)uK&aEKreB)LGKu0;R{DtdBzC0r$E>?0`xg1B(=NaMBD|(R95U^0|eW z1B3G17bVKOAoS@TI2D!rP0oLm7PH3*-&{3}3Pd(l6~5ft<7jjuYkz%O`1noo9Yt@4 zORRl&-?yvQ-ShfH;Jc7uw$hIHE~W2^0o4XAIBS0Sp@}wX;snf#I(~c!-G4mpc?s=C zU1*F2##WVfE6`Sa=+dzi;+unodh0{(6)O*J!}W-z4;x0VIdWT8wF1)vhkG*`R=>Zt z@ry79(YU_}a7gb}eLOtSb~fu?+C;7r)FV3|G-{nWd7VAjgvT`9w)y#!O3Mt#hat`* zxwZ>AiR7R9vg? zzWMnqCt+M6<++&z<`gR0rU-T=GiJyo{{U#Cx6Eik3`JVV(~tVIaNHsm7)&}94uNg?{$!!M(**B}Fcs5VteiC^-VH>~4;kXTGVr_G$ zwL)JgH(8WB>0SkGacGbL1e{;ICW5CdZ8;vkfw~~25=qE2PD}AIRR7IaeQ#o7pHkhD z4I$Iw`?}t;JCEC3N-xQpX}%(d?KLP?R(=}~?jZf`FSCzbpGQ-@9dEl2tM9gQZ}}_x zqMryyMWf+hp(A%qi#_tLD^XKpZ2_(V=O^%TkrVAaAemzoNgXs_I+4cR;91)GYwVx- zv!nSi(tt5r`_bnUQ1SqJ_`0c1SyLOdkTQr&mB4uCHp89b3@nbzPskxKdoR!jG<;NS3$ zvY!&LoT{H!U-`lp3}U02v%Q?F*I1e1Wt!oEOag|Eca>YK{f01x_AgQ(0?$!{WU#H~ zT?=}_Mje&B?l;6XCBW=3c%6XJage6Ci_v+OIkYQw?`>sy-5Wag1$6&B!4^mU@spk&0zUvA5y+z`~;{04+iltMX1!OjPPkTDHdEzBhD5_3=-26 zCf?b-n!?Z30N?j144quW{O~HncLZdo?!nv)$By3=iD0E3rlJmK1d$^hwB_iA7Vw~< z`-(hg6GXMo%5!{zjRAre6?I*;fxl_ufoI6%hw3Yz0(~yZvwj5Q)ZCEg8(~MMh=Wm3 z2+9&sXnf6EE?{)m(+-$Cp@IYEJ_SR*ubU|>k9YqVrjEpMk#CD#x(XdB(X~=Jxt(iE z7>7r<&}2XUIb;p;*kj&d)5-{;xJpS*&Se3$f1&B+x%~`69l@4;R>pJr8#H)tf$ln0 z+oz@1xUNA2Co-@L9$SXI-5eeu2LS?-0?+UZZvyz#Mp;GrdVZOz7% zs$li;1XMfGy6G5&813ahJU57sz=dL?kr|q0p+}us#u1x%7{+xkb(f9}Al`MKCqH*~ z$mmtG7F?ML&ms;Xx3SECCalXKe)?l4Sj7Uvkzr^D_$?|-P1zuyr}0tYSab;f$2;Q&nxSdB*X&;kBQBF(eT~ z7|s1WE0$I`wA-L4WV?*Eu~@h1MG*^{jm%EI8x<*Ix@j5KaUP>02s|ILHIY8RZ*)+m zbvBSOH{raAx|K<{DZV%5o#&L~LY|8UrJ6{M$K+dB@v`J45$7V3={HSvBLj6DU9ofv^H6>?`Q_^kmlLqJwO%P4!|r1PaHie5r%jBh*blsaQ4so|hr4tW9OvPK(oT zK(RBRj$m;m(0!8teTLw22kRgc59xgq)O*mtNKRA%)L=wAspf3=OjC8XLRncGp$KN2=dMQDK90WJikaE(omzS#FBY0W2(X zkn4?{5wWI0mk{+bq*5~EqSEDI`n=FBt1vY!$pbYOj435^t+(VH$gPA3+u%*XU2qly zJh)w`9O)Qk6Z|)!lsv*&%|)FVN0fyqM))sO?4y0OQV%?8PZe3k4<{cIq2sa9)RdEB zSDrQH_o`~~v{8;mZ0YCwk{nK{d8xJKE-M$9UqJil-h`uCrnoj+IwgO@fIdXEvW0kq zB@I`(;3swZ^zT4Wi=uVLt$w{{3xkX}>y_9yrJQ#Ss>1Igj~9CL(N!CxOVA-xD4r;Y zn5zAGZ1kvK`bfIl{u|8^f_whcX>Isk5pY{ z*>*L2V1l3P=v|Vpk$%MFgioF~Y?*r@qHEM`+Bc|}zfUXwr^dCfPC{U@%X zDkU@ZKmkZ-cdblxRS@>!(> z;$_A-ibBQ!@7+3#Sn?y|HQ(Hs8oQN+FC-4Xnb%cQ^f%;us5C(~*$IGJ6Sskk+jqw$ zF0V#}cpRA%rTpHZR_$NG$_7$Y=`gMz7IL}Jm4?dcxu@+X_AItVO{0$%2i#UoM94*> zJL0_|CN1?reHo&-mk$ziT-u}P;x?@m+G4xiuD50}HgNZgmX_vNx~q{xHM7M<=x-6B zPpb}wwWBOCoSRa2I&Pzz`4?&Sa*nLR-+JcUw^5deGB+G0i}x;5hehie`{`ZUh2z}$ zgOG)KCSGsKZ<@rsY8Yk}XiL+21Zy*jldF$G4bhmXn>>o4D5NEzrZhlS$!S?}FyUzl zjgm2rwy!qu6L~vDq-So(LgpXP;T_yIxXtZI_fy2U!3ZZ-%=Kbt(e8N-*sJtHA}{Z| zUZUnq({BEzp4L9E*8o=7Jn~%I!T8;gmTkt?xeD7SEV0l`14Km^f{SD#_3-Ww!|NoT zm8w4O#-Ppzhfue#(dQPpx?XKXwp0bD{EVtxkIL?%_O##M^4#w$l%~1`{%vTwsvWnI zX#`$Pyk#xrtz7Y)k%2#lArZ-{bm>0m1(FhxJ|_>iuIfw|H+RsFxsT7OOMj@VayE!` zb6-3%YY?)%v?@*pUTso+W@j&6uq*|6(3mNygM+3>p8yOB(pxZfp2)K}#B0WIYoQ5M z#^_fc2BHeIRk@xI-&zIP<;d#^emRwe5sBGMNL!n^df|^W2>Nt711-g0UOx82w7}6R zr7DNd%V-Od@zU|}p%VM(>#%chTdRXiH%Ia7*WR9wMErGc?H&H@Ir2uqiP!yK>^St(y2v$oHau*cCOE1ms-mCYTDeB{$&5>*RhEK16aT7LjtIqHN)TgkO|TM1;YT zf%-W~ct7EvH~xwah6Uf+G&!cWp|JeAsLK+8RJ?t>6)Lt^bUOS|p=S0{P&cZN{aR|^ zS9I5qB07`g!RkGGVrQhV!>Bpbf{kwR8|j3jLm-Ra=O6k7=e9uo4vUytBaak_jKema z$o8MYK&FPuwdG<*RaN$hq$j|*kXVhf9+Octxx%W`dSVBVrcA(N*zpOF{@(Ifx~YH< za9YyZ%{H`!m;8+_>(%rM_x&eIcwO^2F!zyDHgt=g3|nACPUm8y={(PLS25PoXt9GZ zWA!R=^GGKmH&o>dEh$4rd0jCou>K{DJ<(jx;cWKjM>d2_q`rO+xf%*ofkpJ$@zih{ zskhCLnyyZ^3O?+>6@t`oCF}i0TMbC~QUZ`>UK(;aGg`fy;wrrpTo|Py*!OhVi_Reb z;3{M0!1x_IQxt=2wAKMM16m5GR@`V)In)ZSVrV!y(v)}4_)zo+}&M)NC2xy>SxYP@?>X1?-`2ue&}s5qr6@^H;ws(6R~pN7zh$`RDEK z0=s@x>K?36he*Pg@He7-M~Yx5q&s1_|EHd>M{VEweRio^!?v-L=`uUP^9`ADpbNbo z|A^ACNv*-`)m~dCuh)*Sig3dC_{x(V7?$W;YSJqqw5FYQzAZ`q_Dpm#>fLNm)1t@3 z_ehZ~nJ_H8PyAUw_3SjTU3V!-?5pUN>9=;N&m)l=d52p+)+u}04Dl!pm9|D$p$S@; zUE|uLceU9eZpz$pBQ{dh%xNNIf)JnXhLX}_tT`^9gJ1jhcsJIfS&03(xi$^OTWyid z(`Z4;gbGj=o&1~k^9bn&%}e@PxnLuOvff)a&B{cpknT40au)1Zk~d%QRLCO&Hy?mC zEk8O-JIw{zSG(zrz5|!6;_w$@QAZp@SlCgclV0|uWdytBRvogbL&G4ACc#srA)Y?<6KZxPG# zZkj!(0B8H0vBg9+S$&wCSE9%^I{&LChKDD>Cw|WPhYbN5UZ@oVHwvqWN7Z|iAAO3* z$Y`NTN0WHXsxIF(TbudJZH&>Jmav*HeW+&@G)uE;>^bqDjrlh+ilS z)@1b9cIZtvagDcP)J)vd*_V{uW@ z=US@i@(bg1Moe18y3Rr{ilnR4Z64jVt4zBWb z3WE$Qu)sgy4aMKAb-C}M01y5|+L=&3ca)jO$vefx#5zuiSWgIU02_SKC1p7PRrv7l z(JbL!tOoOo9L7aGtP=E5a$ zxBF?X$VLN`GJq9OT^P4nhl&mlu6--8!>VX5M0Trzj6}IBRJIVns@p@k6(B24dk*f2 zqTy!|tO8kU9f26>Ifuc29-Bgd%&<4)zQLVCvLf8{MZHt>889R{Kr%f3Yh>~06j~{c ziwdd`azh1jLLtK9W=|bgENx(rS(HZt6ouYahKyW?gaq}|_Qd&P#}QD8lKNu?h?V4` zVk0_QbX5gbtRlc6))$}BGTQ751#pKtU3Uk06xgF#@!-5w&9l0MtZQi!eTXSYR`=&@+f(Q-XepCd*faq0_NrVi7Dp1h6P0YdMSa78sQKHG z@Qh8VO8e=2cR!ad&u`(M{^cd@{iH&oFZ5ay$liBR$b8S@6_-GlJTD$P75*(U(rRuc zoR;9SDC)qq!ztSIoDjaf_>^_uDbx1;!#RM)@P`T07{3G^dz|@4Cvn5*mX!!_d%)3f zo*1%FmJjs%VitQ+ZNQNIK;rh05!tY*M8(yKrm-ptcSd_M0YfkEOW5T$Hwp zqtf?UZ+NcXS*$N>jUA{(k}Ao9A!o8P`|=GnyV^}gqjmY~1PY;FKANM0*X3TAG$?h= zG|F>-Mbak2tE3vfYxsMAPzpcKF`@rC+G6}Z!|f{T4n{u*zKd;ed;uS2w+6He4S!SW zzJ~pd5ahIULsV(jD2S7@-2c8m(0)194bp_6y#h5^1`|LHS+Frv&;s_v$;~FA z=1g`IoUZ`r2MTU#Q_Y~B_kqn}Ra~Drxhx%GZ58Dhgy#DTI)n+KzuEDOzQXln8WC_g zblf&{^j7=H`bC)5w>QvTtc0*IgtK?mbn!1{wXoK1)4xcN;!{?RY$XvZ*TG;=qM7ex zoQzfKj>}AIxAVf}u*XgMuv64S!B`$mY6b(1J3^S@i0--a7&1LnAVlzKSu`FX{DJwd z>30SVzq73L_H$)-;#tKY$%*7j)F-*iLexd{%KJTCx|KEtA*y|Gy0*K5s~=?wjAuGW zG~VtO5_mklDau|KCF8A+R|lF|)=PmZXGaR=NkQX$5`-fyk5)DbZU-vAK0fR#(r13R z+HN&dvVf}J?5w5(lpd7?>9V+yQ7HA&tHQKCbDQqheWVm;RPe=LJuuK3WLiHJSf=W( zUPjQ9o>yV0GoZZ^P4u?@`ugJ_oSw!jaE%=WPpv52t1W@BC&Q4{)A-F0TiFu zxc8r@n99R6n*10<+-zBX5Q{1$`fiCR*0z*C0c={d95o_Wo3?ZA*~_&wBBMAMSf{i` zOa%1d)}1bH{O5Mwj9;t+1P9&D*o_po)jwFJ0*)-gpokyMdee2~H1AX7l84YFG(=U6 zXZgoPC4dhZ@W!y_ZF3Cq2y=vC_r+Thu=Q+{&^m88qfE&T5yQ$TgOiPxHyM5LOU3OZ ziM#%`vQwk>=W+=oA~YE8old9OaU5`QC9zpO@gg#3+dsvB??(_xH?{r~Aiv?!-JTP9 zDm~U#PMq#U1$R*Xd(d0&crTijPfMcl^re3CCyKY6>}X+x53Y~mV>zTZ_BQxFRcAs% z=O6@k$n?|(%jY3n#>9tpRkN;D!>lHYO#IX-&ocC@1Y#iK7RDi*^zBc9FJ*Z4RD0FD ziab7x_%VX7ZnTZI)u|t(PslcAsurA_pH*^rIx0RERd{e-1;Z?ezkjeFX^O`pPD2iX z>AlWleD}s0XJkaIPTl(l##C0x_914?YpP1=Y|;m|Hz~g~gFGjGk`)h_#JkXBjz5>c zT3}eI$Q+HH=$RhLSl6-%R;nK6YcSZ|G{93)UDdg?@x}prL$b7?o8w#6Zb$M9Onz>6 z{qPzm+n81!5h$|O?+_In#&(peokDE8%2mF$P4I|MM1)L%$MBu_Tq;%U4|PC-M3PIw z1=fntax;-LFE?vO#Yv()l;>U2AHU$o z?>YwkS&l#^o{6n|Y^!u zM=Nld+*{!#HKOF ziEO{+hd|np=toChNNw&nBJ8eCM`;%?W3)tZa)Cwa*&1gs6;bK@IK(6=ZPzGZncCBx z+Y5V92!P-h%+p9(@F%AwPJjK#`n&;y2%FpGgqdTeOH1J|4 z^0Iw2R&oL6<45AE)rG; zT8Ak4to~(JF{OJSOlZ_9gs1qFS)@LKLwW>#8Q3 zE0*zUf_h1|_4{9G8sSYk9bAEkxY9@=0-EEEW*yrZNByZqxjiN~;udu`=cGve@pA}; zeaJzop{w1S;5QYujvXSb*i5TY&E)`w=o(nF1gNmGPrr*hYV)s-eN-~8k$4g0uCOOxhzt6Tj= z@5_%UC4%m`3b(5A*lO><<5M7kf|%nqu>Y2P@=yJ@OMiovC5$y0G0h$TbsO`IUO+|U z`!3~=T$>NBU%2Nbq|hY9%?w8zJVVb$y51!^gs>p*Ab(}cQ>WiHF;84){T(%tUc}x=eNXF&t`ttqzZgnW#vYED^PPlH)v=3QpM^r&6<58v3ZQMkQ?2BeS zaVhkhow7e=xxC9=Uc{|9j5Hij1qtEEVNE^88TSX`jfrL!OP-m| z)Q_;6^1hs=lLGwasEam9-#49}r^A$61vR(NsoQEtJsv#ZS{*@YWuA)683S>?sfKPd zai0jq-|J~MeIxA9Nyd-L>5du8q!Mkb7Z`Nie>9SGr@OS zV|y#}WLTV5Z(d962cWuLd7bUM#nd~A3{i5)0cez9%~mYGaMM|(-r1NjA`eq)RE|iq zlA+VrItmHWKD=P+1CH=dCeM6#n76yU?XLb}FU1buhP~+_y{zw>k(~KZvXIfxuy3l_ z9&-yjYb*0J%G!;k*rbb;bu{yCak#^*Q>`AbCdEx~W%qRrUADK-B21nB?L{xxOQ9)^ zn}tlD%{kG(;!;UVUlvvml@z|)f?DEkVZvK&O{tJZ?-$XBY6Fb!lhdd^_FHkRsl=c=@ zx$*ihmbY#C#^fT%>V7BPz(AT61wTphK%Qpnr{ehMtP)V$bCw4@z{JXmuz~^{L2aeO zHxmHT(m_rTh7!wj*w*g(e{Q_9IVg`D3y?kkXOjYjN_(5ciEG7o0);_n$h@E4dCyG{ zdw4Hu)~y%OghRX+WlAs6cqy-hluW;mRdN!~6uhx|wpkAGaiT=XDB6aP%sO$L_kImO zZnv9Fs*ibZp>EYdfP`E2BO`Z32DG$toYFUcRjInMfUb?kJIHWr`h(~4qLw(_aM@cy zqutGGyR+x=RWTv8Ut*elw|74TTwk+3h#R_Vw!*|rhi|lQz8yX`U6t$%AQmQ`OJ&E1|t-8?|=4) zLUI_-?ei5!l7o@MRPLmM+%?F3>`I5FZxE+yy+eTCczY^mi$63l^jD5C z$XTr272gp60abQZspWs*QV(GWuG--8FYiZFo36?$Td>~3;)CY!iXL?a?uvssB3lWVK)YZB3_n+P z6<%zNsr}4%P3ta7QKQEUIg^D)l$Bvh02O1(ORBlcFB~>8aO^XrzP(@}U#;EA2XNp-qQ)_zb z@{#bx_Z|YEuzXeh&|=SJG0WGVE({|TI~dLt`DqBs7QQ?MX}5R<=Jut}(u@_;B>dH1 z2@w_WjrM3{CN+zX=}}@AE65h5MlVHj?1GsAo1#wuLgVhA3D&DQ!nD&{!SK}7lMr}S zAJ27mn*F31(vQ&b-gk}3m!n#wf5g_8hVR+!RcU14V4vc))62#@xMKXFpVjJ~an~d5 zoKs1^ij}FiWXqSVWfg2?CNqWw!G9nLK!tgrH}+OS zSxK21P>oISVzEGox;ZaCl}n<4!GCY6#I_`!kVB-$wW6>B@~GftS^~O&y=q^m>P2xc z?ztlPr7F76&YiL=-zR@RXpbSQWPUC>e|}39+@K_2(+kF=edWb1I`QUIUvK*t;fbq!QMJ}f zMsdTL06g8i6osanU)CBr5eI|pUn5*gXMZUvhf)A#IhQ64aD59!^tL~RdN`D$c@H+G zuV;nb1Uu-_02Oy>JF;KJXn#DOuR%UgmHSx4RmRe7(BE#=nmSU&{2J`J)Y$?re9!#J z{)Z#E!x7}L={JRa1K^7_KsaO1#4~3duVEZ@xqBXBZWUc7A$Po%eE*nMf~j1%Yxq*} z3;oaaho#HU%A5!nVe=+$AziV@ud`-me@bsflVCy_4(?VN&!uX=c~<{?Qlm`peX#G| zj&HtaqG;38Kg+8#d5uSHA|O~2SHQpBu#tTu7Fnhan;0%ZHp#D9o6XUOzIcm_`lWu) z#wtyF3aOkLAcg}9)qiVb1ox# zE-DsHHv9oX2dUcTsh&XONO2E&HB@C3m9;$*YVzEK+-g}V z_;1n@YMwg>M5wa7daEOgOA;3V;VC*zOhOo}+k29!sT+m^-UUyDNgONnvjwK3x%C{t zT9Sods|46LgtWe#nDo>5!KAoQL<{ganb(~!G70|7ltY`qtAMRo#3WVNMv4L_wH_s1 zcwwNp!P+|{$|h7V!2s2h?j+*8rpS5(iQw1cnbq+)WoO1=CCFKYDwarm;rx^V#h}%3 zoy>8WtD#-{vB|EqmdxED>`Zc2xt0D)P4HHmq^(T!1$~MXt1UWX!BASThlXOEPckzjI109A)@7n}?n(ivk1gP)}qL3T2C z{{TprAdi^#_o$VWu{jky`1?e>{{RvGbqc5>k(xj{n~b+k)Vmk3Bk4$?vT%PoU^t*Y z)WU;s8K-53QJpi|!2)$SE#Z_ z5=g8z?EyyLe^XK3c)ITD-s%|QSj5;0bILFH*HtM|g64X&nyhNne5*us7hWc{w$v^n zl2sAgCQ7f&W@FfTV!0`wQSmkW^FWd`B1L3?l2_9i=s2W}?QC>Mc;;Dk8?2*(Kh+`Y z_@7$p{5ch#k!j^M(g`F1q)#+32OW6n(w*g2R+G>z8ZmN$*JF{s()C#7dzrNNgxEwMk}7W&<&Q8cXuFo-Wm1) z$A&}wd9Cr{Z68jznj2`@e75-_3xLPhJ*x{{@l$Hn4QCa%l#IZ$Gi024Rn+!YzfviC zUTa%H{t~*3UC9Z7U7HLYzl0B7!|PoPcFq#l5-{lI6a5*KGo-5YKuQ4 zM~C0I$O*|9#^38!8&tWHOJ%u{rh*N-VkZLwwPy;vsU~eYE>7v5p`}Fj`h0M-!fk}A zzU|pu@z2t@t$R*cJWF&8m}e^LhzVxM=m&H9RITHy=?IR;Pla$eUR#0eD>=MHc6G$m z3qbNH*sM^6QS3U_l`29}QASj$RD_(LQud|cS+uPu?TI*NPxYZjFc0I;rAgptxH_ch zkB9_&ok`<4z{kB$bFN=_lS`h;(@d9n+Fg~n$KzD=E4z;lwcnqo+?QaWFP3mQ>P;_o zO*rf~&gr<gG ztxj;tM+6=*>s%z-kBizPBSi2bf=Tki{{T9#6{m_G#LgP!VhVm;`&%7)el=d%Y@$n` z-mXT!jNZmOC4k$+Zg2`P!jxS0_4-#87B?vOu9`0gYFC!aadC31GvMuzmLPkdUuuh4 z@X*oip`B+kg4BWnAB{h1m8Dq5M?LE#YAeXW z+mJ`NrmLyygYY<|bR@AJw9y-SQ$i#@Ug45@dS;pyGtt2M(`5udalq|SEVGO%{tx$REU-KhKN<$EcU};>-5Xndr!lJLIGl~cpP2nCs;?;1uisD9 zEv~m5B$;n@?_RANtg)<#_gDrQ9gTI-mDP?MOnF`Vi$yITjc;?9PsCB0TvB3-g~N(4 zD5RhR7^FXiJ2aF4-^z@ADb!N|w8^H9-X@kt3Zk2KWlL9Ub=@c&5AgS_YwOr8l{Fb+ zp7Ip{F=YW`_W<|xsFdtnA!YnOL=UZotC+Jdx<2y~19 z5c`VMzqB)2E!~CNScxLvu)Y+Ir;l3WzzmAacM?e?^)-!IT=*Bo{r!5&;I~krIt9$V3VDr`BWw~ z34WytWvSjE>@;n18tc0Qc22IxK7kJ9eim=nh)|f4e}K z;L&0K0Caxg{whG}fr!8H<5Dcpo%>Jl9@L_Bz~KH=SP0Rr7jMSMJeZ0Mds{B94E$DM#81w;&ArQZ((A;B}^%pUiQ`1oof@I!;IW!}-#* zF4GcUgHb%v75mtvl0){47CeFcs2z!(*lo#g#-Wx79^w^}Rg5qI$j62Ez@f?7a!p&( zH2AemQr^~QbVfo+QIo|WPTI4$@cxZwrdkKKK4ZwEe58Hu{CicMV^xPov-?bdKg<*$ zJe>Mfn5{%mM+(a?$eRNb$@ewq9w@q&>sOT?Uob+(B|CPGJ*#O;k~$o;C23|k|Vlbyo>ao03ii8P+3dbwFh zDp+TwSZiduy-*2?HXs(;yB_!*YpP#|*9`fWQ&2O=L??=u{t$WMon((uShg_ocE=g~>wc-}Q%g09i-3IS*v9Nv8_514 z>}u~GwbcZY(DUj^xjTvZQV<9rfrC!`X)4GVv7!tjs*gZ1LZU~IfB;Ejj_1~&Mm;F7 zu3%eT>sPlo7P4AJYZPo$%=snM^x6k}R>izOXSYa5B8MR_508T9WF{6AUiEgkn1P;B@*|CL&RG zvpevylDd-6pm>{~?^4Bulb$)JNUA0$cYc6Tv~S2(Jl8K%w)zd6VpB**?{Wd_Rwj*u z0s`_o(@bnnE`JId5|Xhbr+Hj)+nQ?y+zEB)I2_aEg*K@<%}0b>9t8~&o`T#)PtAs5 z)MA=}&eaG#Iqg-QMl+pwqw$Os5tLB$OqO_uzE(VVspIRc^(Cw!U>%e+IN`VN)1 zVc}biLqr#1<88!;bZFcHzUS1_j2xY!iE>e1^Rbw#8pb#n$9jOv8s`Ur=}g%qEYV7( zT?tkPs5J>j!!{1yo4aPAl#y+26rjSK)oEmAbBqH-XXU0b#FVZyhop{B0>>1_!Ex_G z@}y@J*Nw8IbM&Ofkod3^ib(*#`qIV-CnlBfSDexgq-ei*4_b2!Ddv>{EyA8^Um`*} zVvz1Yy-g_@%}9_jZd#=fAnTmbVO*xXH(u26r1S*Ug^gBBZQ`UPFYyWz3zURTTN`Rs zfS#lZb4-Fv=kld9gVAYOA>EAoI1&y?sRU?0gj5eRDKZK}$66d4eI z6;*tZoYC5gg^6UHa0urIG^XI5iYfv)G=T9^+bYD5BanIuVRmjy6GnKZgMmn4)|7Up z=73IVG1!{t{yruD0DS)dI*oW0V&pH{B;bAX{OT}+wL1uA;sprg3RX-Gv}`z_L$?m} zBQ8nJG^zKdf$K~O_&tR)Xxwqf(wp0gMJGLJfi4ebKaD0%?wO?AMFIKbP$9tkVuC@( zG@-}6CRCbY90wE{Fgt#foaUH?+C2qC$~O~I^HGt5j2Z@pZ0D^gLyVkaqzXN0#X%oR zVREx%w@M97j(QVFP@Xo^NG?UVuR}|?`qYLK*A*E~decaELWwqzaheR7TR`XkID@cykb7F!u{oP5I{&av9h#K~(lWOFut zD2q$e77I-|7JZm$bHg7~+}AsGbv5nN+}ucBXE`iuRy{fmOU2SzLJW4^YXTFEsygE} zq5l8~Wy0&JYvvcTE4aPP^ig9bsS4k1Yj(&vBnit6s&3v@I`0)80vU1wDs26E#d}gCo(uElaevdVb-^;NhF%s!w*@u)7_o2 zpdAzspsej@Sc6Hjl2?!!NWw-4B%a)QS101FMo9HBZEJmTh}RCg_|IOWt#gf*JDiq1 zNhdj?b?tPJso}3_NtgUPrM|bV7oV8W`LdES8=jwydM>ASx=xRAbcmzLk1C*GXP^~d z!JbRQ8opdlhsYHfbXo zmZd-1r?^n)7;zXqg=y-t7;G9tkrJ|*TRf^~k}9W$(gxC^xq{kDb&&wr@^0zeRqaOF zTgwS8;$>4O1h^z)ze=dDb3-}1)YQy>7U^PLh|@?|jfEmOZ1)G!qSbW!{c6aIeL~&g zW1lTk3UTk(HM1pzQh5MIim@;_106bJ=xTI{BQ3E4?m0LZ$)QG4(m~G{>jkOjr@~sQ zTFWe=BoTskm*uhPSn-3A!LL}kXO7lajxROUNfDF7A4=g5gzt-8O}SB!Z&bzu6V3tl z{*{dB^86=FD%{EQ7=-Y9P&##{OfGF$B+AIgkQj9yquPk&EI=x!C+S%udk&C%?MWJ+ zPCe=EA`--*>)6vok^caBhtyLQ^cF=0hJ7k6i=LG;?JRK1`0-2uk3bL6g)mIj@ZOsZ z_NbB0itws4GBd#B0u4}@&mG-D*n&MS4ugi>bPp`Ff)zKMqE1Z*q zgR>HfU(S!tsDUv?DQNuY5Z}g(dzxA~pkj3OqZGe|As)t<8PZ?etnws!ZN$nO3h96d z@0`-5)s^ck6GjBQ;u+KC_aGjl+*C*Hs_!h1I_IA(It3W?;FDa<+#03+u$qRQZ+2GP z41J*B=eQZ|Sh=)xMw*wA(CVo6T6~5m%(jJCJXyg(>ZcqJYT$%wV@ybx=NUfr=n1ac z$!vbol3UAy9ywz;Q;%G9_pSk>J69OTJvw!$scYzKM(H%g@|&}v{{Vs1f*CxFf3?|% zr9G4Z9oVh2jJPH7V zdw+P*y|O-I)}-@h{{Si}eA%)(f8Qd28!I0<`9FBnEhBbfe;TzcvYA|9a8K}xjL9Ge ze2dV30H%480rwaF_!I&oepWxB{&d=%o@o&}NGc`W4Umq5k*urr`0x=cm1BK_8oO5=S&-83yAb zVL-qqKHaNseJ=Lq_w3IL35M2&NI+O)O#ImQqQK;q=PZct6wHXs5CX&u;Ag!gaLXz? z#~V7J%M}^h^{(Q755*O{R*=am+{|{fMsOJeWS0C5Xj*8--pckgK3tas?FezTK*Eln zpVq69nY!^v^JLCjgZE87Hjn}GllWI*ulRZ>t&Q9hBn}V*8Eh%Q?e1%iUoe5059d+4fOyYd;1b47&3Xe7Y-af957X+may zod-P&3YDN;yyq2KR93ii&sr=9m7@81k}>$xWr8zsuG0^?H~{)oh>Bu6hB4}CB$^a; z;1U#4uqGpjww$|u3tfMNwA*Oy4Dy2`iCYN6)E>sJe)3GlkGUrna|juu8&Wap#Z&$8SqA(c zZYfsgNY`SJ3ZA2pP>CIcgr48lvO1Dwh+a^jd8~QqnwCE;i;cvb5y`43%tuq!k|Da_ zDL4e+pGp|{Zgid&(h~1lNqoJ~LG!*wMtchMoNLx{9Y-RlYw>-TS(-SbWsKpFAMTNnR@OiGNxX9+ z{L#kp5=j{$SN{OjS3Fe(zMtZlX1NUZl7)9g>J)HC=~!-?JC>4B>tdyiylZTdSjl%L zv%7LFx_q&W;|yxohF(}aWsOKl9P%T9<_u-e`8Cw&ns%G^zwJFD?Zvc}fIesvvC?xT7ChU?=BAFW_lEIs_r3@u2m= z&ov&~f|xQQwtA}e{Cm>44W8l)Sj?9bBuF}!U@M80?7UgxfFySoa3MrsPw!jX)B57N znKT<)shVv-eYQ+(Uo~(LdH^cbrG>48UR9;KLWih9*XvozGMls5+7pd5+T7!0@P?yj zsmcABKFc|fM(kK_3VMpKqxc-$tId5QM42KnA0@f#^shq3I~uKJ46xdTnc3X2Za^DB zJP*K9_7LVT>r>@8tFHoHdAYZ^fz*%V1x<4o@X4oNOKUhDY)1{W3D4B>xz*f`sc-;Hx0+4lxHT_Y_Ve7VmkKic%H zq^#_GRyJ{6a{iP(tn9^A4O;o*mPMsD{$wXx80d%<2S%v5XIDzpi*bI4#ZIow=0; zUN$-7)EcD;zuqDo>95^0nVx7Ty_!pS%yGLCvHt*cdRIfDwuLpUaOzMh+#w)H;{m}u zax0pQs69ZZNjM9FbMINkT(0Jmk2111we25DvQIM3`x3Fphatv3qo?Cs`H1c1%`s*G zfr?g??Kl8Zl%pqftT;wdR&L~xBA4ZIO;{m9{m?5oNZAKCsWXsw6Q8X?R%L~eRkQQT{CDFOLve<6>cq)0e9Jq;FOx*_J8KDBH` zAO8TZg+&g)0Y!r4UAgQ{D2<6fEnMl?Q+E$DsKFGRM{)sf{?y@bhrw@pkjR7hzba>* zyTJoASqo7vH+`y32i`qCw9v$LQYq6v`c%As5&m?W$I_A*jKQ!o-kve*Oe8Z7^t%_+ z@}>iug`jk%6+8e=%I0F@@>Bi54vhsm7N6@|$?O(i0SC!Q(cIV9xc zt~*me#^Wb}n(F)!VC{b`+eQp=rqIW;A5X%$Z#46_ak@yIr@CYV2d>I{zS!W?u1*WRV@ zm7UI^D{D7%`K}noqD9@uf2ZMGTs9X|#?r$Ck|Gcpkx2r(&kbs}7J4nba-&-_N#zpU zhkobUw1k|ed9ymOP^Q&2sc&2GwZ5w$o)#AOJqu$YzN6N-jYCbj(yw2e zozW>HzXrKG?QdMOyH&eIk~p2AE@IjyU+$CN*0+^jRk6zoJnu(ywvSe|y0ezz#z^i& zXAA@F$Kq;DKT);Rt;F`y22I6%GDlkTQznir3P&B%%I7jOFv0=ZKlW zqm8DSnRll_Br`0q!!(ix3FZtAdJOgatAy3GVWdrLrd2XXyPh%s04&aWeJj&h5xHek zj+q@R&b9Mn9;WbH+xc^&eDWl_m50-@tZKzAPK-R8b}>pe(s(q$jhdLBmXSFl>sX|9 z++>6IjmLV69Q3O#_nYfY0-b>}{)J%LjN91iun?OcC?ZSEE}xJeM(yE4d~!w!e_HQ15uTGMxq zr!{1h?1aT39@Oknk804!W+`cLNkD|9#T0j@0Y)j2$de}YV9SyT9f;~GjmEjATCiDf zBT`hb0O$OgS3^;6M2qDVuwtVlq4cVkTAh`U&CSeF^NbefKT76xPa21fq0^#Z$E453 zK7zT4=6P;pl2ESfa#-~yvz1$HbVCl_vNiSnbNf!`%Z1!prvP#{`;l42lq7ur01a0S zA9#oT^lHO2Ku4I{mF(Rs9rb5Tl1U*qrAfVffzR<8i1{a~$UhNMVjm%XX9IEUD6p<3 z_4TKtuax}pkx^}n{(7JL;+}|}OaAn7NAQ|<2E%gy0D7GpFVD#Prla!H{(C3l4LT^4 z7b0XoDfObkaNM}$ihNAIYT%Bw7nDEetY7!lJ{U-qPWaC~nu`NyH-p?z88SX@^v@x` zyr1{br4TmZ^GE*xeTpm>M3Op*8=mH%d6e`#Q>Tr**8^|fKg22@B2V^z@1a1|hsf)= zbNnKk<}a-}NF1=>ebM|w(vd9Zmpc<6bvuR!)`6=5ZNU|JBpT^#G<&OgRv3&^$0{q_ zjD69b6d&hMLb`Hko=k}h*NjYPN6L%aaX*h*>2wPZ?ENrA(kzb5S=xzAr-wRux$0002(N;*>3$sBG??l8orK_O6F4WRl8fBEZ0 zB{39kG;0g1m!9GQE3n2Hjt9_IPOafs?jVUY=&j%>{7syi>1e2MOwu)F9;cRHX*!me z>Ta#rN1yeJ^DpOBA!giLb~@s{c%r(MWelgNBOup5t9VAv`C098YdJajN6OyBcC6)1 zt&W&t6Vh57D@s`j-H}kU0d!An)c4jCX>+s}X(B(aIB#%!)Gg(Chvjp?@9kNg3frOc zI{9R0ny&u<^3Olrt;-z;`&Q4+uyuJ;0$5~iq#t9`6_80LFrpbRDyEU>B8T~zKi+`zKsjX=BySOxYbktN3$k{w|?mm?To}GVwsJ7O-fqZV+ z@{h)o)NyTU%1X|eD(s|lEYC(hFKgK?m+vTclN4RS|!!B#lk>7*AfBy z=tkw|ky1_J`}=J-?X$B|o3a|xoJ_gj<>e_p2o2Qa^+X)

nEkG_~A#mMBRPqgMFNQ{t#;`m|T~Hx|BA!E|pB{I9lAy@L*ca?FTK^UhrN*Mdps(=B729<*4 zWA}~$ITa#?U@)~KSe zqBLE+04gIhbASakWPV0yVPfAw$i+sCpb$u?a!*o!I*f4UlVeDcqM8rMpv)6@b_9qCGg+L}N`xw1Jl{l=4EEO|7g53K++ z$Z5h)!kAIBN~rGP5eqRm01T5&2yt~IoKcW_}!e4y?nue`cqTDc1nJGyN3Dz zDg9QjVSR3wbB50ppHp44_zK+p+v$fr&~&RZ_#aGYnPQT3kn$LuY%3MA6zX-dvx&zSX-9fSMp-1aaQ#Gqx>+iSot=Qhy4l(v+3@3RR+= zx}4pfg?D?WOMJ3J3=xtEl#ot6IIf4mdQ`&J?rX?EiecrdNSu&5o_kj9mYa094K4lW z+DBA~MimtLy5I?V?_g!M_=b&%OpuGZ5)akHyC9jAd0DJqgdI)6j8vXVRm@S4DBbqOz@ufyRmS_ z+CK8s^11YFO5QOf);9=;xkFU99Ah=^AD=agf8jkNP*x_?Ln9pdk#K)5l`_IL@Ur2J zPvb`=;SE1Z)TEv(@UJ+*iZV#Z?rXiX)2%f4e5+e@jeFp7ex|uN{vU|%)&Ac90A~j| zQMJdXH3XM4ct2PruB6l;nK87<%AEHc^NMuaroH(5$*PrS`?-9M^;J+|R1ct~-~vei z4y5+34)@3RGDsIqvjAhCG;U+~3ZZYWT9N>A8!8$#F5?}?VO;*D;S1SJiE5VHX1QksE(#}Xx2LeFa;Tp&DlwwhBhb{;Zmb$h zmWxrAe?AQTmMl7-_POAD*Ap{6%r+@=b~dQlj21DjdY|y9+ep+cZVWGJI=OA2Z9g&g z^{b;o)*^o@O+Iq+V{0!U8p2X?dmT`WV6)dnsO6<$RZSEx3+4n#b{;ogA7^+G2q` zCh8879IK{TgqW!D5II*+Y$${f?>I^j`9mp%15J4g++oG=$M7|<^AIc#^X3&z*0 zbE?N|lCvxW4IbPDWAEO*61a~WX;zSI)KSXZOyOBOHywYKYgv1`7~$IXmuD(WZ*Gx@ z5IT}fpq#g{t6E-%bF56zKve>b%+JtO1Y#>wPt@-8z0YdlT16_^8Lo7@osw-Ybg*yr zNTXY;kdr2y;waUe5Fb5A{w_P$q1fFm<%}09FeO0P>x%M5R+3$#EX>`8NhZB1oiq;% znIZEf5Jn1#2R!!n6|E<0ocM^{CDhj-GL>KmJP<{4n)ikw`#0J&_|`d7s&aSd)893% zrFfH0)#dVFk(PXC%XP+np0%p7#?lzWg5YGR>x$X(%^c~@oR2ZR(Qm9R1k*qc2I&=Z z`>~t?YcV83Q7qJs^%kX%C@%a^SAF9w*Y@U`U0LkOYKfst<0A2&5hBkV|Tg7de8EPNvUn& zZ!vKqAEQ&enRD3v2&{KIZkC9FV;SfLODZpz+zzy&DT5E)w_i$G7Ed{b)5~L#MTFj@ zTNl!%Xx9mm{35jOw0R@b<&|UEHMj;rl0&KfA;u~@T^{=U!qJ5hJYHaOdjpQ1x$REO zT+4fzr52>vzDf^sTGpNy)F)+WL}?aO^4zfR^fbEuksgwZByur{*ofED>S^-3T%LHg zl4dcDeQE0$@?W3g6%dz>l_JUehU55!BvTvZk6LtbaQy!O38wj&{u+F8aVH-tj}0AK;{=}KkirfH&1K*t%R8ibMNN9XvB zGs+&nrAZ_H^|<~cOfq{=HF45J3l4vTe=3Zi8NodDsbzndar`2z=~n4`sl#s~w#Gj; z-lBnC%I1%Stfijo%w2{QQj)6=yb0(ly8r+H?ZroLZw;&>C=enJz+>^LYiP%n95pA- z?kDB>Qqq2Pjd$XWF3R#tS>%v95D8S=DY+%NF@&YDvybzNTCHQKTIyE*eWbo(X9tWB zeF&>xojcqbY1xPQ=~d>uir(TVrTGN82J}2)F~;%3U=k0uX+5+Y zZGB5ak;W-_uRa$ZA@I8^PamCVF&Nz2ml@78+O{n`bzvb3bqugL$YP^%kLy{gi>b7* z^4>b5dr;FYbxU&%%t5#zUmr3bP;1LCBl|7%*5$HeVwv^F8LrD#@twK1Fljzy*D{T& z`!TeiZsw>rf$t=;Ynd)r?Wg83oO|z+s#Z%DV3i>C0iD!y6_ZVZKmDQhR<}R%MrhA-B|4 z?n|a3ISZsnxC5MyXldCbOl1W*NwQ5d!FHD0B))I7N)IYHPyW4h=!l3B6e@v$sxSpF zdRnxSIpsM^a-^DNl+zicwvFUHS%zxe6uA1+u&(-$+}lNW14A+fLP5u&2Ox@+06GEr zQvP&O3-k&orJzP#wuNbFtBl7Aj6PyF)Ku1G*YO^ z-5J699`!mzzj~wYSMiZ6;d`R7hdEKx?(^1{!L7T(_PCE=1%dwnYo4`zSG~+TyL*)J<)qeI z6g{?XLmY2FarmB<)BZoDX5VO#-)eTcftF~egCjAvHxEj=Z56~otoI&p{uU{Q{Bgmj z6=uxmB_y@zOZfhjf1Z@=QHrx6zvrbKds5Ik4HPyhfAKq=pyAr!=CYSwRg2t~GrbpVm(939=c^!2P% z@cEwF=-t^cxtAMVWL6-7*S0h1U0o(Qteq7nc552ain2WFPY3GD637xJa(RqDEBz_A z9v0Ru&|(CbW1lVagI8*1eQ~ z%2e{Ff)9H0Zx(4#X_}H7NLn~#O~?D7`&Tt=KeJrP=ycG;s*jbeOee{~%?sb_N@JCx z-Xn6E`@v2rfZ>i$>0GSq9N%`44>a^vmDV`av$4W~+|bZX6~Tq!b(KyE5ONJKG5HBh zQgcti&qGP&w*I1%xGM|vrsoe+2!Z}8w_~E*>T~S2LcxCX6M(cRw(NxDmaNatXl~W3 zd!kNhcznv7kKxrYyh=VA1Cs{n`hpPN&b45Bz8O(>`(N zX=fx{Nzd`0=S(ixq%l;GqviaKF5%xJ@TP}2=}KH;ga8<1^G?k$GUB)Gd>yFWMv`V2 zk<>6^`QZI3;R#Pjq9-`PUQEr>wApoiL2Y7SoEB$202S$$I(4p{0>y0#s2y7zlj==U z&@=?mBbWE4S!KrN#xah6n=DKfD8&;Qeu=2Xc-I^(c76!N>oVu*bbS-I31})tRm^ILVo#|VRCJJi_)*a}>IXvHlt20pY=ip#&7R*&YlO9;~?cTXw&52xW#DJYc~xjPzwQsday zlu9rjcWH%3Qr&?+E23Kqy^KJ^g&QCRjaWQVkRPd9G zZnZlSIO934TmBF`87>}a?(Su0V#hcc`kLzTNm|MgmghVwP9F=gpJActx?n$Lv_xVy zmOnEQ^)-byj|QFM>kF7I6=9i}VN{T$4!G=VuA>sy#E_u40qx zO3L>iGqr;hesr}~^=~AJqqNwL%fzhTbp0{S4cP)$Wr8v}86NeVb(=YFCexw0Sg#{q z1dD(Vr!_+6>sHX>`(~qmZF6o83_?AON$3>THI|cg;!Q5%^hl9UcQY4v$;z%afCuxe zWjC@~oe-rPUQa@8U&hT9w~=J3F9Q{k@)=j$dgi$)Zsod|$#U&1hpRC(>+K$GGV$$h zMj3iA95D41!*BB+nz55_bFMLjSGo#g#|T08H7@w@qvjlXQ*7*}xw?+tA`8gdS2fZ_ z;B7)lLeD%gB9FYMaVDLc*iw{ZyA#2%*iETB$mOo%`JzHN$8+_r;_}&VEa$dzLdt~+ z9Y$*dP4H!{jm&pnYn|ps+=WO{RyFxGM7**7%~{CbnZg0LW_zDrwXA*E>W*2pI*XN; zEHo`YO+@=Ov|>~oN=8_mV>zxjQPlM<7sPLJ@kWv~V=?Y5j0xu+nLO8`@#$H5&WUTR zL5WnX$Pbqw>OaI&lyvt=r&iMU^|>C0u0^a{7Eo4YKQbEQd_|}YPgef`R_Wxajgh+% zoZ_ipdD=FyELOJw7~3lGpYZ%@y2{eX@<;hH7{xsY%s#Xh zk8j*z^lBq0WLy^qJ@9EF@1RN4_3CT1@TRc@ma%Ee9?6qDXM#JN`ukTF!A@}~{8trk zMY?+pUJ2E~8QRL7SbB3+7iV&16)4#CEK*fnIqznHrM*RsoaG{3b}!exTg7xIbA_ur z3HVV2@u1B1pUv~D|NsKb> zxISLexyN(OaA+4DYYDd5*Fr0n?G|n>uC)msTZv1zmJ`rmV-;LORwKs8#yfvHZyuti z#@7-E@gVvi-RTS60GinIR{tNaG^5gGV(;O8!QLQPplNZLJI6g)z6tpswtnVOY1G zFY+at7;V;8Mj>Pm@{!orIeUF~s2JqBn7QW)I0NV@N^05;6kYDh+t+c#C|5jiYEbFq zAKb1t4l;cypm9>D0t5c{^sLT?MZQ1z;6Lx9PL1QlpSr-?*^jLl%|0+T$;a^j09s;X zJK-FdoBsQvHie}hBmV&3U;S!xdkRRG_rU#V84h9o?4OvW1|7rYldq_!V0sErK4JBs z2FPLa8;Lre;+RZ0=_lz@N--mJ>T1n~n=YxnE!lk4!Pt1?xy=LVakiFCs9r1(ER4hq zoN%Mm*LS1oFzJ@6zEX+E#F7qoel=IawqIn0m11RnlRS%pPhh^I-nTJYLOo7e)f;@M zKRPk>qZJj!#8#H?Jnj-C8D>4I-*W`6R@SDH+eN&V6)fu+z#Y40ysr`M$yYx4uCHD3 zIKH-fTP1Xiunj3VEIlz*{5|3MH5pdsakAPr2Ly8`u=e+?XYV}@>R-Es<)PAeS5A{p z(z5Nu0Ca6VFszJi(7?NjD|cMF*xn-UWs)*q_h73W?bYo#AK*E2OYpZwaRK94ZMo-ON}kj zW84gByoX=LvXZ;G*G6eamFPtVn|I-zayyr`H&%ly=Eol+-yWj7)gjSYc?>cQHW29q zVa{AA41G>1;8jL8F{x9ZeZ|Es6k@1=9Ma;9QHnqxogbYTrJ!PdbhJ|9kc7o36ttM; zfs0k{EUj+#{i50_cJeo%II9@;qaM_OJ8Wg!X)9r?y~Usr+f5$XA{+qV@W6KBwE3l@ z@T8JMZOc|BD8(%hL{OSigh5SAt^sPTv0#`#U?4lQd0pbG3`r5F$s!F zcW#v01SUSTn5SZs6+;sq)Pz&12%tkq;*%d*em$uOrZKpxnvIHTHf?U;ec;MS&ImPc zA6i;XCalJrPUvc)Duq-EJpkgWPo&sf%x0d_DI_2%W?t2DiX2nXpi+|Am>=+nX<~Mj zQbq2l8-+E-Up@ApuYaXTX1Rfsh9^6RYV{g{tZgK@7Y}U{OfUno!oPYNY-Y(k9%(-J)aN9P#*8-4(N?2CUJ7t2Fdyo$9_B zywjN)AlFg3#$!%Y`-;h1>&-S|u{_rD1M@FVeZ_juHAhs^?e$wXx0ygK(m)2~KDEnJ z3Dykjr;O<}bI+pjE~=5b3zF#I?pXkCwU*ArAL&-L9WLuixOk_Hwu6O}2Wt;dYMyc{ z&zqLgJqRe;@f@zia>j$7T56ssH5V*JJW}SGJJQks?rB40(qo!%L!Y}q6HbHe5_9}# z`P3|&b*mGf^ocNki2ndOg}(5hLqZTK7#vizj(Da7K%9`M~zuLyKDGVuL`n8 zFntC`O2o0zH629*+uN~^Aa6Vm*R6HG@P}E$rQAgtiLT^KEV3L0KHinpLKRoN1Dg># zEpp7;O-{y3gKn2mJivjmTPHt-T&@>M@Q$TvcCt+Hssa2moc@*DK?>W#u_0os(7P5V z>P>nSXE`r@So5nwoFBOENs1_?t&BtP6l3W{D4+u$N=#F~DojuTkEJd?lv2@f69dpv zf%K)t0+0zuQ@($e$T)J{Cn zv2^FjB`aRXp6UJzTbmf&rDbXw?Y)iEc9El8-N(M&-_AB`;_5{y#*G{21iCO(zUc%#H}=!O_=c#>PUDy-NWMo;BlRjpmYsOt0GTg1r}jgT1R{eK$9txGE-s}D<= z^GRrG>Kg6;0Es2HvSo${nZUq2Zt0SJE38Fd4tPFeZE};mK$VdF-Nf`2=4icshO{jv zyVN3wOndc)(FtMZ94hzxYb7R~-seo|CX!nnLSJb5-kWBco}nk&pbXAR?JRvW>0G-I zUH0c0IM1a^G?r+w+t`+u7&2T)xGdg)c3Ld0=D(SujZooByB-3l}^yw5H*Cvpt!Ju-c(q1C);ZxN0w1Q!7FBQ`)I&{sL2>BCr_YgL*!11BZ9Vl(_A zwkPmCAOY4o7G&0{t|sL=~>!uh#y50TisiuT*ZW9^0wv!uw69JKf z1MUr2BO;I>%@!JGrD*z!>UK)|w@A1W9AIwr6`@{N4fV~0vNg1Y3vhAin)JOk>|bf{ z+ztz%BzhXsGQNi$T70^#i#VpS3Zhe` zw{mLRvNMXiNaA(9RrM>=A&pfK?Ae^DBe<;K>yBbW`O~97Ay3AfK=l196S~POADqd@3^Be+j1S z0)Q4M)6HB;y+;@#hL0?9Ds}au6drPay+a`0d7xcL+6F)J(m(s|oh`E&4mS4wA?Zow zjP5j*nz4|I|(Z@Cu5D4r?z@{Uq&&AZaK82SCG7tKgUaKmWE)0&Ex z5dr`Zv>y-7hWQr6Jyy^KZ}NJ~+?eB-nT^Ly9!tMm5c~>>V`Jhrag!Adg@Z$#I#ens zes7F>rT-KSeGcO-8C_|%Xm=mZ@FSm^HPPR(_N|=FY z-k=Wa6%pw?(mofWt@T$z&lz-s$XZRWR)Mg~-ckrzQAAw%x+xQ(uwR7<>Zx0DXO{ zAn4#oeLKD;uZV@()OK~`?Ur6-Znp98Ji4kYOIi&@_!sEwlWJ6pDE5%XqOlUIpOW?t z6C<)Cl3ij0sT&7&JCmEQYyPBho7@L)fh$jNSYDHX;1Zq}2*@=F05A%WaxaRrYd|>vXZ_EbBkg#ZA8qYeP>R&F zSI;CA7x>~%U42p!9bs~y31imP14%ugo?b z5`)dzW%5gWhB>MH)+YXzuTq z%ubzZA5H&WM6NW53VfjxwkhNKZqpXwR)nVZNT1Jxvv6JH39zv-%hek4|MKHvz*$kr z1BRBVF~F@$3~9){C&(1x0yO`6)}biwsL!s9|AEfV-aic9O*5QoCP0H0N+=w+V2a*T zP}-|P4C9SXg0Pj%nfFx0Ao|~Yxbt0<+U;u*b?N5p(Tslto)*vU<}wIYtR0y33Yz`G#sv@#AhhrGP6K18~-4Zhd#PA~|E#5{gczuEcJv03n%h4t@(jJwWvwNfSv5 z&s#@{y7UA4xtJVDpb5qJft&6TpiP*#5D*KorEohbL0pL>&-!@aFC;-djRcW&H?j98 zjoQ#H7DUr6p^;(}r%%k<&2`NO_!Tz`ghf#;Ea>`>i%48TKe!qJmRV=ZKNK zqjTPLBY0h*+d-{+S9!6jyk0}6gA(n$+A?aRYx{PyF%TI-cq}1|wX0gfX0-1nRA-Dv zT2?CznRt7dIrYk_ijk&0v-yqp76Qo823&e0v=7y4dcrRiu!qyB1;(mq*%qOQ zOG~2SYR+J7kRo+cYKGH6Y|8;kV)r57o8qu0sU+?W)-}lV53t>^DJu)XwunH}m}h&g zU)gOMN4A<%efeXUe~>tUHZqywAp`@_s_1KD?ML)2AHb*db!kE0s> z3m59^%O^o&O*UGv7sT3RXO}>h&p5ACK`+W_gNuZC{nNnY>@L z{j`!)3p`VRH?7q;e4wO-5sU#q)HvvW{FoZ3g6b*{m^6<$sL+|e5&|9s+olD zf`kaSH)D-%4mvKDmFE*S_{3GPKeFY^sNld<&r>jDI2Sr1Eh11CyI) zS~D(ow~^La4G&1@n)ahFNRi$X)0c35ntTR#88gfg9~jV!P$N&tcLPYgp?{b7{pEqW z2+OI&ovaoZG}h&qG2P|~a=nW_FHT|m~l<> zJ1uDpTt=)M%|OW>G(COYV)pAo#TH*S72{WK%jXLTKG=2yHAJxo<&6|}Fu_LcbOWws z#}v!d2`W*Yli;Rl!73J)YO8kfV0!K)2JtNTTVXa zb@4NuqPy@4hnmoL=@E&V{_`P~o6Z(-+^ZrzYO1tNZz#1cLkQ=5m<%VWyLhI}Fg=6< z%J3bsT}z3i-5^ldenbm@v=N)qZS0t4Y-srPgWTRqa!U{h#Y%9t*72jec=fumx&b@l zmq+?O>n?fW>ODpCO{M?GzkgmksJJ5^w+cEz1-{}!?82ob80i8yT2Y;0JG}PzdZLMa zuU@=Q=b~*m&hfs2bKu4$^M&#|Un}J-3jZWAS{lH#bJhVXsV^xt5svTHo?u}$j+8v= zQ62GqHYUPL2L7y5eH1yjkfHkW;a#PldZYmbgq#>hs&2wx$3$%g-m+PO2RW#xTD~-y zTwYdsQLHF$UcZKU?ldi9n+Oh5uN+Mt`-sCA*mTP$;xL(>zsPo2^&h{z5?0`{A+Keq zdq<4Zbclxg_QZ_5Iw}@o#C@vOq12L;Q6ouzEOL=`_eol-F8hVS0U$H5u}WPrim*mU z4w^cvjK9dgDBU?RKK|I&VyH5ZpUUh^6VDlq{SpXXq|RE?PtdZJ*?DtJZpG*k<9k5j zZhOOkNS{yiUU*gFeN{@XTw!0n@RT<%pz7AJ5kYgLPm{^&$GZv6M@ygqRe+Qxc?Cx~0w8|Szh&V4p6s3+>UcZwo!BL?5MXRUv%LT(bdbtG z!~&WRH-YS0FxdWnPvLF?MTKgAy#2ktB9J$m9ZB2?z%d~HvjXtx z@A!)x)Pe(fe{yl5FaKnz5gJH^F;ksFioTYBE;V`}DK6#3ErQ@wd2lxRcS=Zh1+dlx zokH)Xkho4|tv~fmO5i+N)otA($bnzi$1Fs4gpl4(Mp*(-io$A|ktB-8@IKG%j~wFr z-MHim^TU=lefjPdHs&Pv1xmFoXL2Sc5;uYV;RSMV!n`T>0O`P4*5OvH%Hu(iBd>8? zU1uhmYqhcMWrb@`l@+}Xqc!;sfAXMbvl+S${aMDR(K93e`eTMKPhT=O~K@ltqpq9^9)C&4^m zJGdScl|XqZ?HnFn;x-#vMaj!coK;k9V8}F6u0s(26N24LUANTw!^T6wNT^)tJQD~@ zpG#giN=r)Lsc0V!o8B9>(|pk0&EFilQsVYDp`1l8+X<9M)bz{-r9NF{N3lV|sHw zW(*^r5%YOvK2uvs_ue`zjY`g=+fj2NRu2LdUO%sEH%C|4pDI477`_@2dp!AM=r#MC zS!!VIb~cO}=Q%dBC*SZVJgqG#6n9fw9p8}$q>$6;a zW6<`=w(1y11#@p*3`B(UN8xuRCGz{{pO$%wuzY&^KQ)|vtg}!opDW?aSi$%#)jqW0PJ9SH~5dDA&t*7ZuC}sR{+GNx{nd(n2B(w8$uSDS%_sU>i zCKsoXjJ!n~0G!E7z@DPzdUlq8cjW->JQ=iiqQyvT-U$D!x*T;R%Y0yGf$eLrl{6zZ zSj3vHksP*3`G;oJUh=ApPu1F-cJ2ncOM+thG62sxem1FBK2#-b)662tJ9LE+@ww)b z?2^RqC$!Pch7Iyg_i00hO`_b^?FyV|@R;26nKtB=4+o*wf1s;FI0pxez{!ozQ9&*p z#^#DtGlU@kK6Gc4zc|+DPW}&M-O(PNd+rVn3yj(nn#=XmY@!~>Q&R^Qsr8!lNBP7? zdsPyj^t&|r5zd&kwY+M$YmA)F7e-scim7R1~&OP$o2%vY>el7=B`1iC@e%{Adv<>rK*s0R#T83bH$z zU(}~vT5Z+w*bn$YxIip~+<;Y@OgwtDX~W;0XziH5B;MRRHTiyL`Q>)(6}$e^%aR zV)J=9@;4k*AMeWbVJ z0nu}+vQ&>CcY%Yj_q6v}7TY(b02)DOrBelzXs|Edd0{AZ0tjtXGp?AsLDnlmU|HZ) zIdw4Y(H)GTR=~E8F`LOAA;a~EoWIPYAupp5y-tjThmup$5KZU5DvroAN6uoTmcm_% zzAVIUE)-v=+-#C4G+H$@jsh{diuJU-$IfoJ@ z-WEkFT{Vo@p^U+29aru@5cV9)*R5ZVc;~q%0(@I;G6c>;a5JYTH@b zOYj@l(UmuKYR7S)od*6((Nd1Gc8xwF)FlSlR%C(h`OZ(z?HY;Gt-eZbLTEv}!R5Q_ zo}cYCl{ps#$17fSd><~Zw6Qi`TI$WcEnMYq9$^nSDMDd%5t{*$uDf^JZu+##pJ_dg z<;NHYpEOMp#X?$f2%!U^D65>ATHDB6|wHdfw}#9<-Qz zx*Ly)l?s7UUQ=i5AJxAnvf?NAncx_ubLFU`BNP85zinH!*HE9e%DhCmjzOKHo|q1X zlgYdZ*Kp#_88%nNXt(hQt`~NzZR|`*>EU2r4TuuDp^tvqlPt7s97^zfu@sfKreuSL zC|#DO%vIJD_>J?bNjWc~UV0s6C<0m6mXz^oGc<%hmeCY#>-VgvjMr3GSJ#1pw$mro zJQyn~atI_AODIH}l-(0Oxlx`C8#ar0$%@K1`9>`$rVLS304EOhJ|R}0l=uc?b3B#< zHnGGYRW#!E5^OFAagNsn(ipLt9KPD!r0kAF??qme_;CK?Ro*5R&$Bb+?Q0}fpza3J zU4k*dYKtk~^OA|lK~|KLcL)Rlq>GKs|NZaii`kSAghmNl0D!eigiI>j0X-Yc0(b$# zfdm@UThckgEIE}dGIP8u^49{hx-_GA zD-?HE#>ko#Ytr zDl_~*bJTHT*hlP2^h2TS-BFTd8u}1>hck%K7Acz zwGC&)d}3tKU*nE$+v{?k7NQ=PB;i)BWrvHw3GOw&{{D!iO&*~w6vZ=E^YDixYqm=f zy*jJr?r@B{rM_A{B2POYH&{+wl_7a8?vb|2uEj9MVj5*N0^S)V0erfU&ji64b5tym zXnlY-O9oQ`MVMNSY+tmDN9T;`cs0+ot|^HW|M^&Qz;}GMF^T!53Fd}1zeVnT_FjcX z$Mmtwe%oj&UxX?4IRISl**==ILQ;3;c~MEV22dX67@S4s;_EJ&-A$T+#VFJomQs-1 zBIF^n);V!t-{#Da6xB1&A_8R_ek={{gk5>;;9iuM;;{~a#1oAJP^Po#PB>y`OIX}~ z??|O-tFcU<(r8ZWADU{qgN%h7RZ-Oz(|+d$jtLBPg#7est%c z<@|D-P$#QwSuRCxudnT`dsDI#F@!;x)m)lfVqS}4!Wc=!YM+5!a{0&}?#8j0MpZ3X zxV;)7|3Wy==WL9gATaHF%~fGkXC!1)F3p|Z(|=9;cfR%(9O@K0o?NsFoM3gi6ojxb zJk&A#aTrbf?1U-MPp5Gphcqt#<<0V{;p*21$giKrH1Do|v)3%^*q!TCE}sEKKYvMK zU)=m3gZ?A4!iA*;nV%yy#W4*IO~)s`hdsB4Yr|pf1z9G9R0J(vpKrz-wvh}vUQOZj z-*#pu2@7kqXWpV-lT2dG82q#V@2f``SYA@dX8-B1-H&1s{F1Xxe^0d9lucsuYO($o zpSBFyYXPfy7s34($7{TJ;cd`&xjc*dLuh%~ZJ|&0ol}eD2Q7s`g;q;(=xIktsiuaH zw|l6UB=z!b&zoLk>UjsxXBFO*?Z4Ed9VUAn8VRD}SZQgxraefQW(F7ScCtt1ZW`QZ z*L~RuS7!#?ZH#-1bEZ(7<#ja_(M~0aQ^}5$S1t=va2uPOY7-P}dHSA99n($_=X3f~ zgy#xn(Lz*(y2JEb-?%wNy~)>cIdmYi+489~6Jxe-%=x25ql>n5UKl8cXc_;iY?RHj zoKs+&o6Y*{Xu~(n)JRoeYWkqvxMk=I->0W&e@n}`#F9w+`xBL)y`!~H85`r_<{50keONB|bBmhHucDRi&pJtj7% z`eUT^o1n&1?$lWsSal%XfLf_^|Mk6QIW@W^)Ld32#g@8h-{!r@Ttk*51}b$9Y&5yo zO9astZAQI!C<8Iws0=l9WS8ONb~@+vkbMt|H0ZY!{n?PHVq> z+r^DxW|CQu#nwSK8E@1U%iyUQXRTkSXuth8zc_`Y? z^^*SE@f9z1cUoffFTc78!5p+$&rdfH8C8o4-T30coM$aE;=W+Ehv2>DLgP>w@k~Yk znfF_2u@ZD=si-Osy-V%I$7`34guufH|ZyE)6jJsbD^e0RlSue^7~8Y01zzwHC+w?9J!m~ydmq@+b2>B=x~Y0nTMsRHDD+Gzi?BE)w0IkaoD>-$B^ry-3* zdMZZMr#+VFR)i{?V!KK?nLHj#I&L$$+m&$ zkq#`qR|*4WpTECnDfG-QA$i?g{3Nue9HbVf!fsWNP*&d0&)xJ}hhg>SiHNi_Rr#WO za?J}f+oR-e#*B-I3xmjwqo(&M3!mDwr!2-)1=TXv{VdX=Zo1umew&RSet9qFj`C!s z7p|OnWx*uES3|68;b}4;Z9BN3M)HGfg=L$guJ*5O9fbVQE!*n%1YgN>eJx+28Sl>} zFczIUZXYQIbw}NuuFzTY_^pndM}&Ud*ttBZ?Vvzq>v?g-dekCu2<yd{XTr$!^F}*Qp~& zvlD5;;A52c2qXxlH!xG^qXQpz>bvpa0C9G40-%iY)AZ9cPX>b$)OTSZc{VE^iJs_@ zWUzSvaI-Vw=7KR~ypf0})_k!`;8Itr;xY6T9PwZ#VZl?V#EV-P-n6#wKpv4%?UdRy zIP81~b9@AY^wB@j()@dOVTEI7B2A(I!n`=dvdD6skZ&q2hV#AJ`fITLL$gf&8&KX z1)P#NiiL@k5aT#asrd%UIX>fJjNR#5%G!}Q7IiP9R4Ztxf8bLQh7$!@LuZ>evCB6#|a=JffJLwoh&XH`P?)Frr3hBSxq3jT=8Qgfj@hvB8}uOfA`)mvfLXS?4J!ln#Q`ZTkpxUwYtaiUgbq8LbAlH;|5v1GVOQ5E`0yc{Q(W-bWmRIIRq?C3$7b+>oPtTwkpz$! zb*Irn5}Kh=QL)|Hq-(778xUo`Dc@>_GNtVbTN0HC46{ri%_eb7*EKf5mMC_9nSa6E zRlL3|RcL;DDU(?kX;Jj6QRvqM7>)mpBebdJI7V1Y$wp7;#}98a&UqQmm@3di+SmnB zSU&3)u_Jfty6)MEaRqu3QO|-aqEX_B=8}?hhr44{OPNW^2u(9w>s@Xx)uC1;&Su=+ zG^rv496d<6xB0bSf@XlKRl#d|FhM^Qh83YvZP=K9_|uC2qcv#c7K$Gr&Fo3C;^C}m zaP(v7jY6Gc)BFi%`0LLYl};R4h`I-k@t3Pms?xC%NGoMV@KJ`J>!%(sct?D(@OVr# z8K{aWy}AN$OZjAyRjS3n@mB57C1GAKi`ZQ~qKmNkp=0_Hkep`I!U3}@VEKR-JRVqq z)NUuo;jE8V*lZA#0|kj5pb;lnfJ$V)y06IPXv=)fY5l!TKeKRkT)NzOw(J1VDm?d1pO2 z>hYcW4Js0Q8hX`MAScD(ci}q;<6HR)P3!@HtGJK^=?&PAIl>qC3AzI{PjzeC%y!%= z4cFUs?U*W6Tz{eQzlKpAOu=d+`3&}C54|)MuB-15?|9#eGS$(l*e4x*8;z3S{dLPC z-;}PSunQ%`l)O6&Frab2Do?wK8X6XoEdXv0?AgYw9YfgLcb45a!%cA)KEsN+b>jor zAz93sIk?!xNM;x@c=GXNqC)C;YJjyZrq;{&_`vCVL~Lx7Cw$uru|0)M;h~8CMn)&0 zc;IF`yF%8}p6M60p$@miQs8Q)10KU!naE_czND|6q`eJJDR)mgko3mF6kQ^E^m0Iw z2*PbFf;cSIb&l9W&N~wiFGQRqjf{Y;Qu&3ee=lExyk?c_Ed&w9ozo{fao6ft-96~3areuCunGJGAcctk@m_weXaAjq3 zON_@;I`vWenBV#7VTeZZ-{?Ic@VYe4^L5PLg?n;*-3p~Kaw_Q)Jc zXm3)}a0ON1;j`A9_2jF=rlq4G?&=+|l z>u-&so=y~HlmE9OW1M9%%%4qm1XrqtrK*F2pdgv%h`egy_S=O@eH0idl{~!AIOUxxFN#BsQ~YEu+A_Tb*$l)Ae&y2qv3FAe~w|Tm3AQ9LCR~-o%O=`nNm6vJC7>H7KKJ#NifwG!h?*!1IrUba!^Y>aziUoB@CaLLUTz=fNZZ z=wVWJ-I7!trqYGDIF$nietsJIJHW9M-cL(Jyv_!?2O1^7_{+ZlCI)dKX>9K_jA;O` zcy_@C-2+G5%>CUMG-78382bMRu>aVtAU_wNgTI)71(Mh20=hLIb@i!C9E0 zH#wKY3!wQkDI;18dOQFy6bOikCi5*#CNc%=+xg*33cYuBj4y~y7_-FjDwG(?!mDu;8CfSB(l&iF!Zau;I zQB-T3r0X=+$JQ0W!40XF4GlF3;l9ey8|Df>7liGYKzrQP<`@97Gg8vf*%w{M@Bz*HE+K zZC?G=!UNf(TN;F*RF@ltq7?0Y%-s~lv?1VVxc105CTANk+`68>Ud%(86z+W^rm_Q~zI>$I{7iWFd3UL)TWmy~W+D4yHMRR5RjMN7e|p8;1~VhH zGy5tT`n(=^SAJ*ACY{R!6uXnrg&m6GxRN(i*yk_aP3@#c5psH(7~(b;FC8Y2I@{YB zkASwXOcV%2-=zGlJAG$f$F0s4tAYASKGFem7yhQBzAtwFCprYz<5Z=KO5%Qs(YO_S zd~_=J8R&y`_kS3lf~m1B3KVoXJB1|5XnIX6(b316epN>e@2H!8Xeu79p|XOhh@_Ds z-r$NJO`P^lodFY~?lI{!#qFrN^p}K&*_WxJ?rERP++(HQGZ74t zNs7cqWLtk{zcGxic!AazLiUb{ppe^>F#{wDy)22~lr=TAiJU|G82Ov~!vp_?53*~lV9ycIwu>UEsW zbHg5V9IO{d#Z6er&k~xFppS?M8i#}TL|IvN6357vIX&o8Ksi%rWPshBt}h16PT2|y z?&&{%uhoQjN3F~GAxv%hhUCLJ^wDy>p3dI-b5f(|%Wm?Dm3zZ(hXF_!n~t5bidy!8 zk^6=rUyv*OU8FsswTg+`>BDry_RvDt(BOH+lg#yhAcfY(%8fs_aJ?R_MD2QQ{7bU>%YJN#?qIT0<=cN zUy=gwdXoPF;3MZFYhDH#Ep2OU$UQNF(YOYr6Gi6wjvhoM)|G!qLcwB!lj@2k3d=Nmt+!>`d_ad-prme#`4R441wpw zJhFEE0p-C!;#geWgT!hQBo*KX8zy6He;z?MH$iig<+S=+bw4cw)y`1mI`8l(iHG90 z+N>_z-K5@GMf0)}$pWiWPlp$fE-axMQBb9kh!0Dw@edV9>=I~LjM#a3vr0C9+2-b@ zZ-sr-GG(txhAnl~p^dag9pWvxS$}hO!30xFX5xi_2++CKwxyQazcOde-;A_SNx56p zR2`7S`n3}%8nw}{-E>xQ8GGDVA5L0)m)hvO1{?Z0XP5i)f%t%GCX16U#lpT2N7XV! zhh`<0+)3tvNLP|~wbp(Yg+XLQx7H0%na$i*$+xy!ojNCmT1yf#E8uQViO}SKm>BkS zwk{{#{ z>9CeP&2$CK1fPWGvd1Zt&ILxk5#@`0VM))G>n-F?2;72s9&yk0>pkQRJ}Vf3e*XDN64M#+C{t8D*K6Gt52Ake$~)mvo+% zqJ~pE8Tv~<9)ywrj=3x&|AE}6y{1j24`?4tzM0HDNp=C;4*CM*_q30{(NB(!6&I)l z5<7`=-U-n?*FH@t^+SoR!nrub-`^-m-Hf@h;G|! z!h}q`Bf6>r$ybKl=k7w_dH-2+3V7VC8viw|HJjl1RJI{$u~A$;|3aWLWb8fRXw)znvzL_7yNfiR-Wh zE{oLF5um)dq?ify&A0^DoG;JBen2w<<=;^PV?zPBoy6dm2sH?Z82I`pC?N(quLXH2 z=%S@;OuE~VST)>ylXa#*$`)KfvH-;r81yOM9R~Pb1l$TcPl=Z32+RDjpqzxDaJg3C zZt0pu96I${WUoquiP;a-9arSmHb$+ka>mm36qg*}yr665D`#S2D=3t!Q|o8q;=(L= zWSd?@CC(0Jdt?LJ8!6X-Rwd>8U_EhNLYGQU%oQA*vYQfRq3#Yuw@xVqr;@XQK1ZNy zMqG;8@C=Up5Y0&E+#!8^1&ZPj*3Xh_vzsCu-T9RwTpKv3^0y+Irl-QzLhLk!hn1>Y z#@Xm?%Q*b4GB*&tErgUY%QmL(cb~<}G1sIlmLDpA zfAO7_c+YoBlyhTe^ z3RPQ;fGJ)mZz4B;WT#B4nb7*;DWX9RYCn_HREM#bqqu#uTvFamCZ=ub>A3tVaHM=H zZ&kn%8*D}w^f@R-7FEY+eZ}dV?PK>=+97`Mj1F3ImWn9EDWuZs^|@6`Mf(VsY9-26 zOIBWni~EOZ!!xU_APa2Hquq1N%C{!X>Tx}1w%UGue(fB2#SM3H4C}-wPK`bQ7@=TP zqb-s;nz|AUl$US0Kfv>n0tk~L5C~E%ebxd_U~|I?P>yriWH%t#{A^^#vD2=^0Ryv- z3MP5EGRC~KV!9etTL&NQeO#5G6zZ*d`mbzDk8k{b9Np^pJfkBR+YQ1+Zq}1!d``b! zu~Zn%wDDV%ERafJ7HGXBTHoXp#gHE^5&d1PS%eeC)BBMnS#HUMox?yR;Ph+s8|qH| z%MQ$;Z5`xQvWY*M{jOzYADigK)3G8?(7x(>bWAcnP;Nru(O8TPQb)9dtAnb(5P?=Z z_L{v}%!A_cCf6sSvp5cg`N+PUJ1bg-Y$*gqH@?#Kh>a7(kLI!&D%y>y~PACgLx-ltLMNfCh)E@k%Aky_aN)^5aqpsvzSY>)Np z)GAW!<-&REv!qb-l$fQZO8Hm2GJ|B-)L99~`u9{)+r##+6Giy;qhoiX6P#WSTboU&Mu45Sg)E+@k|U8%y&S^&EZ^Tm2`so z&vM=H(g+@@#D=DiA3MN zzAPjZwF>i*4(EAVG!vue8-70KkJd*iu8v+~nT^?EDcVu_9wg+vn%>PAFVPag`=-k? zbYDCXNYp4XA58PSeAYxF0G$PX2*BI|xrzVIaD+j*e*SarpCG{JLS#go^$hT_F9nWd zcp-r3^O^@>lMiG7qq}~joMY-ttgw^hF16FXLaFpU%6}{y%}X{{0|0k-*{{Y#DZj#I>5*esyuy);a z#rwVrTjtBihT5%{*(Q)di)QPjxJ)@o$UlX?M2wl4g6q7Y*rRTB^Ci;{pBkF!NSF0T*oa8L^C@SdWuRH z!5^k|kFD;;6vnuTu6GhjhE=^oSTY!sr()_c42`(-JFlCYG2R>++@ulnp1R^;3bzhD`uy_)a~s! z&oUqH36}h7M|p89AngMJdQUy=fbNZj<0LfmyQJdqr)8Rhw+91RQ|5HU{pYJedoQK= zV%gM8vKf~@f!7a)Ss14fvEAp{*~t^LEH1*zKS3GM_WE%6t+Nv1GaF7zZA&0S)3A@X z)=YJ+6x@~$&F_F9N?cw)^8AyOt|?JBWiFX?@#k_*39-8WKs`xu#Q{J?00Rl+!&r0B zCuR3!sV^~E^P>TBCLpf>D41RvNC^pt@}HS#65kS|5XM{`1Ef!KRJsD7T~J8(4}gEa z2S`r==|)yvNC5t2!60~Rs{QkAneOu_Vu9Yxprl)O==jhwp;>DXvw1X;(!7(k+ZJseqp8Xb0qXP#=&+r+OoIY&Kbr(qucnZxs}EHt>5(L}kvGLYeMy zmi6d-KgYsTdm;K7ZH#2T?}OGGq~+%Id&E$_!)6k7NaFL~F{L`*LxN(|zdXtbDAW!@ z69x7nlMKl1es#gq_r9)DO#~@@YE`QdR$)$S-V=oT zN@N!yQofsBC>A1Jn8%ycm~hO|r?%N2E#?2QYz4p7*t;nuOpRzYZScz(-6N0vbu{68F69gU>@M@P)t>k|15t-7K-%G&gLNvR<`03r~<>DaV7}2Wy_7k(=-!d z++qh9mEO~0d_Q45&xn(WH-z#O?#btIk`HSYu340(@x2Y$KLU4Nz+{ zP`@Y)M7&`dUty@e{P(t8M=u&>NbT!a=9^F#QNCxe*mYVH_OHVzvc4?SBRkd{t&#9TeH0%$9$Z8ZDwM;V{8zv)LQ`3v`EnWK9q#V4)-_ZRiAbxR`T(DD+xGazG5Z8& zk<#~%DcAww_zzSruAw*x#!Q`mZ2ln5`b-{CJ$_&CWOeTPuN5w16;6a)i1Yv-IMq;m zS{0v;e%PPt+yQ#)9@7?!0Uu&Ly-oWp0O;F)HJ-qKoDaAskijxt<2x*tJ)5fdAqLZD z=Z=!{Kalr-pbE9d#Q5_e@pY+e(9`*}${ZN29+_@jPj=fHn#99)x9sut7kl%Br z`uudD7~Q&nM|}AFb!h&LP=%K+j5pGRpt66zXdqsT6Cezy~ z1h_hU^mebbj<>d@Hx!{W_#7z&!oh(NFON$dr}f46zap?!vfTco(fAvKBl~ZqiTd2B zD}`BO{8#IuJ+^_1(`OQrj>xwIv5v*m3=uv-4}&5I+ccRt`E%iixfrWCLW9aXkvvsg zC&!Pr_MW1N1=q$6<&_n*?2=oJ_3l~JEe{`K@l8_cDJbs!5|g*yazgFWzB^`f;Vw9? z_$o115*OqxlTGR^SL`J4W0Eq4VWO8u=T`AdU8S#ZgYls$jXU{vk^mR>6x^=Aq!sFe z6H2;9c35;j)l9ZXymJ#R)46g>j>h4cIzrmq&&^75?c(!2m8;nJsbz2NoTHB#IMWR}Kb*flm@0?XT=TB%Q`0J$QS(JWoJmJnMF76g*8Rw!Tz^42@atw@7_jv9l!9 zo!-bNJofST@MS$CDNkzovlIV<>jFROI}O12tZ#`Md0yRpvqNf%0;I1-g=#J7$a*>! z=&c6Vrgf2;L;xud0+$#SRtDWvbp+jnv6R*%vel(t+GXe!C{V1H1YtwYeP5(ged2QG zhHG>8Fsl5&PY>)h^b8Z5ZDnI(dZ71nw%&}@gCcK<|L3tPidp`n3j5#&ahgV(!=0!b zvX+4T`9Yl*&P!r0-uwD>vOXo@$9J;>_*-ZRF3b&VrLeHlvS76U3}Xct_EKw89hOQ@ zGW9g3>xXLg<+gPo#6i~!V4TUYf$B7!hAFwgKda>?%u-vBw7$C9P{~6HN9=`1X?WN( zI~DII9T)1Iu833eiTmFEJA#}KAf*4)rt(}8!Fln-Ujp!c!&t?EY6ZylA@1V(WBGW% znnOx1tso~`k4*G8{~{;a8Zh?#2IG?5Q2gLDN=XZj!hePJlF~HmTZZgx*_vL(Rb$M~ zw`6UBYr%e9arswUZq*S$!29P?LB>mxomJMEWStpkXbPQCnBz_J_UwP4NZwGKr$lra z39IzGw~nmk+yakfS>;uE!Vc5TI>O6Izgf~WKgjwyX`w3%&o-2mGgo{a1{+v>`?TD_ zsc3PlGF727k>zofE)#s+nS$;Z8#G)0sI_sBKb^EYuqq34zF;&FHuw)zrDieeV!cD{ zk~-Q`5#L=j6dC}yM9i8ubE28NbNh3G^C`r@hIIB5>zD_wX5&kmjYpZhUkwk$&;9I+ zZ?|l9S4L=Al4zZyt)o22C322c%j%F0pp9?1p(qVjMw%t}YQ`}EVj4}F*^!*AT}K+F z=*JqyiON7FTlb8MBbZ=%wweVZC50O=2ZpTxOeIM*^(HdnvYtI+1Jz~}izwlH)l|Wf zwG$1ET+ssqwdIJQpzgxrua{+1B|nDg6TfW%MNG8u8lpT37Y7`@Ix%q~yHn4b{}q-^ zdaq%KmwW`xX{Je1ag-hmK2p#Acp2eT7%%C>MbioH&=FOFMg+eW|0Ry!_5w10% zl{EP~4#G4v*`^7~sitxTXqw%H44@Av3l42$wZ>(a@sBxELuOmX-+;<&!1z&CGkbah z4SGLje87XA`W4Y3mYjPd1(R4`d5ONeVku9#1A`p zO{XiAD8Me8TSj&0+H_fcsBgceOg#S*3h-Lg$^Xa4f#-N(iDS8MC;>J!80#Du{X&$B zJMeNN`W?YC%J24JtE<8WmdBf_H3PYtz8nmFuhSA!0{_(A zp3J#RLCyRIQR?kJtK9;I{@U&q47MB4D<}|1Z`2aIiEX*p;9P$icr2CrMY<8ar*uI|)3KJxg%?j7o$xfN#wEVO zD-tJQ9BLQT&N)geenfGR*A?V`0(jp?${2nrf5CXJnJlUV9%H$wy+RJei3}MQ3%Z-) z$JPqlaf&0VyL=`%Qo1mB%6{0^co`8Gn$giV{dJ4ioD7d4@na|FIUxO90O%~(lDW)_UMdkX5+YfjYcV5Bdf6djuo~qlm?B*U$)TVm98VGm) z5>>P5@ds{W1JSei)CRo4*_$@;5vLhEPQMmd*1+?|TE;EZ1~E{PhuMOp>xP!(m|Ihg zn~CipC`TrrnzoEjF+6>axz4uoU3%~9q?*N=a9yrs5u_}LR&4(2TJy)wRoOP1O)r-oFQkc*!gelK=0<5Y3 zeIFlzf9lxF67Bad-vOa&62sNp^_6BK^34^Dc&0?zlYKoc~3DI8g;6GA9@aq)6{q+ zc0LHvWY;8P#**Mlx3s4nU)ynhd*Q)_`R_2Ik74c7G->cl4XdWhJtBd7nxEsvzK`Kt z5z)OLStPxBxxy_zeOpTDxNvx%j#%ytf(Lvg|^%jZWW^P?hrq?2ahfLntV@V-Mi3%tn;kXrk_U&yKXb%k+? z8h1EIE?!j}sI~5+fKFEqj5griaV@Q_`C1*N=0>5$umv`mwBUZy5?}XwBYin^+|*Mf zgUfN(;{GB{!xNer6b-FL%7*07@V0fX>`}qnNvC6yal96n({!iXps05}d#=Zsj!N^_ zCdu!bFRW1y*_(gh*)nDv7n6D;7R;tT$=10%Z#P!s(s_ub)nr-w8J@_`__1+66;Yl7 zvRx6j$Y$=?c>%1~Gd@_5#J$~S1RrUdsfUKRiCSYXmI&)P$n`jC~$>+-kWw0U1j{>+zGyFq_rygt65WXYH4K8d5Z6 zJQvHcan_JD%=U$@zfAPPj+&=ZGRT|NfIT1A=%!*EsW&nFtHJ4P_WoJ*1bruFZeLD} z?M&r~>T}AJ^$wP`w7I;g_m8@90=-8~>N5PcidO z;8>sVWO$^*r8;2$9w({9z)Y81FQcfn38-8tJV%a>YBE*7JVV%wAzaZgD<0k`TXzmBS{4OG$>a)_Q#b9S71Dav@ks`wMxq?3Q zEwJKniZ=m@Wo2?`O=zw}w2l1>QaxE4`Qh6gP|IKl@k<5wnnJSj$A`w%dK9Y^ug5q~ zF$g1EF0c-|yO_+a2{)`S>SQoPC<9Y(Qcl$EKqI3V-nx7rMBDM{__kP1%?qf&CjMbP7!1+n6`K9R)j~icV zdGP)WhokBJaExjfQ+w=w62g-_mfmoR+FbmQ4=0uKMM9`^^#J`fBf!;d%LRuSbOYph zqa+{2+lr8ee_X!sEMdOZrl|ws{g{VtE3bfXq|UXJJTb)a<=kbt{+eFU;~lYIf`BYDD3=wv8%$GVh^`PKTqg1`{f3TqUbR` zzvp^FSJfVlcoW$57u4uXLG%~&NaOm*`LLkt1|M=zSisB)Maw+KzsG~Ye?i4q{ddem z&lh=(u1qMloYxa1Stes7ADyP%Toj+f97{u&lz}t8cKH_+1~Bb*hYh$qnj%`r4r#RC zcJcpeI~^-9X9=BrJUKz5oz?R=H4>nLcS(% zt;^ea9n?&$CtQ6$XE@$+PF%MY>v2D`^`S;3`y<3ACVeb6Bw0B<20uN0Hd;K&+HFLd z{D8scHA2_G)NYK5exPGzdu{TeR=Jt1{{yQdO@-RF;Ib#q9eUj}Tw(MgVj?R}T0++?#lU8%OLGiB=7@KzGmoZlHW=$+(4 ztz{ugNM@NT`z^ZG>7Ijyy|g{+usbwrQ{Yyka!;$x{jk~5`^?sg>!bzw3B60Zt*xEt8OSna$U^A`%@8)g zx~kWw4qoY2m?_+Ykp}WkwD{GHca+Y`5ul_PoxZQXVYj;~drPRu8fK$Nd`Eis>FEs@ z?d+?FMYmrPA414iOE?$PlvA7ZSk|ZWrtf3#XMK6V`|ADJbuf8FSLZrn#F??^5ogRp z&WU($S>Fmtx?#Uoy zDGVM@=|Dy7+)mb|6AIU-p1?(ZfW5lJZ7zP~dPlpT()n1os=e59p)2TCCaF+(+DW-ZP2X~bOgy2XrELSH|(`bYEsrWAt9*}mL>9l;y=ObzPa1h@x z-vxs2uH~PL@A`F;_kGBV`mMVI#5)7idPJY=PQ%}{KUt+*jpRL}*b~nc_j40{D&dCy zZTfa(nw2W3IKNd>#>=1n ze~82>*<{-8BS+#$!)M;akqgKtm^A)F%1GA}_5SFWmvUw6KQiKQiywFHS@FN`4lCl;$eR!4{=w9f23%YIq0 z{r&Xe?DXoJrT`m$BG%os!-~A$F8m<{SsM&?Gr+ig*VJUnnqhfK=+pRUQDs{DE88Mj z|CHJ$wp!bVZ_MU-TjZ7@+GuBZ4^8B;mZS43m1 z)=08fCVN0#I=tNEw7_il0LJ3Scw@RLX>=~>-J3O&Dw=pj^z41PRqlPop3*Qdc`{p9 zvFiwP4$J1`)YMkI@aY@eKHt1OM#`qe>3N&J-4V;QnaqER0Y828DGcDw(wySL?ch(b z-az00Ocm!MAL*wzv2FAh#L5HVGnL22zpwWKMqzzB zd`>oC#}v&S5nO(ln)uB&X&M1x7#U##l9j)!0JXgorzm3LMr<5LjN_5OqgUmfDeZ?s z#(8KCncO$n(znyEi=IJ&@wm(jGF+;fFtx@D{YB?6c5QzeG`X&%4=%TD_G4t;36O!H zC{;f!8`!6vM21VJmNA}Gc~7*MLvb+~xQXV&l+d~}>?%G)9%#VfZ?h&e`+I}|56pPV zfC594JRe=zumjy&B3i=`y2Kh%g_?b$c4P}g1j#FpE#{GJ5u|W-Hz52FP`9f`zVJKx z>K@bBlPSWXCgRwH*t$(zi)gdas4g}9T5#;dgTcaps-^tf;0I>Y+l{~X@bu;UXr#0k zIHzSRSBP3`l@alqsG|jz# z{pzLn2gwv5lUcY*g&M~S_crjd+PYjy;7YCSUi67JbJt(YbygQsmf3r0t8~h|!_V+D z2}ne4f*NVUlh7j6N!WjD3lgDVgE1U?BmY~v1DbOA*5hD3afRO(6G@96<%A3}ljTi>n?q%MiB6GQp&9D>vSWm@ zUqg;Ve9yU4UfQt6D%9RuuQvE_?Q`u!1sdkPI`J4uRd-9d8Xmm3oS+hl%6Ml&tNoK; z3GkbH7^jn+RiG}5vOyxY@K6fvqrN}4KuI8I)+R?H0Cci3kMroH1P8FSBTuy#e0Jk@ zw%v7io@{wRf4|*P>{S@QFTEJR{^82CqzWhWi(c1gLs8h?E;ZN%&%RlHPb@=A6F7VS z6UzfE9p{hHtXuzt^Z!1G5)UP_?^Q79p7|307s#$XL_4T)(Ra1u7PydWtI-%=Ag8fi z12;8s=jSYc>_>N=8YFnxJFo==FSrL7yn_-mn-OOK3wDvWE}z1?##sFYmA5_ zJ}gWDB#Br)Kb{UJ1CG`~D2L?dijce1?#(j=qdpktR$*W=X|tc$yXbq*&gO&6lvv)| z4zV~!%-cawzbdSyjbIb4b7?IN*QwQFLW)ocgU zzt(~pUvaiC$Q?3ugHlC+HNQcmPF;kx@*tPyhV{@Oc|TiZt<)~UNi%!T>*jY@Szgd~ zpUW)2nsrVsFMpGolS3d5hLF=FqY);~n;G_erPwFlR(=*IuYQZ;9ZR)NT3d2l^P4tf ztK(H7!Ha2e?f_rk@%Qns28c>RY7)DgAwvnP>zI031IADLE^75QO!+Bg? zbC_*S`^#mq}6X0WMRnM7Jg>`{go7zyYrJf3K9L?acXvH zJ=EoOE#fM)&MqQ7i8S;~)%L*xK#Xh#6SjY~_K`Z&$0W#Y;q_!TGpm4T6jYnFgL*z# zPvqS$BJG7dwjyC$YaZ1-fJePb(Vx*o*}K)$5+J3(Ij0zb9DlS(U9BKxywQkr2epBI zP3x0kL6U*uzo6%j|4|hAC+=!OQ`2*$_FqW) z$I}8PVp*s*&_72Ws68kYJ3)`uBOx`EWRtMN9e#p;Qrmx?X&GwrllQ6^-FY>W{TyFW zysOnAP8xEZQ4W0_*ryAq$5Vb}VnYR7z5wb@!cPRm0i?N0j0NfvZ7bw8nx>|2zI`N^ z`S|lS;@Cga_2XKe;{sPgL!#`|U(j9a;HGX#Z$gT~qwj1HSaniHJ0Se` z*qhitqLqM={TJt3=OiK)-mm5rl)g{mazA>cwVftNC|HNopzsCC1Z*M8z>}A%|47O3 zXoSWUv0G*|CY`Do6J#Yp{r-XuO4G@&YA?^`Ur%x!!~TN4iQpl(5?JbrE0pZZVqYxIUP;oC#w$}hn>=|N#N(c&6Tje`VbT{z2>tn4d zu^YgeV+rDrCG)44_~_vWXv<$vUobXC9N?38-JC;D}gY#kTPm1eApXrWbDN&8jr` z6yVjFj-OffkiQVU*W=qqz9XaiH}8?n-j`-vNZ>c%W>NWq5{%U4Ejb$TzYu&!g*pQdKY8 ze);9}>b1E6LhL}hN8S4=n=_Zs)2cXg(-f8%lBS8s-vpV^ik)Bh1X3ysRE!F^toNr_ z%7InwQjEBc_o9`n4E14ND5w4(8BXs1it`c*-}kqUd-3iwN1H-l=UW1&BYHvUHRJ6Z zpzOJK?OHx#`O@$OXC|AfQhkp+G>mPkQghJQy zy-<%>QlJdtvV-xY6pMUvzm=i7;loh$?0kOn9nVmT|HO^tM@$N4Lxb5jT$+DE_7`1z zlGd#S&g9O4Rm7pNSG$!6>rQvx-7m=;$M!JPdaN1S$@%+@B%h>+nfZktLSfte`$Pae zthY+Ns(|1Q3DJz1MD}v_BbjY?)3r>K5!?ca+e0DO=%4oa-IFbvSjdS=H25Q6T^t{g znHsLxL$(dD_MH7-1U9#}sHEsLZEs9Io`M}0KLDPDJRtyD26l)C91yWe7lu?|P}^H% zl947&%YV)w$9cd>;|#YEMgjZ}DV*ddfd1JH-OBe;5AFfrV~|nG|Ebp<7vsdVa!w0~ zpxU~Zah77b#G|-0sJ7Mkzn&FvTMmI_W8cL97m*7?gBIRZ#fXxfSzmZ@?xQk1Ctomw zuQ*~^X58KbZ!6$5?7GVdeegO|@t;)QRa zhm8d2gQ-Hpbog?V`xFE>&DG0I3Ya z^|(&nWRKU^gq4iW&I;;-a=zVRVNC+4<#Q1&ENhH5 zSw1g&cWAC~T$LzIjn>WKjUS_uc2@%f8dDk%`vt}k%6MMjq8K0MuE){R_aFI8=iI`h zXT*l3IC@};lDyMlz3ByPHKma_gfg8M9_ckKRZzeoH~zv(lEtVVm%(=82L8n{@1?#k zWBip8=Ei`rx$m!`qGt|D_K6GBmz|)9^S=`ne;tffV#Guf8~cNtXNc#a{RN-#1$?LI zS$-6U5Di>ZUX4Uaej6}lBv(mjQS*Jq)SCLo;FnJC@hgmSDZ^2ex3FuTfXLIw% zBFz)cK7~Bu?X&Z~qvcYSfgi7gYL}b7jy0=zp+_nnBJ@f%JIK!T<#*ezcHbTLW?dqu z?!E<)X9bW|(W95;J$EG9?CUwK6bopwH&TLKEn3Y7M=Yy0<4Rf`b!Nky*b`VUr!m4c zH90suYLLS98w-Ey6MAqc9SenVJJ)91(L(6chG`Eb3C~A%$>*9#q6yx`VpvtV%$r|7 zCa>HA9Wt58Q|?+tXT@i->!1?Y`8i0#TRls+xhZn zCNL6)+gppdrNc={!11U$5s7OAY`u3yUCbVPc;e)TSZWfk6!Qe5+~yRH{Qwlc!<>c< z`KYnLj*oJrZ@+X?>U7OmRgd?c@u6wkk7f_-aVFb{9^Qar=O?IlU4(qjish4lz&z=i#Z;dD`0dam?`wOC{REPh; zc(~;@UQjS5!ubIhI?m=Hd&}r=#I18O2;QApphcel_8a7y!C+QYe8TRimv-oTgzqcK z%KqG7zD4OF=W|2e2Bv&?%IFYu0URECb!;$*av*43@nywEJ~)_0?=k_2d(P?fON@yA4coPxCr6^uWY%VD#cE zu!h)U`6on+n(P}qTD_k0h4viiDwtm#0}l)55eO{}d7ZSY+bduq!jOIHHtD!g z40QhLOQ#D2UYt^)?Z65u0`q=QG`Mes=Fk}Gb3Fh(D18yEc|5vm@PWti4-eYB#*S$K z97n1nn$nQuqI}Pps>ZPYSc{i|lXo^8&)+bwT*8$WM&|P@vS=n(77$AV68jLx3k0$# zFho|!+6wC$A*H^?3#>`%f=;nwKrvAs*UB$vyqFNZ7pHseG&&sy4A}WV!;Gi`z_?_G zUrY`32%MkGcro_C2{k$$f9*t|gf71EUCxIq($jahsx_y*c$=Ve2boHS)){6Pbs>%E zk})9mQJ+KlQDSB$I)=R(TdQ9e&ez5Zm-f_a5z*y;xU4@JaV^Fjs3VJ&{7EU_XM#@T zdpNa>y{r~)x8)K7fF)FhoK+2+9=87G)qky{?uQNc&IQ^-U)P^9cbfhv0Xe_I0)~D6ikO? zV0o~%)rIGM-#Bh|1IkVq#N8Nb41whd6);1Bq}M|zEyc7V0kbd;N?hbD5Ktr>yhY&b z+`QTH7y>fV*i?50*)3*f=a&OFeGk-~f!%%6StMY)U9DlzBW@llhGN1SUqgPX2NZe_ z0L$UsU0o$jJ=H&3r*}tmvnL8D6|XelAC8NuyX4l6<7EM&(0wl}e>^6?Hwmt?t(a)s z%j8%1<@KhsUOxxNu@uqvww0!tfHbSTYtdmQl4O0&Y@F)d1)Q!MAaVow} zcAKZ5LU*n?OjHIw$;BGG`K+~8n&{WH07n6K1)ctmlXqaQ!7FEt+J&2ecaxRMBI-?S zBA%RxH?cRyP@^}*)4B4d`d~7JAgxD2jm=S8QN*k505_;kYJn>NZu%Cuv6#%*^D@T{ zEoI0zvgth_;*3i!nGGyz2L>>SPs=q$!Us_8bL|H(fp~9z%COZ(r&yB&WVv)YsT{0? z84mlruR1f|%s!Ih6*-Oe6qQ1$5%GdQiAwfP^gLYkS}FEprXfU{GB?6p4Rt-1by+nC zKV=w?2yhbxXzNk0>WMU-(AyCrZ6tkBWBU?_#VLvLy!7veWZF!u{g*Jd7&L{j6k0$y z5P(gsd~|>p;Rr4?`2*0x!u-%62Nby^lcyRlnk&|8f_-TKsBgYq@qR^)!`(TdcMkyH z^u7hO=V$!34!)#2#}`fe+E`ae$`6>BDsye3rJ%Kto)-(-oq$WHHuJ8Y2sLDR5h*0k z-*JZVvhdp06q`-{sz(ql8`pJ_s0YrD;hX25Criv3$7MHuc=$eSN4a1;53un-%a+mJ z?&y&UKf|##^ziNQ&yxnA`{c%aW?(*fN~OAFY&CatU~DZ^j}`LK5RN`DzfF6D5-a(h z&WxwCV*dzKo7iuWx%Gqj*G8Pj(-GslA|KYHy~lzwnGl~+b%<0i?E^=Lka8>KTNi2D zG7$?xuX`oFtd=O`;a$7UUQ|G9AAM~>|CmSn9MyR);-4ZR4ffyF;oQxKR*GrLE1EMe zE!b)w1uaG4tBMzxb>gq{{2A62GX{=%=d%3#I z2{c3QZq4R&lzX>(XI>8738a@Z&O5J7MR_KZEd9#a2J!Ui+s){>{#cGUclFWU?35H- z7Hef(ExCKMtoyi>!s`gKiE=M5T;@-#U5$PCjLCQ{W+p%2}+C(IR9w$5arQwW|Xr2XIJHJV;0RbBCjjR#Hkv&64lM#1Hl^O zJ7=*&ZI-g)T=pK%%l}iSk>7r+M$dVD&~Cy}S+3jdu_HsXt|$`qW(t4{&Dx9&Q^jBr zl&*LPxvTM5$lgul`Q$5edFL&S%&Ut~87GE>i8x>Au31($JkFOZs7zOvAB67jvvlH| zjv~eZByw>^Aa|W}SZ?AL{rN9oIhLZB{M(D@S_5D5+PH&M zapzCqf__M>y_s_m<`VvjXyc9uZ`J< z2-)<%@tb{pc0;2BsNV~@F^3s-n6VXn|6r~0=k_s^u*XB= znnb0J71UPodEwxw$rWEIlNpw}+=2J48^`h(-q^f)PbpGQmV)1zuYk<_!AgSc9#d`U zT(8{r9z+NY4w}K2-lQMrptxpfSYB=uxirUqjgfr_hH)`o<^%C*B{eo5YSZeAb- zO)boicUkLS)C~yGT%W@X2@%@-p#mVl8aAE$d1p34OiP!f*J&jUVyNl2r^cQk5q7WY zN~^?b8=*39Ss?08VG$nYCF`Os7l{$)waDf;CrI|Q?ee* zTv(#--4<|+wa9I0lQCz!@6n4o5x*}BuY7J9XjkKl_GDNJocOR$@d7Hc1}l5hQqss8 ze$Fx09I3gP(vMP?JHgifl5X7wPxc;k#(Jcm6qCxfAIeo|Uhy7yXV*Fit)}o#iL&z7(Y59$Q-gn3_tR zWhG&AHe>KJ{&E;dMSd$yjC;o{kF^q#d8zOwCzKIrvdCBkhW@4J@czRaY4p>n*90)E z{Qig(xG}cS>Mj4U7FA7kgT;3r5}}}9GB|>Pi;1&6Kz%i<*$*z%)7g-U@2Nkxj}hFL z#nolfOWfmS7v?N1PR@QHFj;6&D~C(uyURAQtqn#5F&3(cSh;uY>3qI4zJz({cX&y# z7~Z*j8BnUD$XpHR=j7OG0JbBAlL`fp zIqulTDw?xIYsIiE465@Aje1`$#`*E7m>a zALaU9cxG&NGd4j?OY2xiV3EJ_thb)U$C@Sr_IxjBfq^{A!fSVw-e~;elvYRXCJ^8N z3xPD0kANloo;+ID;1GO3d}-Spu0Ii`Prz{}cz1@&K=i)us&~eSj6-wk#*befFKg2d zRM)lepD+zmu{+U}0l};1li7(A$84>&cUTU4_+Rl~;Hs)wo_tZTJDhkCcq-L^!18p1HAo$`}}+h%Wp zG~kpGQcYg25YmRZ1)0Afy_D!~>Jn<=Y;VkAY1Ow!H8;Mr5bwti(tmz82f#?W+es30 zX1O}j*K;yqs8D|dH-=T;Li@+F*AzyanWB&sBCVP~54ef- z$UwaL*DbvHBbdI7snQl-5@jwZqeSodJy*M!41*5 zp&%LJ$4(ny)_I;#1^0t?3J`|4*8;s9P!@Id2r}A!0Ns$9JhyF9=O2J9Y*;HVvfj3Q zwRM|XR8o!?F!~r9)D3$PdXQq6m+SodkfS)Ft9j!8@w*4m^tQ1JHJjTH2ZkLCV*AJ#%S(Ct1GRuxaQFU3!?2w2!=C-!yC(DA0PSnx2)l zER(bhUV{7u`9Tj-H1l_!??B5%v$*uYsI~8EAyD* z>BoxV=9h+5331A&@}b(hG}^;s%~eHnK^DDBS>a2qt{Ob3PWN9x1r*a*y)fqByDAyx z2C<9}v%qmor0fZd0M?fJ@!{qokRRfsqe$vB+QJRMt<`GWd<9NGAPL}`!C-_(4WO@_ z?u3~93`vhjLUY_dthnF9^yW{%UH}u3o0y{~&;yE8IU7@^l=YFThRfow&C-=!b}XNF z=(MUidb{sY$j0?r(E@pUh!48;F{6fw&dX11SwugNkd>U$KcXHe6B`q%q`l#U2)v0r zWsQ-%$bp+y_7>a+gm8A3+Jg~PO_3)Ir3$Q#PlxX@$_@XzEy#90uzO~bC5|3`-gokU z65oGI6kzzSO$eNe5C1aZkU;p=tXgHhr$vNkDUu5?7w}NtSID5Moxksu8KLHeDkGRO zD6DXQ&O8V4djHy)b%u54iUbG-HXygsy8pJ5=bm8LTv}ZT+DA?6$5%L@e|Fqf<8l6Y zTPq*Uh$;sC%aRk@cZSLkgUu9bSD39C0sY>{{M+ zy3fM~Zr7QK(t}`ECfNZm+ER&L?pU&kT`TLQ1P@GBIm)Z+KF2-g>|Lw17i(Gf9c+iw z(sJ@GV-pFS*GB*A@3Kkot<>B@y z7sL#?uzlLrQhUP6p5Shqxq@4iFuRMj1^*U{56KvIV>aJ5p8rpq)<7T6reJzuh_{Vc zPk1MhRBc-zK#_7%#(N`wQ&ez62VAzHWD77@#8wDlWorphC(tTWF>~7&2`iB3&sO1R@H(5phH<6cqa#^zsK$y>+=L0b$(%UeCV{z7Ylx$Mg&5gln(s9Ya zO1ALz6@cgbtHayV#j91KC+L9^vQ_=!EQ@3|Jy~&*M-V|;w%S7H67H|r0ZwkI8u<*# z|8nuFwFS~#ZC`>BW0%i==-nCQUh zI5E8$NWrv7lk-CjL)`leaPjO0xZKXJ9-?vx=?NI*Ed`#iWg{=hnNajl(up}?&wz0B z5A%D#l`(R5N63vo#ZiwLz=R|WQmjw`Lz=pEJz+NT*`WV56I}cQ*ZkhW8tb~sk!hCC z*r&}kCUtcFg4mA2zSwxnQ#q8e;I9QlZ?XEE8Mj2?T!!#7Jc%2`i2F3m@nzIeCXwi% zy!Vy!POY}Dj(>){`QjD1BiM+m&DOKz7^{Dxu@sg6F|@ZfzQSt~wF0D^t;@Ycb7e-t z-a&&I33UUW8=tH+R$TK5FuX{=yXAstxRWo~uy&gRj{!}5j^lpJ`PtNH5^s#!i>i#hbwP@;mXTt7>UlZO`*89gN^;WMt>Qvr^%&ApPxb2xkn-r;oUw;=| z{TMs@X?dVu-BzLPrgTqaRQp&SzP$e3{Z3of10HerHNVa69OKs(BZ*%c@;)`moMQMH zS#V@-Ee4kGrnNV{k^X{qkM-(OmUA865!E>QQ|uGX$E7zV{BZwR1~;qoLihJ5f1|rT zoAC@~A}Nn;dsiF8r7k(r?5ha6G0i*H;%={Rr1|eSbu>Twu&gn&@Vd~y`cdQ42$5RZ z>)>sh?|y<7_ZIp4GFyl^q^`DT=T!afoN4G}(mm7>Lq+=9OD>FJ%3rvI+;9Ej{4y$N zx?j>`gn`D(h=z7YxuHeuDR2dxWaa1!jj>G=?|t5R#sx91s+ zd6T$*xz|;~*q_sqXS`(BPkr``#Uwwl z4=vDy!ei7!6dbO$hy}WDjBoZD6PGMK(s-|qLjg0w+d+>9c4Q|cS^S{6!jq|dD4HR6 zQkvhB29$uH$m}mDLxEN|*Fa^l$p0T(iRfu=K-74ecAEF9XbyaO&*vEp*W5yc7IQC< zMvOXu#k;)GH9o@`0m)n(fET5%p%Vxofo;o->yjYB^G0#R{18f92-t2mi@GQ~PDGI! zh3cEmOul_So?i|~FNp3R0=BkWD54TnQP{nLR%+kf6x!4c9twGV0T(Mn$giN6>EG{} zi&%A%r;4TA&~L#NJ|W5*f@7o&msfeEPA|-*SIXIBZR@6Y?y^QS^8IAD#4Nw=sh z=9yV%reUF*MeQJrlSJjo;`sT7$pAD-W;_n$2VM*o5NxU!avM4oC0~UR@Ggd<9{t*L zwUh6x*hsidu=~tk^;C2~E>1U?EO)J5oUbuUlX;TS3+nv~g1JfqdMr|4G)#G>K zQPVFI1p{-ss5Si=gbYqlhdiIfwPu+EhCf-8%Sq!uIiq>$%$^kdEL zi!ih$5i?s;1F^nevJ}!@Z{0AJGyE3zgY;;*j?G8>hQnq83kM z6Dt`k_-=W{ddzJPdIC$EgC*3;%@)h|);2acm;9#WT?=CU#cQbyC!a<6e<{6?QHSac{x0+`*I!(>0OF^Hb5$ z8ATpbKxN`-HFu}e__9{A`cgDqB!KXGs?Svl8s*|=48x)+jTHLJ02xz_EdIho(VjvD zm(gdd3Vp;cw^7K-hxV7HB|2t$h6hNoBK>HunLK;8H@P7Is@xfY{{O|l@ngx238uux zUum?#YZQJEs(1>~Kn!4j5{d0mh~g0gplwg1ZA}BnvZ;-Y;t87QVG365-W?W)XfTVR zbn%0}Z7mILX-Kz}Z&7$V64L&R1Z>EEa;GSKI@u4P4t0Zz(-zb5#e}EBWC%XU0}+uP z)_ROTBa#T*xk4QaX+RT2s*}nZ-+85um}m+^Oi!&|d3 zw32M;1l5?pI-{EOU~KCYjpq!dLQI`T0)X;Ve-Iww+G8VwCU{=4Yr`UM55v;by)pM2 zekiSGn>XANN2RFh%MJf%$3JW=d6^gpv&elW$!JCvA=v+f^tHJPkp0Ul^QMvVbv@TWw*IRR7XliOzZ{l3Z2bAPFP)5{yfPxNYSkr9$;V;-}-tgY^};& zm%$x>@=_YxCQw}Qk|Oc`*zw0Jk+P?AADKw}j2a@OxI*aDM^I-rZIaq&qb*(6*)b0$66!+=y3pj_l#(i9;Ip1c##_MQfX+Pd4=SGL;DH`EJ=Zz)@lQTT z)&-fC*#|i;)d$91xbh2HV`$B>@t$!H(N{{}q&Q5%v+yj}dJZA8N2o zegY~g5&~KVRQBkr5{9;n{{o9|9%hEI=A(H5N+~!$fkX64JNgRh6GlD8d?dcvz9Gq3 zp$0E2)r@8}O^&~#t^^nk%g}Cj>=$}ITJw}x<)%4zHX#cQ91X>6dKACA(oP0hd&QN22ng0DWHr6p*ecOIC8`yTG; ztZUR=0~Fa-y?Zh+AeNg%xa#l<~CsO=I{4L z#)Whr0nx(Dv3AN2N!VMS_mAC5d9Z$VL#Jx(y!9@#yDS$|wemK_I}{#!j3S1GmT%9S zYyCWLTm3@_7xsi|Z_Wzak7nhnJsqo1=&MlI!D?wGG~l-{aCUHH3qah$g%HM3d&|Dh zagiEh~8~?=RBvn&%)%EEWF);0pfwndWl-=7> zMXiTy9~f~t!jD>lorpBLNEgJ@9(BLX=9IntmDGU!n|NjU8T!>@o4B!eUlkmQk~Inx zY6pXatQY7#J~OVAi0{MGEw{Ou%SJzDBSU*1xf zD$7S(0=k`Fk9gT;PLWV;ZCk15V5cS9+)B6A+ipCPBwGnLq*ZR7x;dc)mD-c9Rwjjb zzNWvl4(uZa#>&$_EG06YXxgCR0iV`BjWqgfBo?WKb>`DttX)hPF?*gHtQ&+s9Z@z3 zN2DoLCoR@Z*FbL51${!28gh94Lj6qHJ1G@KGBWJRySPdGag#NEvTDlRs?vsm)YQw? z{PH;KGC5kYRuDVZl+;NXf9+$Hyw#??Q@clf44WDnXSiy66yjhbvKP0pU(Q?oVK7g$ zqQLQRBd5{}_9af!C$z6^+4Q*MVsZ~?|5mpRSJ&lC?!B`Gx_MQZ{6Z{}A?dJ$EVQt| z$=7=OOXw$z$`a%UbQ%VFj!*yMU6dlS0UMY&EU*urM$1!aTq)-*jMi%QH-(6El>7z7 z9%A_k=z@>+pMi~O7F|+8)`^&|)gF$`rzoF58sp6`Q4`=dy+A+h8|UH&38yYOJT@M+ zw7H!8sM0vW;$tA^qic5zvxx=C#<_+krvEawx~j<{2itflDMj}1tvm5Xs>O(y*rEUH zP`;jhmcyjNIV0-)=CkG+E~$AES^nT1B)=^!X$3m+af3$tN%*DeKLp)(h{YE>S*V)D z%D?DXE6jg_AyG&de6L7*2M#-r#btlq$ggU_7T&7I9YCU~ojU+SZyT#iLxzhu2^&B3 ztpokeF}=RY5R<}0cpNO9gz-REscA7`@ni)Fc4JHbMM&3YtRA@Ie5nD~rSvU+KyV5v zIGmiAq=ZqzjXzg#a88cN07S0o_z7hO8hIMafRNZ@Ot2FV;!f_(HV_?81cdEv#yROK zN?l@(3ka^4ra#ERHV`0InnAwyo2>$0Y4j+#8${K$4$fj<0I%=xZ7WhS-0T3N4k@Ce zf+Id&DqTfP{xV?W5crI2-3Yrj8Cx_#ci(GN>D<^r03KrEi156`{KnYayZ!AON9Xj4 zX24Mgwb;`e_QOX5ld3XNU-UNkG)IZZ07)=lgYlUGJSI^upvjr6;c_R(*fOt<`5jo2 zQ{DtmHugQsW#Xgwx9?_LjEQ3B=8ntbkGci1kP6D(%bB<5I@FR$x-0byE{i&P-uu$h zLhD_2jAV#nJ1uUWw_RU1&Rd*|)cY18*{zNjOinITLi*ON23aR1Lkac&A{8=J1`jou z#F{(-cgON!$<6?C(OZuV(g+yap@5o(B3N}caf27pDYupgzZiQd%?^O`*7{}W#l^)A z%$ypff94=7V^bpV=8D!R3$(b-dpc9BmSX-|m6R^A{-hv-FK0!T<*IK#@8q5=*-)rV zjD#opBMViFHZFD^>`06V5a_O|ns3glxshnI+KjXJ8njP%gZcIqOne?cRKY2~0;jT`Ju5pvH!+8b6o14YF~9dlR!pZzso{%B#`YMI<;Myd^(oYZd#CKm)ZA$#V_$v6wzV}8(%p=a zQWmG%i+Z*HpVKfe5Ou9P1jq=tp)!1+(H2IaKOLRUioS9d(^zpTAc8mmh&905y)RDR zeanwXh39AafPIY`iwr!?l&o=0;OWt#J9@G4FGcU}XjSLfgW_HG|NA=|5 z{u8&m=gH_NkD~4{9TX|q&yAN=xE81~t>8ZbJuZ;Ou!)y5XxhO#tq5Pn>;_o_F8ZqZ z9NmIjy`t1xw8|~G?Cxcy5psI34i4W=UEwbo&OH1>cIi>Q!?06SrQ8v;SL*G5pc(LD zHVfG;Aks`h++Ekp^YS%Z?Sbv0^!x%R1+Ge?;((K|t>KMqUD7)Cy*xCEB13!BOc5R6 z#yMXeMHm{LJD5g&5xRTz$KOl?m!supeM~ZH%-7KudxwD>G(=Kj*UPWBLx zGzeiuHf{7G&!fomsJHfee6@>^#;2#THv8-&wwsdS;@m1G#A~J+7m>hLa9AO+4lZfG zReg-RKaIj4;|u-+X`(8%uy5zq0n66O+@|pbaH+f(`>ld&iHoR4SGhq)Fg3h?vyBaN z?e4SSLf|)3P3?fsYp_lKf#Tl%Yh6sb>K8)W#BE*vC`6py;s`ce7x$JY&Nj=a@n9j= z44m9xx^DU8PIh+{)cRGbq!cE7<-^Ng7e?h!tiAX85wA(JPOhe4b8cGZjnj(z)Ekv3 z{F!Ns2iJU_`IeinbYXxtv~XbyG>>r`te1PkvXfuXE~Zb-k+IUe`J+d~eKP3X6>iLG zb=E8UL5N?mO*e{p;6&v2eQ`!q}cl@oj3 zuDdr5fec2Rm$yMyRaOyO(h_;&O3@GZi`7bfVOo(C+tA#*Ba;Or+OC3BeU9yD(b+=k z>C2fi%l|-Qq?eSipmo*m4x3d`L!Vg>GDwO7&v@plBncYDEtR(Uptz0gCqxY4s6_RM znPYWY9{*8h#E`@V_=!VIbtq+XTK!()cjRyz3Nly@E|A8dh@QtiUQ%0=?1o#uUUJH`YsrS&Xh*DBeTzv;8 zbvTUu-E9?{w6dvN5O;V>A}_}OyS9~mDd=IB91I+}M&%_~Y&2r>eWCoavGdyDWM-N7 zaB{@-LuC+*Kjx`aZVD3xe++ya>u?C989MTSE_K62@W=n}x|-fMq|^leF?<4eNc|D{ z&o8yo0FTd3-F7>>CX|nBL$JMAJR!F*S-ex64e6`8S`4i@E~dVAg&im|8V_F_j~Bn5 z)0R|%9gy|P2ih^bZ&S(Pc24poj_`hbN)E$L@e;}<2Pkg5i z@m}ou2E7FH%XOdNN11l)1ERA04|wG2ZipWUNYXXFSP3m(L+zHC&}F+57L68|@K;BpchH&W z$U*!oVrP3afV*()$b4jb;d6aPm8j!7 zpUQ5r^{A2tM?qn)r|_2mJ=LcoIUlHfjQ^Uo&^1}7JJ&X6E7|X;aWQco=UXJ&^uPc9 zNRm)exiicasWY=Nn=<26vYvVqXT|Cl+`A$rsI1CgY|~S&vsx;Ku=#%QQsDBLqbbis zFWn5GFWc|(KTwV*8=V?6MLnM;Gx*+f-Pv}&aMrh0%=WifsTsFp$`M6~aRaNHX4F9q z{V1#E1nocPBQ>_^=T(u!f|u-*Grc!E!;8wQ6vHMPqwn(`G}rh$^ZR=@=hm-FS@Z5t zNA{4jYQ)oy($r^^{PpQO_~k$^a=YY=S?-dyUij{fDJ^e(<{b;td8wXHt0eK~r8#^o zKUc@0?bSs2v(*ICJImh0N&0dP^lReLzx0n9(?R!O4sxYDwYM}%si1owrDyl72Y3@& z=H)2UtGDhl;9DynOb>UTJ|zM}CWF8S-REPMu_F3R38+^JC#LX**Crhjl0;3i=NAAY zBR4N`*iPghDfDze_N#dC#&f&TaOKrikGb~k;}Swj-k1MCr#=6HSa|=B!@=r@AFJ>&IV2~kIrR$yJ}qt_yzif942(1v0uKj6)gnwO4WJe8!MV!S4_hUBo+I1>@HsI=a#KEq$q2$%$8I>nZ~zQCCp#bU9T4SY_V#2PVB%dZ<DSVSoeet;s}F$~7cD?g$8()s z)3?|0NpC@=kk)quc_bX>VJm{~PaS~y@!RI3d=VukbbIvRpJ`JG`lP>yd9FYX?Fnoa z3`Ewf{|+g#yH$N@#`FzaXZYNfNO}?==#XJc!|bJYB<=QO z95*`7q@KQLeywZw%WT~zhG=L4M+wX0#g_Q1*0n1oMylIqqk23C7OT&DNi3UHN6C$Q zOOM*G>)7354O%?^#e_fAQNB@J3xC~HSD?~AC*Or!D5A=OoaTI0Ubi4Avl2JZ!QC+9 zRaMK(88bz?`OD~fO_tD&2NAGXg{g|X9Tp6%MS$t=P~eY?PMA10$5$j8iLTw{ zM(qNaxbzi^-9yN#j?3iUrBAo=@u;=+k2j%;s|^Pgk4Ky0M5Jn*`M?O<*VyKt^m5#?#b<4>S5ktig#lUN?c+BtHq)w6>%Yv_E}5 z^tbuJL|h2fkWq}7nr-Y_W>|mZoN4`@=_3aYQ6CD;HF@JDxw<*R!@_4F=8VslgX zgvDz5XYHtkVT;(_4f8a1`KMm4Jb}SwdZMY~{W}n!?!zj%%{3uXmQ0@A_l;ALseLB4 z?Y5-^Ta}!9m7T4VqR%HjNXR>WQ^A!t?Ixo&boQl5K{!&Hx;w7W;Ul_~i zKI6s{SA!w6i2aWl;)1Y<)D}b*`Of7?I&#|7p*CCd;r&PFW^0z6xr(D)QxsfCq=_T# z`*=iUe`~A)pM5UHvVoI|vyj5@i|3FzsQv_;^>WUS3K-(cfvY4a=D;WOENHp8Q0iNb}rwAtW@jq(S zaN{?^51p@TJ`%saa_4>-_Jm^<>m`sQ@0f66vLWCqMcNY_$CGSB?Yu0&>Bfs|bv04L zNvvzw*DL}G3y^q{l=yXwt3A^h5JppgOr!N&l;D5`ZJu){c>PB&cyukK?kh`t500OZ zL_lCSB05zIql9^MGQWm6v(%LN*vlb(^03N?urVu@bE-;zoj9 zGSUvKMEnf`QH*5hf2W4u#hmU`pW#nK`V z3R5Gt7z5K!p;Y-R*E|HPBJ<_lV&bjqyyn)<{u)t)&GdUV@ z32cc1nSGB)$&Yztie8l6P;uP@qQS7&-c#ph=TLQ9*M2D>fp`fKFS(V_mgthC0dmYy z#%YntLY*81FaTIL1Y)`>3jm~|R7y7wDWw`Yz_XkX{;7*Iw7uagpUb5SIW2r|rhXuw zE;LOK1lV$3or-QgZvTE)X{Y&pQfo_MUmx}y^1^4miK^y)IlqtRd-_^ z{|DkSMt9fmx9(h+Uhf%1*by@G;KrhmB9foh{@MFTkD|XNH_@xmezvjjpAo0D#AAaw z4%8SBuK~u^SDyX@Pdw8tzpZc`(o7L{sXbhT07H)T&ob@Q<6ozfaOr*Cre_horptKK zZfLu}O<DNp#3K7HnWvb_seOzP43m%}ADVFI81!%)b24i`r` zNrt^)N8YcO9elmtKso~tx%o)SZwNFR&&d;zsNA!8poU6Fx7b@4r2TX!Mnti0AeO<_ zIYDHn4|JElcSLT>4SQKWhz+FNfN|Mge^({qRb0Q7u56;UegsW@1N0(m>t<@0RUf-q zQ!+0lJl;R(!lzcedTrepA)TRf7;gSSQ?W?e$k3LjxCiTG&TI!duJYOKOepEZ-s^<~ z{w3e5h#r?_?et4s+L|;P1HpY#n3V@VT|D|YGRlnoL7(zqDbpQO?^vR{+|G3f8XRXL zjEpyiAJqQP={Qe%;K@y34MbBu^P$zVxIfV~zJZixF53?BWUt9tRpXeMdbg=rdHi)F zwINyOx)kR3G0ykk>z3sJkbKEF#c}!SXBzx3vin2;3*d%;a@HQ)KP%f1`Jwi*;Q%NO zIN$S30^t{=&BZVP90Yc+O#n+A3G#Ot;0s>&RizxHznL3zLwdDp+uQF@Mv5mDmh&=% z`|E{F-cl)XsoSNSiM+JRPLTJS*9`HRzJj2z@cXzq*yu>MxAEc9q4nw_e@y{CiCuf) znq)ms^6Oq;N*0$qnrL(p|GL!=z~UgX5Pwj+nW|N4anq=_)?)eVVAKBYUJBRX-JJ`Q z3T*X^@x@BgEgiboA5hIigdIg@g5w!P5MpeM+t#4{ z)a_T5p){`sCvk!>I!u-nm$z3U#vmH^{IYDiBI^td`O7Hj6xR=HCKxZACU*I2e?qUvpD+SB4+L%qG?N$lC9POo^|qbOD`_v8x?%S`7n3tOqPH|? zq%d)qVZG{E8Bn9fQTk_%J9}r2?gx--ta9tfG@htZ8KEb3ROt3x#ID;?M6DkB|`)?!?+{D}B6W`=6Rz73o z8|S2)uiexwS7gz$`DqYGdQ6h$h3)UkpFjp9Zc;LSz<%T)Te3?5SAJ>37)k8vEpkz? zwnSlTqV${B=HIhUHOXBme2}Pp@biZMnVEfQ6+v&0*pmHVIOJsBhiSh76LIOHpAqBx z&?>I^=kqk3JGI<_CHcIuzvPdB$Y$yd(Os4sX)oSRa5uYqn%gRXig`r^xY%jL-J%}z zW-j(;{GP$+%kqwtx~&<~xY=SpGbim;ewFR88}E5M-Jw^;XrU2-_N#D12S%?yY&>hF z8cTnsc;rh5y4Gw99v1s1LJ%B~3;-k*Z!${a*p+<lCt9bu&6K2-xfnW7hdH1a>F1k`e)}W#G1#MV! zerX=SPbZCJ*wx)J@A{B~kBL>A`D?ZnVruY2_uPbqAv2CwcJYx^W*oDt;T8J;h?PA< zZoM2wT{ozv0PTUOFcPxO-;Z(2pE4Purii(50-ldx%J1&Bx~_FgjsqD|Cv;n3cuRg; zuN@+Le)ezjll5Rw<>&v17)sxCrJu3U0;$WA*MmOS6#H@MH2f=gTIAa%f}U)qSa=66 z*-W!HU*Z_=^Fj~lt@E|?O`eq$!7AV;gEK}@i08Pt@Q;0hAJ6`I;EuZ!?-#e1#Q}nhllTH2OxcLcG1PT6{HWVkiWE zSllV?eIvE)3=#6euZYcL@k(wXh?OEnyn84FS`_a>J{x+?H1CU`|NiM3MXmt*wTF>6 z3A02&z1Z#*SPGX)^5SW%#Ep6YP9)@icX|10Q=Rz}Eqt0nw7~@nCXWjtmF!$Tj8+Y~;w;n$> zt6`UVlIHBj9$VqR7x6&?kWzPC3# zlsYbK6AP(xO5&eQf`Yb&oihyp>yh|fpnAIH_VZ7T<`-4)xLP)p)jEu&xQr{!IN_1N zl8<=dlhE^FN3}_v`F1ZMm(Q}W@2-WbOh?joY?tl1X2S;SF5XITW)8c@WkRtLQUy%gRd|<7JVLb&Ce;`I`o$E zpFS;PU@~hhLm>VHv~8*&>spLbSR1TE*`?+Ty?ak>@W%P*M(9)nn+K$?g4Mr!50JRk zvp+3aCmay>LiUcJmTc%=ZmMZGv$LLIC8GXY8Pia!DrY+ z`lc4YP2xsvk+txqxZ}w34-k!Sn8|{L2IhvWueGuq1M`d`a!HnTqI}0v7M5 z$s#Ps&WGJi{?s1Qyg9)_w_wmF+)?qsmAlgHo&ElwcA=GTha5&_8-^y@95ZSZ1(a%! z82e^sZCyX?#9w_Q_?yXt0vOj1aM8Fw>2%BLy}y&|>?CBl^$6yNG^wV^v+{dXMFFVK z!BlBm2NX{f=r7fadHjE=bGHwmO0iC?+Ez(h2Z6B%x%kF{`S`fT(T+@>_}EQ=+u}5T zjMu%IYj+uUs_n{gcOt~%vV_G2oi`nK8h3yfJkz|zmTM9ldm88ZFs`AfKvQKe%J7AoVc%E=vjL;@`c7K81x}8uTsYJVuVl(2$Qv$WF*H4-=)Acbz(i5FcKOGc@G*C8vz{grb+4qAX&hD14RX|4JW`p?jT}7Zyq5F_VYC~>ISViN#8|u{fuq3HjL9pwmhVKD2 z3Rz)otuK=2==f?V?bY=B?RbqRh{R``S~LBQ@TYrRmd6P4)(P z)fA8~i}Y)Gfyz#AYka-+IVVd?gC=&4W2~TfnwYx2^vp`)rYC$XI=@Wz!_DULR~q8J z2e%qw22_t8UE9CWd@4VwV5ZnLtarL?(!(Lpr-MdQa7Ep+AoPUPi`17wUr-%Mb1coi z@;Lg7xl=^wN3j^*qD5EB5f%-7nnQbw(Jyg5WZs>8pyq&FBZNbj!pOs0OF*v|JA&E; zB7PRBT*lriIf}+pWP+S%B)YAV>eV9Zd}oW#YCCnhKIuZ2FTxA#rZRJHy0e)u!CcKQ z>bmU{bgKLhb?m1K!0%@>2?s~mN1Li!xoM&w`M!4m(B$BK{YH+JbZZfL z>_jgu+sMG^f9ZTSB6DH>F8bV{bvM())kN?EU2N_(7~%xawo_cDqag!veVBW+IGG#-f5!T8 zHktFZmTN?LJv3~D+^w`0uH@)B{iw?A?>zdF*vzH4!*5=irqlG^=d0hbYaTR zyn0_l&rmir$Rtr2kq1gmNKilD{MvQiF;D*abuPki#R4A9EE=mh%1p zdFpmxsBZZ1B5X=OdNn41&M9XOI#Zcj24nHonmJ7a+@Kld&Vy>S2k4U?fmdZfKHK0}k;U zVPJsqFY3^8=QO^!DAzh%YfXWQD?iDa#LiA-G3`!ft;kkNus*r-NorGAF!qUD5^wDV z5FngcX^f+KqH%4j9QwAB8xO#j>4B zz8d&J-sd{l9)uiOiIHEF=!xk=Mu97=%H28eSNX1@%JnRle^B!VqnaPR43?-k21kv{ z`la~9$Sb|9m>&Q)^O|7r*Nm^ieckw~-p2}3hnQ`kqB2%hP;Y|4X6~G`bEbyVk}i!E zR)G#o?I_A^0|b_xEk+v_0Mtg*b{8wYL@vP=`b;kO8p|v?az`fzkT}ix7Jonqw%|%Re z%p-GKa|~hUD`i_ou84PsSsZhH@h@4t*G**4OB#V3v}(sh#uKidt&Gj$$TAstqa3kvQuf zDb~t3wAc_Vc+WrQSz3v@Wi2(M>-FP6XdZ&>PP#V{l=-pPmE8Et9N!{?*95Feao8Tw z_?!JJA0nYIvFn4@w}dDSnxm~THoyW#GII)L*M`n2m-=R26$>s!)H#ob6(kT=esI5e zR^q>_bX{dEq1w$C;nU70(bf6QNz}?eeEAu`YjHpXa9H4^I(NIcl`1_vuyltASj}7tXYY+AP1b))yaC66)4JiK78+-8_Q=Qg zV1BR8O&wF7zgzZwqiUJ=TsNCK`9<6-Z}L0K7aD|9L?UFC1pQ6Bn?>B9 zunSybW{#x=zVwn|`9<;iuC6@b{V9q^^Iz22+~#*udy&^XpPM1gv36N>(Yio7ra}EI zTK%e>uyk@U8g2Iq9rB?2IXSt~amlYAXEjW(Tk5p5e><&DrhkPHCk;dlU3o4{o_*5t zq8%={$^7z+@N{Qn8@9Lv(X>A|6Z}y<9+voxck=cA(+5VfbT`;!OR5fLUp6*i9M=}* z2pa28LL3qb?@T3YuXwK3u8)6)(b$$IZVY^E;uZUHvTIIJiQd%OZ+)(0>Kx#o0EL%p zP>KxXY6JRcQv-7h9pxY8;LRcDSpIMwn=6=NCOwuQVivqUqqg2*H8;GuXIZ!KG553mn!cJfH-e|gN*%q(Hw}dykhqeCX2Hg% zPv?^N`g@sUV?vP$dNh*~}Jn z+p>MBuI+nOw(dN-7$ZAfQ$P)xmmRPB^Ye)(jrG(GZ@$+**OMljqEe38jf4JBAAr>N zuDi9S>WJE5|6v~HDkUET(|6{j^$pE zX_uv7qS!CbT&_4lCIw;$Y|#=QKk0I$!1)rjb$)jZO_0T1`Ivgas(#tvu~f~Y-VH=% zVrM$lnCv!8Im>odenDL7n)3(qwx(;qDgdB(*y3AfFsxP_~Ws7K7i>Zgst$#qs70SvG4n;MW=s?FnD z*C%)H)6wY@m)RgCRmek)mXH1D_q_VOe##W370X6&nMfCdVk&5&yQWBYKKoiaowyIB zQp^j{hr=JlonZQgXV}Y9{N%4qxg9wTI314`M;>L>;9LQww5*XJWCz&jzh#IahggMxeZL|a*P}_3MQet>zZxxjksv+1j0Yh z3i;N5*VV9lIL#wy2#m~>CevV%l@@rY$!f-tV)fRAzp0o#E*TCV*b z_rc!(1_i1+V!>-biMGqY9mdYyW5Dui@Ke>s=4W29EEHJ7y6gFXkGs&drtl$}fE3P_ zL?sLKhoHHn0GBmesH^8$8tc;Py}-*2JA^>ZPQTkO%~XG6CF-RB8}()7anIAeAvOjRJ(t)(;JW}uv+_P|VZF|@sV7L95vEhiO`t`PJl%7g|S8>022uMu69h>;x?|nO5o84L&Ce&km4B3ONKRi`HRC|3W1gQX~A0UbU zfLHfWc1HP8!BH{AyFd~Z-6TgLo7XDo3@_BVg5Q<&fkov%Z8my(+NDaB+ujP4b)z-j(#Y*r3NA*`_QXLw^#Ygv&=(ST! z6NrPR$GsV5?+5>h^>JgIp$ImY}T*M4h>l&2)I4agoJ7;p4$JvQ zd$XbMg$>DC3Jh@&gl7)VK@KuLA z`DeA5Tb^#T*Gq3gRbjuA7Jm zA-F;}XEkg(ZOJ(qONKIbbm<6F0r`)+K>A zFFna`D9a!x09w>stG{$Er#%^Y;)1#1gR}s;jW1E=&^8o&KYCH~< za0;G93IOKEYZN<}I%kSdia!Pk%}u+;ygM+#BJX0}q|qUAuhqY|U~co?G3tQrAyR@Y zwmIQ!IPyDNQ!j1kk=IMd!DX=;Yb z&M&_FGYJ~BUDyFXkHCS)6aIj{kfjA&%c4WvzjXy>CDYU-!!A zIJ&;~xU&}%lH%lhD^2w}`~7);*GqvIR?98zs*ph>;H);3??&d_xi3K4ug(2osPahV zkfa_q?I7Qg0T`>lNkgCL&V>S}`}2oZ_jh0`uq#0 z@HFL$cb{rkpO)NA>5&#`%YczxmLPZt=LvsnOC1w5{sWbowrv;}E0R0fwH)&Z9@uTp zosFQ|P(Oh1JKIQqYZLm+`*d3~>_d}j43hjL0Ps(stOBzaiT}zh<@r7DVJ1j>B-+X= z0i0C9fE|BD_Mgi-JmAO}=*BF}Ro@0|x<_yW_AQI4&IkK;n$Hwt8cyB;<^h07!C(`!X9j!Dam4;vS?TP_<0yFDHu(5NgRh3;CE{*oC8pR;FbIl`N=KreY0 zfV5$oaN+S@mfWuT z4fD&UMOkSo#tSHFU(b#>UH?_7^MOxlsd@$RgB$Rx73A4uURgFH@Ml`ADU9~=I+Grw z7Q3Qd;w%ZoV;wOKE|`ll64;peel^;r&Go6yK6$RQ!u=(hD8Sx#5Zu!`L#kUaYCkIF zrCU%+gWS(Q#xuTuewIZ#%V!XFIJ*Vh!n(hN-tk-$7%%BCd}cgVZp4`eW<}vcNtgp3 zv!6H4;)b!7(S&ylDaz}1(bORhFfHs=)jTECS3_!pcH&05>Z}(`OcwRZ^!5#|W^`fN5gls=p zJVpEkx^=F<^Cd;0Ht|O#(dP~4F@caZ`psQ7KN>teC+Vjz0MMN=U`?%rw)1R3>ugbRQH0xBog2pB;;S?#XhF4<-h|}~o z9q$im^YMd?QDme+l-274uHlF^KV$DAS5c{}PnFY_5t7Xq#YY;ye^8qU)ub&SN=6r+ zXAbf#JuNMN^h?rOW2ImzuEfx46WILrn@Z99X_1PH%Vq$shPx?gflupsl z9!+KmdP~mBHhFz{u4ybew0u8omgkw z6A}%9{MrUesB|nj*=r~1B$)t-Vc4dDA{pN;EfzDZFl@N5@&C&`r-fq zj@__mkX9NNNxW-0CN*Y(L)c0@o~}UVRVp`f#(0JlRqBMK$TG9$Y7b}2UCH3L2{ZcE zd6x;M=Xz8?;5aH%v9ci3DH)|{#3yx1BUv=mx7o{-BfO7F$rdsJi-Gu++@mhj1QT-I zOS>qEEUWl%MYH^c1dNyRI+V<3ar-t3XxWxRu?vd978i_AXy8A~vq8mCoOyKGV(}IA zAX9Pgq2WmW`nz_JFAMP!$HkP!#bnBciZ!>o$CLQSv6K=zjJ{}~jLLUc+bUTAoTukc zmhU~AhB(4wk~!+OxC)H(!Oim9MrKIY9v3m5UDqKr95DcW2`&m#r9vL%=NeZ+bAwD$Sz{kY?ivwz*5RofK*k}i z7^L`>Sy6jDqw(CdYvHTn2ptQ&ubxXA)^23>jFp#0@U6y>Nx@kss|q~L%BL_2qJpAA zy!G5;iHxENG7l{wTN<`g@{_}RalwL1L-$Q`3e{yub!~sw$^=8dj;tH)K;Lpl7=1wD zIyDdoqJ)@;O7sK$6EU=)xc^|LFVB0kHxb*EbFz@SbUnNpAJlmP4YfLKWK|8x%* z!f+@XLdp3!(ds40QHP82$LN183km@wQ# zV3_gHafgRd2Q+fzl*&2)6+F7!7(9wt?3E~#@=goP(P~xMMWN@)b&#}=XPkc&u<`P@ zD7_^8lI*CdE>i);jy1q?gQ7(xb-8%%lm1|PE)kp%DZdL`5;>Rx{!{$Wl=w%l!^5*u zQe0^XSg}nrLi`uMUfF;q~WP;3dOCnQJ7rH7oA%PCf7z z|5iZId*R}(x1mNJqeX$|0d`F*Ko|q??3V&eTxY=HA>e!@f5Y`2tT|~7mZLy}i?{U2 zo1?9iSg z$hOv@%;;)^w_%g#?EQ6EHzM&>=;G0N|yGcOa!D?}$C? zr>(`DwRU_@xqTjzg;G*fOS7btJmWF2ue!|tfgWU^r$7daOk@C`!_XZOt2Yj`r)Y4~TR8|~K>gsp^8l*Fmgk%$4^>JrI_Jvd$qp^$b?+-YLf&&~P zZQllWlE+_M+Z@K)zt`E*k%vZ?TH<#IO^m$OXv0Jub~0swS^wb0U%x_sVWUC{N!dcc*@$*`i0 zPN>``-+bV~57FLKRVe`)(2IGFF?dSN7nbFe>Vn^_Q>Fpx^^X@m&xKbMDj|c$!L{{Y zK73!Kj*UpLeH6wNXLKmlkJi1Et1$GqF?+JG+9!Pb18(<;!gx~j&WI#laV*gh`bYDD zS>T%mtnuf%_S4MTH9xL!?m#AHtc$8+@9rcn?hUT#T9+U-m^vv2<0mJg5P-*P=yRP3 zS}LS0xL1%V*;TMz*rn4yj=PfgQ$ok#u~IPNf>10G$X(3LIe(kN3KW^eJ90{GYApJ9 zq>Tbd-A{xfN1|jfh!13$55EKpQZp?o4dpLJs7C2Z((BtNg$*nRjK|P>DOANYbZ%_NYV%9L>yI6koL|+ynUr)LhYO>OKasZPg^N*d&Ky9(yLRfm|z%x6Basj z6d6lqr>3Sf8WdNWpJ=EU(-Bd53qHS+=7GT7qU`|}cL`=m8BG~VT;BsNqyg)+OxR>L zs9Q~)Om=@bSwgu~8=QZP<0=X$7N9-4L}=>iPXX*c;Q2ZCx-SbfyjPrNlXG&VjXEC=fcmlFY%99_<`+xAfc;VRjhv zOpZ7SK9Djbv8V=uhu-<9xIQ~Ah6R@9pWwLeE!dpLykV)?Z1$|W_Grg7Dmv+)6j!TA z7*8gCBOtZA4hKL2o(V05(SX)H33jxOm`q8CsqRCXlGT3tZC;!08)tR&Ua@i4ox3Tv zMVq-BUs5e^ITgU^cU&pTW0|JsjtQ8OIE#lg?+E=7d*o=9r!eCCc}Bl^w%q#3)U5W3 zb>D~k4e(>IL1NuI5hFE&6-h5Ph}G24pXHAqMRxwd2M-fw(_mJ1?0HC8Q{UqvsHF(( zpDlZJQ#a37GxGUG)20^UpY?ww?0>#7bmmn>=$jE=Z7A8T?QabqGT~!p30-dQY%yv9 z2^b06%8d*W54tP5=*5F7cFM)f!Jr&78OP&;H~I%no3jbIBB(Oh>6mQ5j>U$njAykK zRjre(v1l#bhC-5#qYY$+e-qv{_c>_~cV{8A)`?ly_oA`84=Ku@JNvJ0Dkh5j|HA2p zU764A92%4QnR%EY-(laeflIf=X)(sn%^Bm;Tj3@;#+g8Aq~5~vXppfOYFu{JL?4>* zbQU(lzELDGU??nOO8lm3$)epo=Q)^b`{gakX(MRNe+J`g;y}!S%|gF_Pqn|)KExLg z`?GV)ANpdBfZ|EVO`wG3X%_(AXeX_c%xUE}5JS!bo0t4&a4$EtAYZ-o*;Y85`aILT zCk1&7zE*cfeAu#DasPIVHMA{uJ7ExeEA-bM?0mv&TzJS?c)3>*H8jCpL*%7`QpZL6&^CXU9-s>Y=;WpN z7oaCUt|-qzj*Ir*S-;0-&jilW_bIw78Y{o5|BB-=4WpJZW3Q)3K{RU)hQjsbz;WlH zVDcYr%_reSN*a*SarfzsNEP!^J1(UI%7y8{Ag6j!zYG)jy^gj}wF&vl^+`zD$z!Hq z;$P2otBkUk;T3bfkq`7gL=0=Ld^7sFYtzwC{qpreY#-HLOFCm~iGlkTe>|JG4fXji zK{6G4$cgbmF@I&Wrps?v!KJBFAh#;jvdp}J`YcrU!hhsr#>1ePtjymG%oF|7g1{n6 zS+FwiNcSJ8%@y=JqXqYlHB9q+$FNRw+Nnzjd@}n$Y}Wp1|LAQ9uqYOtnKZwSO8MUY zd+{Jm;#8R>oBD~xj7M(0ZO?(}24bGHxrbGxf!|FAo*TcT;&*nd)N`i;>a3^t3EoC; zF0rd$$)5Mr?hcZ=%SN8ZDt&urM!IUsjFHJ)j536joZgeYJe7Ma`n&TRM-0Wfp}gNj3Jz=fUi-8pZW?}!KX6xNOO*o! zBdDYO8C$8=p@z_@?o|Tw<9BDi6J~c5xUswJlXtI6KhswA?Wx>vYpYy09p751wlK2H z_?()Y8T(zro>d4kOO~D6Hn#clRplZ^%cM_S4^3|340OP_If8Qron?mKPx!l56}<3# zfo*s!b7wau8xV&Gm8KSt?#bl*Y@eAlc2XZ;y{{x|Z~l8wTeCR+ckiqG#C^dr*J`+VOQ$@zc0 zp#6?xG6y+>p271f{RJkK@Z>40{a)TWl;ow|#bSR5K$oP~9pQ`gUz|5+8A0-<$BZk= z1Y5UK0ZwgTV{gUJ;mmtzDnCVbSyuS$M{g%r$LI8JEA6Fc97hS_4m~Rgq&;lsbFRt?{}19wR&``=;Yc!$Y=`X4Ih0W0 z2uCs_PPXhl<7AJ6L=+*(c940TRQBGZ>~+rj_v&+fuj}`Ba=EU<^SnkxW%cKoD3N*o#DkH!07^xb!m6x8vcW7ETC5wOCwy4SxlE4L(O(Ugk7aCru?hnIvDo> z6UrQmVH5qA%q4`x-v#F^ zfd3@*WLS%Y0O&MDlhBJYfzR{p#h!R8D(+695q{shOpr@_UY+~JO}IpzdYAyB*#A3I z8&XYuI%!@%=y=``oMx!mD$?tlwmxVPSb2*fe7}-?-bDfFoi>xj|Mr_Pi;ik~f*=jo zVq!;jFM_E`FwguP$sI!_#gM6@f@Zsj>)X|p%H&(R+6~K}PO6fuIXLgY`fH!XYRdbZ z5f+y*w#+t0Xwl5e54m1~t6nPJeJ6Vh`8BCdrz<2_%I3!9s(c1r)X%#|snYN&bM9=G zf>O?w(Mc!58`SYcnQi2FzoD_%ZMQLFNE5jtGL# z0>&sgSULs6MF;2QCB7W~bsH;sil3!ER>Tzsh0oB-I+V9ws5$QGtd@p8Uf9dE(Wid4vwE)L|fD?B@*D z!8<><6=;fj>1i9QE=rm_-riOVvk9(r(PfYSo+@5f;W@?0FsvUI&D-tp&&+Nr=Ih(-sR&(k-__4ysFc3}wgmlsq?Adz-0a0~FfWYeBRT2C5!P_w%ER2Cf>_J+(%w_I!GC zMdWek>3zi17VeEet$eHmK@Mp26!MH-B<*qmJ)O8+p88AiHuqwK{t6zJC@Hy# zgFm$Jy#&{#LZkW8;xE3&I;5zA`)4!m-c?F^GL*L`Nk!lJw*Zrn!a1~tVOrLVz4v0* z#6QPa&6hVpJWZZUH&{`(n* z^Bc#JtbNLMp9rnM;BthV_&hVx41CU>&So0V^)fJ|tWc(C12RJIr-XeN%oCf*cfUFHmm2hr zdB{Xf?3D_2S&T!IZ&FetShnH$GlrbUHn&2jR)xlEN@m`7lsb1?DP>-vlQ9yG-H?wM zWM4?m2dv}#m{C2fKFAj>qla}vhg<-}8-VoCE0HcQW$G2Ai7(YYAZH9Gk1liT*U0l7 zRqxC8J~PF;zhimGXyeY8GlyO1LYmo(s?gs?8%(DlP|>xU=1KP}R-X@tU@QV0c(lCl z`gVPKKAZPLCO^l*+3VwN%iz`%gsX{%Mh|*UP&ZESxwb9a8J$Z!AFgi%(P)X?_)#T+ zy~_)Q^B;02Xs_3N%&YuKQ>`8d$((iinowfVs|TL3D#9=Ez2KH#$!U72+1--W&6W5H zNp`n#IfPyOMLc8%;!t{WEYA>kZkuc)q=oIi{K921M7q*M|Dx<#AsUMJLys z*|_LHb6#k6T^cME#Y{3|J2?E_&XAYln4SwuG@i2LY0U7MW=QbA!5Qr_MNF$X*Zdbl zWBP`ooKhdXA*HwS3c;%EX(+CT)rJi&5pKYCZe6FhPbR9jtSOIrTBb8oUyAoBkFxUQ zA&zlJ(SQhVj&Rh2@aLDK<&L{KheX>Te~KYvl**~lw!2DW6BdQ%TjNn&X4!0`O zam}`u2m@5wK+uThYR-t1 z1sk*R=x~*iGiST!iMd8Ra!5}8NLH<@ zXSwU5mDg?stv1Y%(|b^{83M^2+CAr;4fTQ={7;$;b1%J472*ZRMk_ZX19}O$RpVFSGh#JS~S<(^KR?+VEMUD1`z;FthUy68Oi~zd^FF+0Fb0m}?Y# z)0zxCikrlb(E&Z*zj^c1bwh~ll_c$ePqD8GLH~&0`x9{HSgXCv4*y?|~6LDB$!J3spCLl*_y@W%U))1!L!c^>NIS-lD=O*>DjEXMc@k=*s%XJgbd4cr#@Me}Rg(aU?Ve zo^+cC4Y7e{JCx{NPw7{`=S^1UqJuRGZ=))QfsS+6kihamSC7OJz!P48`m`f@@z3`_ z>%;X5>22XIOZz^ZU3y>|^0KhDWbz~X`-BOH@M>Ckm0fbc*a2X?8-8c-qEx>KPnu~e zk+#3jW8+lj?$U20_rj-LzEWD;bE2}>(D4Ra|3&A1<%(H&R`JEV%eidY0j2A|@~u+S z6b<}eAN}p8p{n*=H)_t`8c*$~?XT7u|0pi2^;w-hTGRHAjy!JG<(B`Ac23#`%wd(n z8)#Sw@oW4^yK-Jx+F`|;lKdTF%reC>C;6<5N#vRb01oHn)u-xcJbiIq2VA;I5f$d@ zNnd9(=u-UKV&H#gT_~6RV){yx=Mr5k7m{-HTT=?>5uL{|rz5O_$@z5+=R{pR)g}VQ zo*VsQ!*5#eW-~LW{p_mlOHD)r07W;E&_lmsGp+rN2cYt%@}-#~R~Ny11+;NNbHS}7 z=-O-}JVCo(Qw%-<`@{5m5F};2lzh&#YSIv7y>3Q-YI1_yK6y|gnea)(?I8KClW{IO zC2%45H|%pKiQgIMtD2MnJmp;Bw*t{EPQbE;^v(umZdmu*;+S4A8`UY2M;p;-FVDUH zMw5gy#1OsGR#3l!#WZvq#N%t!G`!5y@-B!*B0E3DqS7W(=aQ3|bfXT-vuinm;6url zb#$bd#BNY84aHG;Xc8(Q3y`K+b70Q{qzaRn zaYXBAwaK{{+$zRe>05e~y|n}7GVN17E}|Caz!1f%GDqr2Qk~PN9!adxJqJ|*&!wt$ z95cc0ZMxC%DLAS`_%Kg)Qf?>8@|2Bd^4*YaGfS2UjrHBdY?K*k+00j344yLnOBj&Z z)x#3Ie1UfA3^~}10SxE-j53sRK^H+SAeFW|8-Qm0S!D9cE8_O zc@15Daf*|S%w-kptU|A($x0_l*P5oiPET2FT8wpa@2Qvl&RaXfYU7VsPG`h7zOU~1 z+9bm2_{zh@Y(;a;Hv=eee%;>J>Ah~T55$vkofB*72e00`%^3rn_bv60D@CE%NDixRpbjA#*??8>$(LF^mN*G4OMr*g{2;srvi&?sQy)$ z=m{NE$`t%x5^6^QW5!+X-qT|62(h(4Oa@y?-E&F4bdO}DfI(n=Dc%+3)}c!Ij!JO` z6vj9o*co$H`qtPh!V+eT0@}8Oyv)6>LGNh@cEXzNn(eUfYVTuhbulAiDm`yjhA|Si zm|!nd(9L@PzM)b`X;hWO-_V1SUrK2P^=dtr@hwWx_kMFjHLiVSJlK&s))GY}LZ>t& zmylt18I(l0O;&Xkh6!2WPL)A*?_!y(3`fdV*o)?rsqq^6bm7P7&}K8NL+TAaAl*i< zr3I)iy68y-T3FIjhF#pf2Zg;G)^#yhd!ga}ug4`KtGGjx6Bc^o`2!r){+`@pqSSc{ z1|gyUIS^{eU1>;-{7D+q?aGQ$8Kk8lx0EmT@3!Lvnt5k|9;A7UH|5iL!2PsbJG(cB zYN5W$m?3ge@9s&0QeOR$9waNwI>0MuHp1j$+bd=Ln4N)y)3pb^Uc&5K{s(IQ59B=F z8Ukua<;5zp8K$}_^5;QCfn48s7 z`qnth#%p(cD&MC29lg7SN+DV>w7xhiFIeK}9{ltUR(y@16g>v!#+VZNLiZb14KJPE z0@hO14UJkmwyd{8huq}49%UqI7=Ya(VBxVZSz-!$tO5I7Hv6VgNWdTy& zpxE>|v%4#zl2x+)=Cqxp1)dB}>(8ot!L#N{udNh0^N)ERFY_evsDGccc2K=0;~-~6(-}}yp>_q^`!i{0 zj(ycr{^FKdmZ(q;NLugxtrfWj{soPCZD|v$p<+T$-GdgdqJNFcR%O0jyK0}`xKF{3 z!;s2R-`&1?KIE2r!2j~pNa`)=0dFVC#i=39jx;apgAYyW0<}+^*#7cIU?cv2!cCC$UVn4rLDpt zCG5|Z!r?o@f1v8kUrdBdd*8$sz!a!IrYo4Vs=SiF(wdU0t~zJ&K;(NIY3yP{TV!hy zV&luZ(vaTuS~+RHOmnVhsff&F@d)2{)^JcEV9)2RKX2E!9Dujug{~1dJy~;m$ay~= z@m}FSc(RGGhVQbSL4h;LLU*7bN@3Us_g>%8M)zw&%UwAh+aekUPu}y6kec)8I2&D! zJK}zWI^xo-_K=iq13@a8SGD99znO-njt@&cE0dZLLh;^RE{d$bYk?6Go*s!mDn&t-%@4<&apE++7ccRjsp^7i6`2q=HH+hByl= z=1m2&BEh$k%3ztEf;P|79LL!%VHG2>xsHA`@v*k^YJF{ND{oW}XZ-C~-T>j1B>?^a zq&681vO_>k1^>V#C*arWOBitqEA33-4fIRb0VWOXJz(_dVL>+MqgX?NV~D~mq}N~) z=Qm+|EB|rP7dV8ii`gS!8V{aq@$NO=di5at$w~Z?$85Vsw+=A~w&x*Z#3n?4-|)wc z!sN71Y;D{6v;OZ`>=ROul$^;JY-X3PJWgQ=nIQGiWL~cYWU;NW2q_DJei$*O6os%H z2&a1#5Nc12_ykRLGz>Bi3WIjg#7J#MHo^{saU~b<{!(OfMkooqt#d2>eq6LjwQf8i zEziP^OwpI4(*6HQpk_R;5ySj)*MRViTy4vRjE=7GQfRqFq5|ytF2F6sszI8gsx)#q zY|fF5mVO>g5cgph$III$6M!V+^$fZ_W>@bMH@aO5B)PPjrZ1D2z6S#MLrLhMSYa85 znc+RxRfPhIymTCJc~L9BLaZbcoRm%ZmqsV6_}6vJ45>w8O+BD8-6C#vT}tJ!kUv4` z*_*oWWz4DY6@@0Sk(sd2+>R_uKa%qx-~H0P;owzufdi3EBN1%SXycyfL~#XdhjJCD zeHn($H!LqUct${?F~=qLdP`%C5ww#`>cdsHM0>v{bz+_8 zWCgE=8fwN?>@#%zU00uA4rp3!!WD9UD@y*1x^TX7?H0o#ZBe?Ct1B0Zn_9DKpQ%bo z&{slyFr#=33DJaWpqGjH$@oBXHa zdCp}Duln?3i}4Qm~~;g^xE~O6lZ!zWIx;=iLu(Kc}5K zqXvFj;JtE|>NTOA&Cq`u7_-k4)pBpk8lH6=Xn1A0*k-8+^{k8EHM&fSOk7ZKqIe6FgT6^cr`%KreT}B&UxiJ zy=N+1ajmNQ#>({5$BQXz&)%j7ZNTxT<1^W;Y4-Vdw`b*6AAl<|9Gcu7|4S8#AIFPs z5mvIXh2<{1PCPc2()ky@X}((8jK;l2#(!w6ohQZds{jW3hMDaM*HKz_-`?PQs*xD| z9hX(F=B7!u@=Ae#3tZ0XF~JK%ykz@gS0A{1folm97ZKAi$D2id@zaSh%a>Pl*NpcI z`U%NCxDje2Zv0X4Af;82!(X{XX&7nh6mDc6Q2q@U7X@`6Oyf#9rE|}jvHp{*^Cvdk zbJ)twBzfvT5Hq>XM#12g#DnxCK#;4r6Fhx~4s+e&N3_{Nq0P$U{1+oPgmvP>&))}f zr2A_>J$<6U-TffZB>fMx|FqEz2(P}vWbwLb8NaLqA zpPw8OES9+-@+yW6$_M0O8^#Nv!e|1a4A-Wmu7D0=f~zzK_e8kg8ML1-KiTOCKVYE` zrvRS=#m2h1Sy$Lvrjz!{8<_6Ew~@F7!mn3SBo{$)RS+&&$TB|ZqhX*f%foM*92tH! z?*8Dta!x?*2FW5QPCkt2e(x2cy}agPGyXWz6Bpi?pY?a$>S6VXQn$=t1*cviAU%u! zk$gu(XI>9$I3o2M$crUhS9`AnL$ZfKQ6t`lPL8yra}|Pc{RbSHO+~}-!p|GiYbJLH%;!hIQ4p=xC8T_xm zflaD3>SSJKbZ;i4cz!h{L0NY>-ZYMPMU_F;z`O~t{PeK`l?tgB;@H+jx?Qzo1x=def<(#4}*>RBQ*`E67f{5OBqXrkvmU{B<|mUJ{I zx2|^^?8VPMESw_WhqJxsmw-B%KNMqoxR2-psK z_oo7l@S7i=nFh_3YPpi8m@to`oWzU&;`pyCMU{dA5)R8GMmkqS)}U%8Ikx#dSS2svz+uHaUJ&8A z$^I_A5zebP3P6Nn#?nk=6NmaGDePrG`J6n!9sW4TL1F@{|JALuKzB%sB`Awl``K=#rLq=vX! z;3{0*P(p|KpES`ojS7psb8Dr|doK?c)+-YodR7bT_L7&+c3wx^+gzy@R39#t?{E9V z9NeZwd#A!C@Nbe8R?A)CPs!dZg#Vt~`L8p2^N;;x6a!GM5$d95pPVNc+>c9T*L#u- z^2jbO@}^ zhtdA@%Ea@|TEHh0&r`QH<(3DH3u}aB4Or)z?S*%xNmr;xdI;zAl)VVRfotq--YL+iQ zoDC0{^ElO0YP1B^g>`3N0%R%q6+6%fJHZ_|kOZ2kvC?|pQ!JhHqRc}#PyNPxx?A{3 zMOh!bZT9$wj!g3ZremI+AdJ%LdN2Rph^yOwpzhuKw|!{m66{4MwS!z&DrE8{RCAg3 z%fDaO+OF|}-jYEW*-~ZA-&F6hT$Huh_<3nbluAX)LSZka?R@bR`O>#r?k-)q!iXZSQQWL&u`jdKD%=+JCj|UbuL__BhUeFHD`-ad_5R7A z9K3jC!9P!t*G!T<)!z4AG#abE+)%8dPw`JW?^#X^vWgn$d*TaWhhr{+uNL?^RB<_Q z8BBg5)ak7-&EA>jvOO~wRPD;#aTK^kB-t5R z&pUF(r2}(8mq<|RQN{&66$STogyzZTbfRG*KPdb-$!y!iR4eVgo@&HJegeo&NgeGu zWh%OE`r)kX0(x{Iv`Plz+5m;DruN@0roA$&x#@1eV2e`De+oMnCsoU=r=20VLvjfu z>$8!e^C7nQe5+XaVO-iw#$|LmriQnQ^~#OvskjPr6ljs{sN5m=EvM-p#aM&vD~|>O zZGev;QRj3r@c@8U6AEpqz0Yg>J*49b(!B(L_-9u89Fzngd!yAMOw$7D$?}ulGx2dxkBW!9# zWc`w9On6qB*U{A8VV}NEM-1{Nn5UW6$0v``CpPUTmF*k;M(o0HTOscw8!M4-Q zfz0e}@d>2PqPf3xU^f1-IzZ#%#z^k(^IM zl7F7uC`sLrdn0YPY777JmCkFU;d5^-{!V`j1$#Lves`ERSK2}83$PKw8k$C(w^1KH z=ej*lRWsjtl0}t+JTCguCCMlaI$#-GpGdBa^y^O@@X9(ouCxl+g{+M&mo?c-Pp5l# z`}BN4zm#{1ME4!Y$s7QA18yezw@Q||PtAbN7yyk0Ndz)@b4)J|`i{_$h)!(WmyfH? zn=|U_{olex=NMP(y*MXyoZKEJ>Qx(>Z>3-T9bWc9NpOfsosg6NvXo!&wu$N8#AmM$ z*v8wt#XR%01evnD4cJaG2*!}kWm)kn@z|Izw&s7C-eA>7Ub@(m=1ou`=t?4?G494Q zt}%aU58jaJ_VS%=EMfDzJ)=K(qFAV+S2PzGeDtL3L=Y1oXQE- zydi*AKNy6yy;3+RrPtjwp9rQDJ3pe5`QqOFu0-Sd4OArOI2$)^uaanzizkVdq)M z6-YRhP{6C}Q@XlYlG8huygu-q(@p##aR0o<^z^+yT}Z32-_En55#Wq*O05jDS!F4` z?TC6bky4emYmo2a7*y9(-8saKH6)>%N(cG4fy~9;l51VnQDWNarGxf1dY&aVZ%pzC z_dKFbj0{V^S9nCJ<{A;6f$x8r_N%yVThLiUw&4G%j{Ho?7GG_h)KmMbxqk?ssUVx6 zA5$qAvj=*QmcNxgnPqM}YV2llWV zMBRs9mxjwrpHC*iG*j6juTj0*h&pL^_vFLfZi>?WRRv|@7=1q)2kz@LJG4XU-FTvE z&j=27v475@zmL>a)oqqg+KdPFZV{2N|0To&gqW*4BJlcFmTscqaoC{R1ie}F`kHdC_!hE`nF*W!UwOa-tl zOw&gU!`_`XJ_cJ^ZZDg9#VZ`(-YHH|nkT*@fb9g*j&q>|z5P%#O-6EhwTvX&jwsu) z-BCFCP|=q&QjBV_{oi@*z0Xw2SF>(%i@a9xR6bTxTC8q%6EI-E(;KE$sj%_oBFHC5 z4$ih1tjPVQkQZw3wBU}`J>4d`=-A&DJXRN58$+2K! z6-i9f^`UN{C7rshMI2KCFcuYmFzXL|$Px6=Rx%gs{O*0ga`O}D4VWNvhNUR1?U?ML z<->5?p7VTpRjkdO9iAXd`<+)y_ICb7Abw3cm=8@~J&*Mj;;|l^c`G6@Yn377wYksb zG@f}EEvzN4l*OoaSi%v5@dW&z>4fcTz@Z&-m*{m)R^c!^Zvf^+j31lX5D*`Ii9Zj$tmp0 zZEapfWSOr;ajDFjL> z;_2Kds8SWm7CzlhX_$fQdwEdvgVSPD9sm=TO(+aw9_@EVfX@hyAk%H>?t#~JbJx=9 z1t_~M)WxSkyJ}~QmL=I8+9eJ3FKRk!t%XGB-!&@i+7O0iOG>)BZMd#(Zd?Ck&3CMO z$Q|ShqULF=9=H{6{&s4ytD>)4Ag|byUXt^bZMf&@(b3WSh^3s-zMC;id(MVGZ|djl zHT^K=N~u{;8VintEC8j_sE3(QAiuwl3z37kGgFvAVW&Tsv8j)a0z>NAb|S+(jV6?W z6^;E?BB`ncRRc^t^y=`U}rM{z5pjWV9F4LT?;g{oY}@xMAKjM+9C zgaS>wXM{APEvVi?)|Hf4nQl2{hqDn&6r@W@1cFqbBjjN1Av}yKQ15Pm_?%b1rL?;1 zr(>YU)_+RLbP&79hiJ9O{=#w5E`Qq2$4-_I0mVgR$NaR$MNl9#q^%?oLbebdpYaEA zBncgg?3XRMfhV#BsM&zHWqzz59lME0QmIZ};QHi=#;zLd4(Lx@eh~Wnt@A3^(L$jk z{~**Jb;j}Xy5>vx-#=5p*M(Gf9^wYPp{jMF{WW-(r`GC^nw}Wau{6435b{dM^?Qsa zjWE0&S87a>=OeebOux4T;wu>9Ym~XLOHW9qN3uVE_pSWySpKL_pL74<_P~(qgSPh% zr?(AK)(v}sO?9KTLkZ@9^gbvBe65hhiFW|O>ErtH^I*2EOP{UcT;MYq#J8kg$*zqd zJVT;~nD9bcQ>o~;rzj|mFPD#1aOQI2)mAagCu)elOPko2A_&XT|3e9MJCwb+$oH_RLE9%=@LbsvAs%YUPa<)S zoLBR|VCt!BbF}j_UDzJQ*pd56#PO=>Hus6O^a(4BkU$6``$>Tpxc1%1^;M{9Q5d7A z@qE9&kW!>gULbl;I)*cEc7rL7(3;p%I;Zv{|9PBcd&bst6Ie@3)5wmfvI0&R<2|j zmo_z4I6QG3*lKx6DgS{eA!~*1DwiGR4yFx_Dw%T#-i?7S?tH7e_)~&E*kb_rl38== zk>Be3`J_cd!PrmY>=~{8yvUjCr7-w-!Nq@|ju0b;bnbru!8>Ko`z5bgd0QTb*B;>5 z9*|$%S#rKK%E^>^rx2)&wa5(h)j4098|mgXuUz`}5x1Me&F7 z0*UC~K(I#>pi#8C-|&Waqwmc0uimO|z~^&({cW9s@#Jlo(#4vj>RibSe%gs(F&*A- zW@`X1zyQvcSN6qyN)nS$!lHY|1_l45Fafb>j9rsG&}RJa;q%T@B%?o04p5)Hg!jiq zq}b7ILqa3_RP)D+pL|hG?}j&}lfau=9o^AyuXG|xs)giH@jT=okMA_=#=q1Jgb*4n zKS8PoywuM^)sxvnM59tBD% zB~;UaUZ7O@__9^oz;49_7V!ez;=~JciMA;~wRB9cJb@Mv)q=Q@eJ70W5aW$Y~y~Kmf}?k4`Pzm zjjmSXI}<&L_9YF`?`*g#2K?AmOAy@se;Wo=BJ><5Kk)NzQyE(RHh5|>4Lg?=Sl1&n z51t{|2IotME6tJ#DB_qP?^omrp-s-FN5v9B`KpM4n1^S9WQltlrSCL)Z>*#wKE8$t%kCBp6fZ zj=s6nY;FghK}|H=^!ZqK3gHf?YubEd>4G`eb4_&BJXlKHDz5C~Qo6xcgqZvlI%t}? zV4YhfvvX@KHdY5+BCYUUst@+(>wOk6g}(YvauKp@CCAKvE|)w`PdLU9;Ic4fE>V+G7CK5f&SfF!Y!j0&p5wpG#$Bw+)pta7CIkkd(@G9wb9$S4K`gI zD151b@moL(8FjI7RfMhkc01*Y$v-Jp=n8J}CJ+M*6iE{p@I@mmpN4?eN~1OO0vur^ z(Tz|Vqi8Bdt5EBMxE7N4v;ce_6H6CL9BW^|qJM!z4@y-#LI=TwtOy8#$?EcPw-g-% zbPh>Hp>7uo@)$zvl^^F3O8`B;&!yEC88jdA=&$h{X9#83DHk1OtRKMMhSYLl2-`wF zWlVOlPadN~LgiNvOF^#?jCKFKui7$GW05MLvoVTxNI_aRg}ao#Z+wb@lLN%pDZ9FUN=C?F_XZ(0A)1{0>Sj z?2GSz;lKqmzTWix;$3PXV*s@qmOpjrh>jA4VZ4NIqN9BNj$)pSB0{7 zFt(glzctjjkx!SFQ@xW{|6S^)%>xrB4_$+o2^oZ&!VLvK@0O|FRK2&O{;!`9K$v`T z1V5SA8;e_MiE}F;${?HTOAVj*1s-)tPUq_nHUAK7`n*@HO`SB@T=V{&kYfj_*N@aXu2=QSFpKVAe0?=vx$LL z*(#c5=f&hdxJEAX^6TH-XPnB^HBSB3w$G3(Jvt#tMaNNJ?h0j<}RVePECcgSmFp8 zC!t9BB-()1d2XwUx)0cl=_76L3m~E!)%RHHT9878mvZ{4sSlZ>WNWoaRz!GOVaK`A zGN<>~2KeFU|`f-_jJIP0yHm8}~+g19cA0jSp|! ze7njOOiMN&R+>mPbo&RE8}Zr4h3RIOo}v~35@S|A*cbcjH}84b>6m<}hu(E|^=K}j zCEh&G;{Z0KobkUMoZqNuE>(Cx>Wv8Zc-r6-3{YF7cW7nkZ9MN_EW``Mhhv3o=n^mh zv~M#AV+56Y{=OmTBQ3IcQBl6xP$dmNto+CBCj`wEE!3j?7QvNtPb5#1_Vd5KB2p=h zk>+)o03!nun5voC9XYzQxeB;o`H*SQ=E1vvk56-ONyF*3R%d!0p$3^+My7;*5Dus@ zWBN{-#k?Qf%d6AHzX$}r_q_e6L;HZQ*9CivWD5 zTh@|o>0d>pi|Q?Zkh0U7w^@nXr)%omCMGTcm!2z+a>cXPY=DPZ{HNUIf^vMp zbz)uDn(VJQB`!py$?TQ;AC$0)6%H(tHUd_q^E*moQc9mpQ|w$WN!J{^t3j0ym{}uH z=i|KUh(~vY)YpolVmJ_*#k(&dn^_NWO1knOp8{G3S6AMx*i6UnuT&~ABo~Fkw3oEM z+P1fio2WH!C8oq`unk6!%?g*^j-&n$|y?UfZ7{7DkV~B~?VN!Osq=m1s*MyqFp`k=8Q23USvzOKZE7yHD31 zvxqaqJRdb8sx9C?&46-WhZ92cMVBS}A(J45g^xwWf-ng!NUyv?=kNy7wr-xa{(Y zIs5!O%h6VbDf{-Pef-+AyO!R4E7MAO>I&de1<(XEiaM$O8KM%amyIkbn0%y7z2U!t z?UZM)7zs%4V_oI>5mVEx(N`Gt-6TE$mqIoLxA1Yq%DtjX&QHf`DhQ3>mjSrO!PZMP zqZnoDD4-W9umx}V4>bNxYU^6q(iXSpcmsm`tNipR-m?)U@I`Xub?(ZM7MWERT zR;e`v-!|U1Dbrw^_B6rqSVJyWLO71tNkgg| zMuiO`phKqi_5Hc%OzXDjoHbt=!2v^I+0jC%RI^$cDxQE?709B#glixI^ z$(~7<daoF0_0%uA=WxgZwDx-nu1iz4w@TZteSo4ueq6t|~A4<-#zIC~Dl zmH*C!#~)k_N*Gg+&1sEF@*>~38`f|kxSY}ql0j!bXc*VTeEYLt+c0hRYYh^#qZVRTe7AJY@M zn%9%Q*w1SP2~)ceWqf_fk$=lsegDpQ4i(!kY87WXb#^g0huw%#Qv$vb7n+zM!Me&B zvsi-zwIt_P;8UW89Hyf2Bh{>`I6MP8>0e8!q43^Ggk$x>O;Su?QYrAws}@m%|& zM|Qh+(B_{qN#+qg-?Kr9p*cqC6W7v0&C@;Q?mYo{ywcki7Zx_}*&yyouz*$5Q)QfJ5a0s&@=(QfukiTByqV{L&{_`+f?E|Lw9J-dh-cmGZ6h4&{feF#dw7wlIz7ylpv zg)gPrxO+7QsEN=m6GDIy+6vsdWzryBX};B;u&!f1UO(^uUC~IR$s57rQfIdTGIYMRvd{Dyg-KFp!$p4*FFWo(DRWqVvi0iv)7i4ClIHli~%KE?n?dgx8 z5afi(G{1E1=E%scg12^v`hyVH&mXx3bFs%|k~A&&xUzX$y?!m&+~=dBd@1k*p;I$WNg&R7hYK|_J4&HK)@u$cySEL`MEWQptUki>9 z*U!V)%Mg7qA68Tqv6j>1Q69bX&KA}y(t#DJ0j2Oig6if|@E7piVvD%DCL$lI_?>!} z$S(jD*T+lyoX7h9hp-M-vcJe8HqySsiCrboMcNv00RV%qnV%ECGgh!|Bu`!f5;WC? zUnZJNbCcf5e2EK-@r>OznJ!!$n@I-ledS`_KOEJ|pYcfm1!3iA{Q;iK%7|D&+LO1L z23`e|Jv0%GIIzizDxn{gMWL1P(64pL~T^3Ge6q zlb|`%c6>wOzmpa>jjpg>?7O$W1FgE|Hde4_)6xz-X+U zdY9bVfsW&!P$-&rw7lBAA~LX;H;2>&90btKX><(#K5Bg&o9Z*?Q-XKY9|@DZ`J{`3 zgMMg9ktfjQZd!;Gk?@8mAm=5_nIrMp%Uhu}0HYoul)2|0_gaKb@v81lGsbl2QfFT0 zDS|=M*@4cRGsuD~)>kW82i(wNOt52QBfo$VnC>tJ?N(7W3)sDe>&GWeQ6w$E`>SE^ zO;^!?hPf`h-=-%@=%_$K`>W20xr<5iYF<%Q(5{md1>W98rRG#83RJU;Rrdt6zc3

?x2yZwAe!R<=S);YVht|RbTH-M5o(E)d-2vMJQIw@h0u5 ziHpXFPm`*1L9HC`AF<~jQ}}z8>Fl|NRGUhuh%25u#LY;Wd2&5V(_jb5*>~C_a3b_q zK*?!Uc%mork#67JAE=JdGmCqZIMr>$G}p9V_$-93qmRFr+8m(UQv>rX8lS>9_CqiZ zKhW04QIoOQ?OK65$0)NiMB|oJ3Z2M+4zhPp1;|NPkI}dzF_^QcLVa(GW^}C{wtC~} zJGmWof>qPB3%*6+J?w_=f1i16iP=hviwx_~?!IvG(*MBvJ8C53vgImgQiT&>saTL2lh>7D&%5^Jk%s)r=xy1@PLBM3GnH-P79xfd|Ts6<4O9D{JVGy%f} z1*mGtr?}^&wf5au?oSG5qwF-Mf&03bMI3D?%rg5xe7JD%!U5oXK<+Y#d?js zlqqk$glqi#YUSSp1_H%w%*C0M5w=mq3B|BP^#HRFxR~8}*Es?uq`pUxC%+J#028oF zOH3|obj4w4$Bd-}i`se`2t_ROMFEG7V4~<66^a{;j~@w7tdnn(7365~D+OaU*RjZ- ze+p>A_pckXL4I{ZsbI0p`#0s0tf|Ime{gN72hDOwF(}sX0?#)>dss9l$e2UeKP)(e z6eTmD@cO20987llG_MeBp8(7&SM`+abJbqw|Mhh4@l5ys{~yDgB1}1-FAT}qWj;XREcXknqhxp>R?>EO*p}h%+wc|%X$W{)E4y@4? zaFNweq8or*VyF;iARw|cP#lG;%kA+xAN^35&a4Xqu#W98!hD?>fZLkRkyQsRNL|rK zIZKY}^2co-H6+%OV>p4h2$}GAIrFf(W^mn-6GW^ZwEezaaUJ=^SqC~{g8d%!ZK_by zhe&Z%yleu^;*kb=cEO0xMFPaGibm7Bd=e07Lp}=JwBcCLLa6>h^?y1?Uv~mEd>G+K znVU$C7A~ov(pXj}d4fE;C7^v~IA0F^lq1``V!E{51m=`l44^d`8~5_{rT^+RN|MSJ z2PdO_58u&mvWq03Cq%bK@*r-<8VbyV2GH?hg`1PNW>hWL(}C%^zT~FXn}%&c*FK*m zr^VsaOdem0l%^}m7&l+{bX0k{T%+=U&h^{FR`$vNWM=N|%(alO=krzvOIKx+5mLNd z;&6q1@tL0!UoL<3agIJSsnwTu=D^Mp)dhKEe9`fG&GZUp4rZ>Q`kC}XY5TqSs=YlT zK5{C%>h03gv!l{JfuyOTr3g!bkDbs3`u}+Dx8VKDukhI8Eg2CC{D%)9Bj3pKBVDYL z<5T&@mU&{ooRys%1UZ1=W%c6h<-0RKVsS2}FSliI#3P0-Y6Z!+FgfHMa4)S{Er$Ys zlV!37f@b&13=cdS&{_HlTed|rrd!G4UJ6|V^t+mTSJ|g2jTdF4$mso?eX5qhn-2>d z7)RyJg`e`nRJ9dD%^i>9Nu+`88y1sH+PP?vlwPe+(51Gf5eZF)|H!B_n9$=9SCbD! zH&j;oGOCU}v3WvnpWR5sftC@#W zn6CN{bV1F9zTaS^jd*MFyV*je2W3_yBlI{Sh-Y}QSPURKNL2&_3+S*c&u5b9YZ=3F z>Qw28M#?mGWg$U$r{Q%kpnxF!R);n@n0-0?iEy|jKKu(u6kc{Anh37lG6D;|RU>!q ze)tchZ{;Xilo+k1+(y;b>4m8s+{gyTmVXUeT&j~)nv2^vNJl+C2oh-8>DF}kb%kA3 zGU1qgL%yVLNX73WEB-fDunC|ilMO^$S&Dg27ZN6qtf$C61@ge>C-6t*KRLR=7CCB2 zcV}-%aklUXF48_ zGccug#T92GQP=)leA~bCm&nr(V_)Xtr*CIQvL8>s?%x@rZwoKmubi!s;-M-P_*c9N z{ns>p+6Vy@=|M)hUs^#vTz)LqwDnds@|Ch{wAhQ|-r17s7b!HggEBl5~$KTi>w{6x8~ z2RA74GIbZ?rd<~~@j6LS|A7d=aA5v5(eadDm?(7f;XV}`C^S>!6_Z=;tyW)S z^S{6E1WC*->hCv*agJFNY5atjB1vMHV$LDN?DZ)DL9T~Q7(0CNsZecOv!z+;IPl0Q zRmykS!=g6%g;fno<;f>gsr)%@&lE~rRrmc71OQX6>`XTO&IPsi$$}6SP%9Ns_fh*n64(FHnOj z^1}UKjGnK&=0RsSkl#&zHO#pSGAHxnr&~ouImUuMnd6mUb`G4qrN`Xr0ktCJh=x5X zmzr9mIuFHz_~N0yll3jissgsiuFYT(2J!OY4xhnfVW$mJnsxcZk#L#;nE0YAoHojx z4y*Z9t0`>WaBkOmM5K$#qg;R#zV3tJ0fi&oh%1F49yry?pEQ*%<6pkFsS`f|c)z+p zgIkU*#2(^&Fb{{prs9kQb0uvn?PzU&4F;CU9VW;Y(?8Lt(!gev=~!j5T8`a+Er(FQgKIl_Zy`UhGNOT+CQ_Zz}xhirP)H6$?F)ALT|zMWhN%3&!@88#q(_8KJg7SW!;of3;5@- z;RT=l#XAp`ml?QevbE^h4ul3``GJ=0S>3R|i3z%B`KXQ5ii77)XuwP=de*$(O!Fj? z3rMg@N7~+gan!JByK+Kb4(;IcL8@Oh!b2XLRWt#)KA2Llb)h>|j`$gieVrwfH^r)|+V1dy3Eu6BfhfYG37Tlc3}w@-v%VsGGG*Z8J}OB8O_Wa5>s z3#vmQosAB?%-r?kKTy$FM0*&0-Q|pYVe0*m_OH){Z0zZI9eooek2URq9&Vh$xDz^e z&CPCf-Bqq|8PST^N^;OXq3E=O%NFjT6rg+~Jom*#4qyDr-J~6bBw%8@(7f?%r zY+N$f7N^ViwzPzv)vY>;sy{$eXsc8ng3?lrhL2Ol7JuR(>v$>YGf$ByLO1Lh95Dx| zv?hJpq?6k_YRSmO#|C)+&|(}=Q+B2i5m=V1W_Fp}|Bmr`JQ{PPhN9;(8Nhq^W}=Ut z1D!bbsj8i-G2jD?O4116(U|V5Nyp*3*a$otmb3~`I6DjZnJ1m*txg0nPC;L z5YdNwpJCyDBzW>wy-ukB64@o5j2?I_G3|Gh(ZD{3K4ba_*rs1S#&hV&v;1S(h;`>x zbNqN=nTZDgR+K9&_l{X({m#1R8)Z3uU+st|Ti%P(S0;ZPcwvvWQ*gKi%+YhVfyH$) z;`M)^2(ram!%Cy5$;9v`mo6MNKfxA%sNqG_g3#g%k+WT58_w(Txqn}XlVJoy2{HpqKWOIMT8`@DSo;-ubJk|i?Crr{ z=E3*aO=I!E)>(P**2ES&FOnTo&s1BMtjsh%vv2U^)L;3QEj7wRyVN;5&g#N1HY%yH zUGc)pz!<)+^iJ67Zmq!^H~kmPXg4>9M7RA~R7`f#bKqjjwVk${@Qr@kp0nzlkM+>j z&V?j-ubh&*OGnPCr?g_jk1H}104Zv$^01EzHXqo=1S-u(Zn)i-LoGd$0%K5LNH;!9 zsQi{;D9U1-hwVU72MsA4K?$R}{=Oo;q(RvrxytJfw8ph&=#7K+!ngI5vRF?-oKVq8 z^$WXlrnhVJydCuqk7o`aqSxI9fPk70hJN$7kNVnQQqA!y8Im8B%7vR1=d{@Wn~7y> zO^e@i5{i3?zl{1@+gM~$V)e(v?MDzm03?`iHgxXnK?y*dic~#pLqDomwGZ6AYK54E z?5tD^ceo~8Hh7{t7O5z=Z@5(SDvXxXDihD)YL}@klJvSO@x`~4j<49StE>soX0*@3 z62twzsrx|oIfb?GtmKYhUPwc~W6Xzt!`G8hqDnWN)aQw&S;hVq=QU_y`tKWU6j@EV z_~LKUlL@B?O@A}eKq=oaFKx)VSSP;`!s9si=MS2w3UYdpsJNmXt3*Sc>z7628BSP! zUSB%CsOuz%clBM-fEDjdVzYsrh?r}kB1HBu5|jK=*agOM(o77~$1}a<>YsXq_lMsD z7>e0D-y zL=SMtxws2^*(?)b-VeGk^g%Ufx^Q0MTeav3OxqwQ$&{=O9=TmxQlbU(&M9QbIxDCs zXQgspt?eD+XUI-L;b7>%VV8TV+#Cb9MRxL|Y&+wol^)EJ z(c|`nHpy?+QS?TL1Wh4Cq9#lRZjdvTcSrc@7%6iBw?p+yp1q@UZi+{ex%AD!#STia z%sYqK{BEnhq?!fNj{KR)hZq0^;?3ul&X~1g55{+EADVzw_-#&v6jHO23Ux=sT+Vxk zLEa^M->YAc3bR#icAO=j1JIAgBTEG?7bMml64p-)!y=sqx&AxwbJTJt;YcC8R(V34c$D|;o~`#`L7*ER}nHnmjY zAjI*Fg+19mNLy`&-yDScK7Y?yBJd(Va;hv%*0X|I10Pgb&2n0z0&T8O3m@aAYQf65 zYxQhFq-?9f^g#~Dac4Oq(s?*t;p{4kLqXo!T3ce8WBH>1(PYDI&}B!s5kaWPQO=Vi zNZ4YD1Ec{JwRaSbYo?ZF6AMgHtL-so9Wi;urFN$-PV=t%^wGwAv}`);Fq7}4*)}n@ zR#iLVvB{C9i_)4eDT@`)`9tr2W{_^d;nz{(TBkYT@65j^-cI>wQPc=if388gAvOH5 z(1>>&U-QuR3U`>qcM}DBHxS7<|~YgYM#|773jW^!ajp8l&_tzpY`E5PqfL_E3V z_~5`G<9{dXS89Flhc@ciu2xBv76{s3lLR;Xq)K{okW2q%gIVtW=OtFG67OM;XxcOL z9d1ayw!^ouWmkaX;c(Gun^S#1l-=%d>5ld_n}y@g>}Fjf58YRC0A&&zi(Xa@JGZY? zbt@NPF!tFJ!*lmMZ%(e-BP=AmQ9|MkKroAYdPre|3OGW+)-liO_l4rF$ z!+~t(thW;x{`6ME_LCz=C^0GX;qwug%;4t-BFuhOmsnZn(*mYqc?%H=R~ye6naUrm z!Pz1gcqQtr?>rO!nbc^S0W%@R&zV^C-2J5F9a7YRWiYtF{U?{=afh{l71eqjYeY>kYWL9Lp?q_QOJf!$7R2pkAZCN1W*h_tZ)O}cNo zE8=a-GO{Qw0PcdG-#@6`G}*!!V0;m`K1WZLEd%>zvyVGee3$3lCFZ{Qx-o#P8>8R~ z{QQizK7J|~Nn)*hE|R+Qv@G{N<4??zUCHN91~n44dW{F;p}x)o=TdBDG==nxi&vw! zg}>RAuwV4D8(P`AM>#S90B4~bcl}Qc0_R0K9`KVrDqw?;);Ix8n0n#zueEfNKg&*B zE=&a&0Q{ahI}i2N%6w5l#_RJ2dB*3 zO2@Z^A}1Pczkg)7y)H{%Kgbchg0F-t1w5AY5+xdlHo;3Duo$_A`d3 zqQa=+<_Q{-a9+fRN1}rs5)lX~yP_73JX;7C7&(pm3l2;SHT1%z5>*>rJOutVMAV#L zRH_H6432E&B*a~HNWNP!mwW4x=s<@9=-2P8G-~J>t0J>IJg z1$5>Vtf(!k<2u1~%BKH8Z`{V!_l8o(binE?aO#Hi!JCinP}}Rt8?IIKR*_bpgy465 zcb{Blmu?&l))yXc9Rzb{-cWXn7UMbbVpU>qrAnlwgpX^Nl0}|u(rh`v0a??$VG-~y z13^#s<~O*v{i1F0_br~_FJnd{+O8A$R@dD)1(?)t3@Pic21YExK0aX@9QMb#!(Z*v zIu=P0agNe+xva4KO3IR9yW%A5?S5Zv6+GdNYFvF1p%>{G);IRKNO4~zR{?l9pTprB zt%L$V#J$6GR@YCezyC=n80*lFll?7(*M0)|f^muC2i<+PA%Aum^ORG6JY-))QXxUZ zK4Ykx#%1F&RtoTlm(e{{14hYMli9j;6tCW`@_5EtShYowkS%0{zak0oNsht%0(;!6N&_$VD@d%?s-s_3 zc-hHpyU2jlCEg!)dfBW6%k0&ior9(eCSskha0?~6At9k&NH_)SPMPRis!{l2quP}u zSJ)3Ka6m(|;58?+?^fOJ#kqp!j`JV3h4UrX(VE_{-;r!5Mn z=+ReR2=(>1ua^~yjT(_-@Ic_}*$t;pkv3{^oIR@+FA9IuP47~ln6lmb6d+SMulJ7{ ze#x>b8web9^w=GpxG7?g89$dg2qVQoGmotW_bV<;LBQ>bagPWK3Bkfw@d5S*KqBP= zTnEy~-L~Kg4XlALV8v5e&uu3eEB8M)!kH6_y5kO5LNI(YIA*Z~l2}-0(F&a-W07eK z(JOam)?n4munm_lzR_aD7@9$NZYA{?R>^O|Sx5}#PzfJ5Z$Pc*L*A7Lbb)6k&}Ntu zz?@{=Av){=vKC~lw;+@;RYX@P=FASWHdlsr!Bvy_jc$ZA{&qcNUvvi(YYD4>ee65z ziKBvA0U2}!Wm?hlj`Z@z6#-nXgAL@Cxg|6;@!MK3VL1_?IYULqrSj3<7+an%n6n}> zKb1;!vTrYa%KK;Y-#xthkS_sk-f-wb7eubMQJsoEMSOpxuMNF{i6l>@-BO+K2vU=d zzo>dLNknZ1;6RYfCYmrpt`T#tP2aWUfyKYME@4vZV<3b z>x*T@6#_aR$8F)(xo21;XzqjWVn{Rtzq&$PgIMeG+SU$a7t9tiA?6}u`_NBTd zXZ1HR7ZGU=O)bUx$tiP(u3TCgHuM5OC|x~r@fubmd%Dn8`P#@!>2h5wF@NW&@{EHs z`_RSI+~WCM2035ni?ou;`W%*LPqWiKW zW3OMQBSlaTS43wdyQFJ{j?`(y$xJ(T=^wU)KEhU(M(cRG%GMPWAn~dU*=tw3o&QjL z1y@rhgDobOHXjOCWqF3E>Jhw`Ajxz**zE#zFYDq#UBAe#`|$(9IOZ)!vGv;-wgE{r z(3`Sr(;w*9m2;o%+1I&c$Vbv(eiX86zc64rRVP|!-VbbdC*f)blfuB%e80hLyd;T6 zY|nqx`6(oRI!**w@BX`Umi)Q1;2&S7T@S>!WrRaIU% z?g{L4&dc{Z>)BN70~E6acl43`W>!eBH`L8%M6QqJ8HniLvMZBd{|7qWcdclXp8zJk zE_>c4Zn!a5LVEbF{36w*^K-%O!_`9cLCK^|Z_z2ICEw$v<0JoL^<6u_q;^-_6DYoN zn@L5IRbPhh@z~7#2huA?F576k{{+f%7rqJcD(N6&zY17Y<3#fQ11UvqRCsaP5l^yD zT*#fj|AQSxJ*qAMP)Tg>c*>WI;rJ|@Orvc@`3v>YA}ca`UhbqjL;w&u#AQ7?NQ#rA zPnF4>NJ+OI$DveiYyml0MC%rkBa#tz$MW2R4DeJn(HP^XDO_LoxT0en_%0fr0cJY@ z8d`gB{P&)`170)$w}~GtDJ=|ve1$c&2AG^jq;W(@3XfIYiHwM4Ym^on6-A`V5ObXQ zq#aNJ<7y;Sw4}+1P&^j!)cu`XW3Q!Hk$HN16rixS&ViJpabzS}Amz^MpY=>!o;eiz z#Cl5-J3UpZc)TsK2Tjj>BG0Kyd<)G6S+YkhmOH}CxvgO=!k!y)>I~{oA(e+NSwCy5 z-ZuMTAL<>ZB$w$r7=u0tZc_2O(dnP7q4UOtqu&anFUO%d9!|cLc{v_nz4!xa_W+jI zwn2#sdfBi4&QsHxZ+r5`afE?yB7N|~Pqx^p+%`rAhWe{r${s;*=wJiK<{ zP_P7kLP64^r*daTk#3?av63e``=B)a&liXe zt$3Ir|3XJ%Ev-etMnAA>u?kE0?0|H&Nv(h2xM)u-#{t-^iCrw!pK+CqCw?fiR{482*$| z@K+_uh)Zb(l;qQ8xZOKTp@V+XbW6q;@s{0&q7hy3?in&u zoJ#gM;!2I69X>P6GcoFD*QTdOm%9l)tJ_^~cXqtdOf1VBaMT+IW`R|1iJ0S&3a&;+#MVWZ zfmve8F<>SV(2bmQNNyuYX+eidTCTvMI8!JEd*TX^RsM=xFFz&kd|s|y7Y(bYDnffV zLYHpG->l}B9FSlJP7$Qaz(SYWe)Cg!SODd5#|99Hv)s>4xOeKCjG;7-VRI5Gw=7~o zKOu3FNZDR<~xQT1VXcR_#aJ9@fK zlA`|@>VV(KeRJaPqrecBnC}X;ix3H_w4#ihhHJ#1w$;fLEK;mC<5%PT)H!eUpDV$c zz>z7^P$cnCMlLn7-!Qf8uAYW48d$-a@-^EB;tD2`a&&N#pir`nTrW9KqUWsE9BEoy zOfP*=3qZC+V)*=b1}v_Y{jzK3*UwV}mh%^An(nMs3K5sBkZ0th~ShmsBQuF5LB{ z)pXU^djMIleF9wUJED6O>?f~$jA)dWO`Zi#g9<3-1k3wcJej-Z?p+CkwYb)OAZh`m zFj&1`CGJdL#dWi#d=q%reGsoLzT%NtiQgj(Ez~I}#N^8#v8p9yn!Ao1$G_Q#;kwyx z46BMFE&oh+>9lW?9)JAVPdxbPRX{c>6cf94`{jTgysr4_V!8Dml%c~K>3bY4M01tO zWDb=h$cpDNp8(BIY;jH^rbHHo>KxFUNK2x>Zy8nZx ze21hgtYOhPS6h||K|b2EL^jJS(N|vjn~Wo0^fbvYC3VAg&^kqg2$S!y^u^mrkMRav zr7CyRvFsOnYaNVf3FWjBp!C766<^gMY!OWl-EHmTUnNFyIz8Ry{QPyrOekeGuZI`- z6A?@enB+mi%3*b9v%&MFNB{Sli65Q+mTms#4^C+*(m8r)6v&E2L`B!${tvW~7{y)c zTPclY-Y3Khdxhrf9smr}4jWs?MMV2SLc+SSeR(5ml6t8?!oyF{ky7!6rmMcCwpb(? z%Sqog-i|(~5k(0L_S{P=SrYy3_BxlcZ*9LUG$q_8Wv%tfeKW*!iUsg7fyi>I-A^;UDZ5K`&8DLvYjr=UUfH_#%R^~nsI{P-IgY~6;lh!_mw!P% zfwN-rl5TdMGZ1(t%4;9NyKw7(cC}R_)RdPQDxutNhT@epS!$(5YX%+zRI`A)>}7PJ z5}G9Z#i2gUZYa01sym_;@fx>Qd-q?lEo`j)eFS{ra8d>w0C0uQ8vi;pDS+;Ik(Z>w5-cRzN1EFhb3;P8n~?9$ksew4PaYU!gmHt$;AtPrq}jz5v7J=!bP^G zuH9nH#ypedicT}XN|o!&5VaO@m9BgLyGi$Z%QtvIg2r2V>z=VPVKkeZsyKUVf%&t6 z#=5>F@zuT_#j@2io#+;|D}0$(@vaiWR5{k@o_m=UmmkmI%Ax#&{g~w>qQ%8K|4@7l z-R#73W(+>wXx-EUWauzThJ3zwGR`k&HefY5RBqKGU&e#{}0{?mv{gG literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/Contents.json new file mode 100644 index 0000000..3c47198 --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/615377296_o.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "615377296_o.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Assets.xcassets/Contents.json b/UNIT2PracticeProject/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index 2345470..905458e 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + + @@ -16,13 +17,14 @@ + - + @@ -47,16 +49,20 @@ + + + + @@ -82,6 +90,7 @@ + @@ -95,6 +104,7 @@ + @@ -110,7 +120,7 @@ - + @@ -119,6 +129,7 @@ + @@ -127,7 +138,9 @@ + + @@ -142,7 +155,7 @@ - + @@ -161,11 +174,13 @@ + + @@ -239,6 +258,7 @@ + @@ -254,7 +274,27 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -263,11 +303,14 @@ + + + @@ -288,6 +331,7 @@ + @@ -357,7 +407,194 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -368,6 +605,7 @@ + @@ -376,7 +614,7 @@ - + @@ -387,6 +625,7 @@ + @@ -395,7 +634,10 @@ - + + + + diff --git a/UNIT2PracticeProject/CollectionViewCell.h b/UNIT2PracticeProject/CollectionViewCell.h new file mode 100644 index 0000000..a6ceed5 --- /dev/null +++ b/UNIT2PracticeProject/CollectionViewCell.h @@ -0,0 +1,17 @@ +// +// CollectionViewCell.h +// finalMeetUp +// +// Created by Christian Maldonado on 10/18/15. +// Copyright © 2015 Christian Maldonado. All rights reserved. +// + +#import + +@interface CollectionViewCell : UICollectionViewCell +@property (weak, nonatomic) IBOutlet UILabel *nameLabel; +@property (weak, nonatomic) IBOutlet UILabel *sortNameLabel; +@property (weak, nonatomic) IBOutlet UILabel *idLabel; +@property (weak, nonatomic) IBOutlet UILabel *shortNameLabel; + +@end diff --git a/UNIT2PracticeProject/CollectionViewCell.m b/UNIT2PracticeProject/CollectionViewCell.m new file mode 100644 index 0000000..7cca328 --- /dev/null +++ b/UNIT2PracticeProject/CollectionViewCell.m @@ -0,0 +1,13 @@ +// +// CollectionViewCell.m +// finalMeetUp +// +// Created by Christian Maldonado on 10/18/15. +// Copyright © 2015 Christian Maldonado. All rights reserved. +// + +#import "CollectionViewCell.h" + +@implementation CollectionViewCell + +@end diff --git a/UNIT2PracticeProject/DetailMeetUpViewController.h b/UNIT2PracticeProject/DetailMeetUpViewController.h new file mode 100644 index 0000000..856a7b4 --- /dev/null +++ b/UNIT2PracticeProject/DetailMeetUpViewController.h @@ -0,0 +1,16 @@ +// +// DetailMeetUpViewController.h +// UNIT2PracticeProject +// +// Created by Christian Maldonado on 10/19/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import +#import "ObjectsInMeetUp.h" + +@interface DetailMeetUpViewController : UIViewController + +@property(nonatomic)ObjectsInMeetUp *meetUpData2; + +@end diff --git a/UNIT2PracticeProject/DetailMeetUpViewController.m b/UNIT2PracticeProject/DetailMeetUpViewController.m new file mode 100644 index 0000000..275cf0f --- /dev/null +++ b/UNIT2PracticeProject/DetailMeetUpViewController.m @@ -0,0 +1,38 @@ +// +// DetailMeetUpViewController.m +// UNIT2PracticeProject +// +// Created by Christian Maldonado on 10/19/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "DetailMeetUpViewController.h" +#import "MeetUpCVC.h" +#import "ObjectsInMeetUp.h" + +@interface DetailMeetUpViewController () + +@property (weak, nonatomic) IBOutlet UILabel *descLabel; +@property (weak, nonatomic) IBOutlet UIScrollView *scroller; + +@end + +@implementation DetailMeetUpViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + + self.descLabel.text = [NSString stringWithFormat:@"%@",self.meetUpData2.desc]; + + [self.scroller setScrollEnabled:YES]; + [self.scroller setContentSize:CGSizeMake(600, 1000)]; + +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + + +@end diff --git a/UNIT2PracticeProject/MeetUpCVC.h b/UNIT2PracticeProject/MeetUpCVC.h new file mode 100644 index 0000000..03f583c --- /dev/null +++ b/UNIT2PracticeProject/MeetUpCVC.h @@ -0,0 +1,16 @@ +// +// MeetUpCVC.h +// finalMeetUp +// +// Created by Christian Maldonado on 10/18/15. +// Copyright © 2015 Christian Maldonado. All rights reserved. +// + +#import +#import + +@interface MeetUpCVC : UICollectionViewController + + + +@end diff --git a/UNIT2PracticeProject/MeetUpCVC.m b/UNIT2PracticeProject/MeetUpCVC.m new file mode 100644 index 0000000..0067a70 --- /dev/null +++ b/UNIT2PracticeProject/MeetUpCVC.m @@ -0,0 +1,175 @@ +// +// MeetUpCVC.m +// finalMeetUp +// +// Created by Christian Maldonado on 10/18/15. +// Copyright © 2015 Christian Maldonado. All rights reserved. +// + +#import +#import "MeetUpCVC.h" +#import "ObjectsInMeetUp.h" +#import "CollectionViewCell.h" +#import "DetailMeetUpViewController.h" + +@interface MeetUpCVC () + +@property(nonatomic) NSMutableArray *meetUpData; +@property (weak, nonatomic) IBOutlet UITextField *textFieldSearch; + +@end + +@implementation MeetUpCVC + +static NSString * const reuseIdentifier = @"Cell"; + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.meetUpData = [[NSMutableArray alloc]init]; + + self.textFieldSearch.delegate = self; + + //[self apiRequestForSearchTerm]; + + // Register cell classes + [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; + + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +#pragma mark - Navigation + +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + if ([segue.identifier isEqualToString:@"meetUpSegue"]) { + NSIndexPath *indexPath = [[self.collectionView indexPathsForSelectedItems]firstObject]; + + DetailMeetUpViewController *vc = segue.destinationViewController; + vc.meetUpData2 = self.meetUpData[indexPath.row]; + } + + +} + + +-(NSString *) stripHtml:(NSString*) str { + NSRange r; + while ((r = [str rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound) + str = [str stringByReplacingCharactersInRange:r withString:@""]; + return str; +} + +-(void)apiRequestForSearchTerm:(NSString*)searchTerm { + + + + NSString *encodingString = [searchTerm stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; + + NSString *urlstring = [NSString stringWithFormat:@"https://api.meetup.com/2/concierge?key=246e57e1d7676522d3d116b106145d&sign=true&photo-host=public&country=%@&city=%@&state=%@",encodingString,encodingString,encodingString]; + +AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]init]; + +[manager GET:urlstring + parameters:nil + success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { + + NSLog(@"%@",responseObject); + + NSArray *results = responseObject[@"results"]; + NSString *name = [[results objectAtIndex:1] objectForKey:@"name"]; + + NSLog(@"%@",name); + + for (NSDictionary *info in results) { + ObjectsInMeetUp *meetUpObject = [[ObjectsInMeetUp alloc]init]; + + NSString *name = [NSString stringWithFormat:@"%@",[info objectForKey:@"name"]]; + meetUpObject.name = name; + + NSString *description = [NSString stringWithFormat:@"%@",[info objectForKey:@"description"]]; + meetUpObject.desc = [self stripHtml: description]; + + NSString *fee = [NSString stringWithFormat:@"$%@",[[info objectForKey:@"fee"] objectForKey:@"amount"]]; + meetUpObject.fee = fee; + + NSInteger cost = [[info objectForKey:@"fee"] objectForKey:@"amount"]; + + if (cost == 0 ) { + meetUpObject.fee = @"free"; + + }else + meetUpObject.fee = [NSString stringWithFormat:@"$%@",cost]; + + + + NSString *yes_rsvp_count = [NSString stringWithFormat:@"%@ attending!",[info objectForKey:@"yes_rsvp_count"]]; + meetUpObject.yes_rsvp_count = yes_rsvp_count; + + //NSString *shortame = [NSString stringWithFormat:@"%@",[info objectForKey:@"shortname"]]; + //meetUpObject.shortname = shortame; + NSString *tapMe = [NSString stringWithFormat:@"Tap here for more info"]; + + + [self.meetUpData addObject:meetUpObject]; + [self.collectionView reloadData]; + } + + + } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { + + }]; + + [self.collectionView reloadData]; + +} + + + +#pragma mark + +- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { + + return 1; +} + + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.meetUpData.count; +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"meetUpCell" forIndexPath:indexPath]; + + ObjectsInMeetUp *secondMeetUpObject = self.meetUpData[indexPath.row]; + cell.nameLabel.text = secondMeetUpObject.name; + cell.sortNameLabel.text = secondMeetUpObject.fee; + cell.idLabel.text = secondMeetUpObject.yes_rsvp_count; + cell.shortNameLabel.text = secondMeetUpObject.shortname; + + [cell.layer setCornerRadius:25.0f]; + [cell.layer setBorderWidth:5.0f]; + [cell.layer setBorderColor:[UIColor whiteColor].CGColor]; + + return cell; +} + +#pragma mark - text field delegate + +-(BOOL)textFieldShouldReturn:(UITextField *)textField{ + + [self.view endEditing:YES]; + + [self apiRequestForSearchTerm:textField.text]; + [self.collectionView reloadData]; + + return YES; +} + + +@end diff --git a/UNIT2PracticeProject/ObjectsInMeetUp.h b/UNIT2PracticeProject/ObjectsInMeetUp.h new file mode 100644 index 0000000..3c6f8b7 --- /dev/null +++ b/UNIT2PracticeProject/ObjectsInMeetUp.h @@ -0,0 +1,19 @@ +// +// ObjectsInMeetUp.h +// finalMeetUp +// +// Created by Christian Maldonado on 10/18/15. +// Copyright © 2015 Christian Maldonado. All rights reserved. +// + +#import + +@interface ObjectsInMeetUp : NSObject + +@property(nonatomic)NSString *name; +@property(nonatomic)NSString *desc; +@property(nonatomic)NSString *yes_rsvp_count; +@property(nonatomic)NSString *shortname; +@property(nonatomic)NSString *fee; + +@end diff --git a/UNIT2PracticeProject/ObjectsInMeetUp.m b/UNIT2PracticeProject/ObjectsInMeetUp.m new file mode 100644 index 0000000..a37a625 --- /dev/null +++ b/UNIT2PracticeProject/ObjectsInMeetUp.m @@ -0,0 +1,13 @@ +// +// ObjectsInMeetUp.m +// finalMeetUp +// +// Created by Christian Maldonado on 10/18/15. +// Copyright © 2015 Christian Maldonado. All rights reserved. +// + +#import "ObjectsInMeetUp.h" + +@implementation ObjectsInMeetUp + +@end From 3f38794991aec2510591c057ae59ceac9aeda57a Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Mon, 19 Oct 2015 23:02:49 -0400 Subject: [PATCH 05/23] fixed camera bug --- .DS_Store | Bin 6148 -> 6148 bytes NewJournalEntryViewController.m | 14 ++++++++++++++ .../Base.lproj/LaunchScreen.storyboard | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.DS_Store b/.DS_Store index 83f152c862375565cb146634651c2bd55d8bc6ba..4acb484f9209e936e2e104f17fef02ec213ba29f 100644 GIT binary patch delta 83 zcmZoMXffCj#llp0VsZ?N50h`@0b_0jta839Nif87qOz02ar2 f3?MPL$yRJ!FpkUQ9yUJ4hK+?ejGNgx{_+C=g>V|A diff --git a/NewJournalEntryViewController.m b/NewJournalEntryViewController.m index 4884705..11bdff9 100644 --- a/NewJournalEntryViewController.m +++ b/NewJournalEntryViewController.m @@ -31,6 +31,18 @@ - (void)didReceiveMemoryWarning { - (IBAction)takeAphotoButtonTapped:(id)sender { + if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { + + UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" + message:@"Device has no camera" + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles: nil]; + + [myAlertView show]; + + } else { + UIImagePickerController* picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; @@ -38,6 +50,8 @@ - (IBAction)takeAphotoButtonTapped:(id)sender { [self presentViewController: picker animated:YES completion: NULL]; + } + } diff --git a/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard b/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard index 5a9c4a6..900bc17 100644 --- a/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard +++ b/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard @@ -1,5 +1,5 @@ - + From 8c50c9ac3f3732103c2afa9a88ac9d6fa3de24c5 Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Tue, 20 Oct 2015 00:31:09 -0400 Subject: [PATCH 06/23] mapkit up and working --- .DS_Store | Bin 6148 -> 6148 bytes MapKitViewController.h | 14 ++ MapKitViewController.m | 144 ++++++++++++++++++ .../project.pbxproj | 30 ++++ .../AppIcon.appiconset/Contents.json | 36 +++-- .../Base.lproj/LaunchScreen.storyboard | 50 +++++- .../Base.lproj/Main.storyboard | 51 +++++-- UNIT2PracticeProject/Info.plist | 48 +++++- 8 files changed, 349 insertions(+), 24 deletions(-) create mode 100644 MapKitViewController.h create mode 100644 MapKitViewController.m diff --git a/.DS_Store b/.DS_Store index 4acb484f9209e936e2e104f17fef02ec213ba29f..931de3737c1486f0b5db0ad4789d2b5290b9844d 100644 GIT binary patch delta 46 zcmZoMXffCj#llpzb8-xe4^vkC delta 46 zcmZoMXffCj#llp0VsZ?N50h`@ +#import + +@interface MapKitViewController : UIViewController + +@end diff --git a/MapKitViewController.m b/MapKitViewController.m new file mode 100644 index 0000000..bf36a1d --- /dev/null +++ b/MapKitViewController.m @@ -0,0 +1,144 @@ +// +// MapKitViewController.m +// UNIT2PracticeProject +// +// Created by Felicia Weathers on 10/19/15. +// Copyright © 2015 Bereket . All rights reserved. +// + +#import "MapKitViewController.h" +#import +#import +#import +#import + + +@interface MapKitViewController () + +@property (weak, nonatomic) IBOutlet MKMapView *mapView; + +@property (nonatomic) CLLocationManager *locationManager; +@property (nonatomic) NSMutableArray *placesVisited; +@property (weak, nonatomic) IBOutlet UIButton *pinLocationButton; + + +@end + +@implementation MapKitViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + // border radius +// [self.mapView.layer setCornerRadius:30.0f]; + [self.pinLocationButton.layer setCornerRadius:30.0f]; + + + + // border + [self.mapView.layer setBorderColor:[UIColor lightGrayColor].CGColor]; + [self.mapView.layer setBorderWidth:1.5f]; + + [self.pinLocationButton.layer setBorderColor:[UIColor lightGrayColor].CGColor]; + [self.pinLocationButton.layer setBorderWidth:1.5f]; + + // drop shadow + [self.mapView.layer setShadowColor:[UIColor blackColor].CGColor]; + [self.mapView.layer setShadowOpacity:0.8]; + [self.mapView.layer setShadowRadius:3.0]; + [self.mapView.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; + + [self.pinLocationButton.layer setShadowColor:[UIColor blackColor].CGColor]; + [self.pinLocationButton.layer setShadowOpacity:0.8]; + [self.pinLocationButton.layer setShadowRadius:3.0]; + [self.pinLocationButton.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; + + + + // self.placesVisited = [[NSMutableArray alloc]init]; + + self.placesVisited = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"destinations"]]; + + +// CLLocationCoordinate2D center = CLLocationCoordinate2DMake(40.7, -74); +// MKCoordinateSpan span = MKCoordinateSpanMake(0.8, 0.8); +// [self.mapView setRegion:MKCoordinateRegionMake(center, span)]; + + //create location manager + self.locationManager = [[CLLocationManager alloc]init]; + self.locationManager.delegate = self; + + if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) + { + [self.locationManager requestWhenInUseAuthorization]; + } + [self.locationManager startUpdatingLocation]; + + [self reloadPins]; + +} + +- (void)reloadPins +{ + //reload pins + + if (self.placesVisited.count != 0) + { + + for (int i = 0; i < self.placesVisited.count; i ++) + { + NSLog(@"%lu", self.placesVisited.count); + MKPointAnnotation *mapPin = [[MKPointAnnotation alloc]init]; +// mapPin.title = @"The Location"; + + NSDictionary *coordinates = [self.placesVisited objectAtIndex:i]; + mapPin.coordinate = CLLocationCoordinate2DMake([[coordinates objectForKey:@"lat"] doubleValue],[[coordinates objectForKey:@"lng"] doubleValue]); + [self.mapView addAnnotation:mapPin]; + + NSLog(@"reprint pins"); + + } + } +} + +- (IBAction)pinLocationButtonTapped:(id)sender +{ + MKPointAnnotation *mapPin = [[MKPointAnnotation alloc]init]; + // mapPin.title = @"The Location"; + mapPin.coordinate = CLLocationCoordinate2DMake(self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude); + + [self.mapView addAnnotation:mapPin]; + + [self.placesVisited addObject:@{@"lat":[NSNumber numberWithDouble:mapPin.coordinate.latitude], @"lng":[NSNumber numberWithDouble:mapPin.coordinate.longitude ]}]; + + NSLog(@"Pin Location"); + + [[NSUserDefaults standardUserDefaults] setObject:self.placesVisited forKey:@"destinations"]; + NSLog(@"Data Saved"); + + + //facebook share button + FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init]; + content.contentURL = [NSURL + URLWithString:@"https://www.facebook.com/FacebookDevelopers"]; + FBSDKShareButton *shareButton = [[FBSDKShareButton alloc] init]; + shareButton.shareContent = content; + shareButton.center = self.view.center; + [self.view addSubview:shareButton]; + +} + +- (void)locationManager:(CLLocationManager * _Nonnull)manager + didUpdateLocations:(NSArray * _Nonnull)locations +{ + + CLLocationCoordinate2D center = CLLocationCoordinate2DMake(self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude); + MKCoordinateSpan span = MKCoordinateSpanMake(0.8, 0.8); + [self.mapView setRegion:MKCoordinateRegionMake(center, span)]; + self.mapView.zoomEnabled = true; + self.mapView.scrollEnabled = true; + +} + +@end diff --git a/UNIT2PracticeProject.xcodeproj/project.pbxproj b/UNIT2PracticeProject.xcodeproj/project.pbxproj index 1285f2d..18efd89 100644 --- a/UNIT2PracticeProject.xcodeproj/project.pbxproj +++ b/UNIT2PracticeProject.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 0021CAC71BD5E777002EED7B /* MapKitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0021CAC61BD5E777002EED7B /* MapKitViewController.m */; settings = {ASSET_TAGS = (); }; }; + 0021CAC91BD5F157002EED7B /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0021CAC81BD5F157002EED7B /* MapKit.framework */; }; + 0021CACB1BD5F17F002EED7B /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0021CACA1BD5F17F002EED7B /* CoreLocation.framework */; }; 78882C0759DAABCCBBF267D6 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 196536DFD13DA4A9B2F67F70 /* libPods.a */; }; AB0F265E1BCC5387006685AB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F265D1BCC5387006685AB /* main.m */; }; AB0F26611BCC5387006685AB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0F26601BCC5387006685AB /* AppDelegate.m */; }; @@ -29,6 +32,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 0021CAC51BD5E777002EED7B /* MapKitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapKitViewController.h; sourceTree = ""; }; + 0021CAC61BD5E777002EED7B /* MapKitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MapKitViewController.m; sourceTree = ""; }; + 0021CAC81BD5F157002EED7B /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + 0021CACA1BD5F17F002EED7B /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; 0F0A099F832F2DA3DDCF3FCC /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 196536DFD13DA4A9B2F67F70 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2DE94031048D68D9CB939801 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; @@ -73,6 +80,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 0021CACB1BD5F17F002EED7B /* CoreLocation.framework in Frameworks */, + 0021CAC91BD5F157002EED7B /* MapKit.framework in Frameworks */, 78882C0759DAABCCBBF267D6 /* libPods.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -80,9 +89,21 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0021CAC41BD5E6E4002EED7B /* MapKit */ = { + isa = PBXGroup; + children = ( + 0021CAC51BD5E777002EED7B /* MapKitViewController.h */, + 0021CAC61BD5E777002EED7B /* MapKitViewController.m */, + ); + name = MapKit; + path = ..; + sourceTree = ""; + }; 2A249663F855D47B8CC825A3 /* Frameworks */ = { isa = PBXGroup; children = ( + 0021CACA1BD5F17F002EED7B /* CoreLocation.framework */, + 0021CAC81BD5F157002EED7B /* MapKit.framework */, 196536DFD13DA4A9B2F67F70 /* libPods.a */, ); name = Frameworks; @@ -131,6 +152,7 @@ ABF8076D1BD4444E00853411 /* Singletons */, AB626ED31BD01B26005BC70B /* Journal Entry Creation */, AB626ED21BD01B10005BC70B /* Entry List TableView */, + 0021CAC41BD5E6E4002EED7B /* MapKit */, AB0F266E1BCC5387006685AB /* Assets.xcassets */, AB0F26701BCC5387006685AB /* LaunchScreen.storyboard */, AB0F26731BCC5387006685AB /* Info.plist */, @@ -229,6 +251,7 @@ TargetAttributes = { AB0F26581BCC5387006685AB = { CreatedOnToolsVersion = 7.0.1; + DevelopmentTeam = 9V5VY2T8PQ; }; }; }; @@ -322,6 +345,7 @@ AB0F26671BCC5387006685AB /* DataViewController.m in Sources */, AB0F26611BCC5387006685AB /* AppDelegate.m in Sources */, AB0F266A1BCC5387006685AB /* ModelController.m in Sources */, + 0021CAC71BD5E777002EED7B /* MapKitViewController.m in Sources */, EBB12DD71BD5C945001027B8 /* CollectionViewCell.m in Sources */, EBB12DDD1BD5C9F2001027B8 /* ObjectsInMeetUp.m in Sources */, AB0F265E1BCC5387006685AB /* main.m in Sources */, @@ -443,10 +467,13 @@ baseConfigurationReference = 0F0A099F832F2DA3DDCF3FCC /* Pods.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = UNIT2PracticeProject/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = bereketsHW.UNIT2PracticeProject; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; }; name = Debug; }; @@ -455,10 +482,13 @@ baseConfigurationReference = 2DE94031048D68D9CB939801 /* Pods.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = UNIT2PracticeProject/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = bereketsHW.UNIT2PracticeProject; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; }; name = Release; }; diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..72875c4 100644 --- a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,63 +1,75 @@ { "images" : [ { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", "scale" : "3x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", "scale" : "2x" } ], diff --git a/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard b/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard index 900bc17..00850ae 100644 --- a/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard +++ b/UNIT2PracticeProject/Base.lproj/LaunchScreen.storyboard @@ -15,13 +15,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index 905458e..7d7d65c 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -24,7 +24,7 @@ - + @@ -155,7 +155,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -287,14 +287,44 @@ + + + + + + + + + + + + + + + + + + + - + @@ -315,7 +345,7 @@ - + @@ -407,7 +437,7 @@ - + @@ -425,7 +455,7 @@ - + @@ -531,7 +561,7 @@ - + @@ -594,7 +624,7 @@ - + @@ -614,7 +644,7 @@ - + @@ -639,5 +669,6 @@ + diff --git a/UNIT2PracticeProject/Info.plist b/UNIT2PracticeProject/Info.plist index 40c6215..2489a64 100644 --- a/UNIT2PracticeProject/Info.plist +++ b/UNIT2PracticeProject/Info.plist @@ -2,6 +2,50 @@ + LSApplicationQueriesSchemes + + fbauth2 + + CFBundleURLTypes + + + CFBundleURLSchemes + + fb1691928267704538 + + + + FacebookAppID + 1691928267704538 + FacebookDisplayName + garrulous-sniffle + NSAppTransportSecurity + + NSExceptionDomains + + facebook.com + + NSIncludesSubdomains + + NSExceptionRequiresForwardSecrecy + + + fbcdn.net + + NSIncludesSubdomains + + NSExceptionRequiresForwardSecrecy + + + akamaihd.net + + NSIncludesSubdomains + + NSExceptionRequiresForwardSecrecy + + + + CFBundleDevelopmentRegion en CFBundleExecutable @@ -11,7 +55,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - $(PRODUCT_NAME) + Nomad CFBundlePackageType APPL CFBundleShortVersionString @@ -24,6 +68,8 @@ UILaunchStoryboardName LaunchScreen + NSLocationWhenInUseUsageDescription + Location UIMainStoryboardFile Main UIRequiredDeviceCapabilities From 68098f5a1fae1bbff05abd5067797ba7246c77fe Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Tue, 20 Oct 2015 02:24:16 -0400 Subject: [PATCH 07/23] changed backgrounds and font. fixed some other Ui to be consistent --- .DS_Store | Bin 6148 -> 6148 bytes NewJournalEntryViewController.m | 2 +- .../project.pbxproj | 2 +- .../AppIcon.appiconset/Icon-40.png | Bin 0 -> 199 bytes .../AppIcon.appiconset/Icon-40@2x.png | Bin 0 -> 383 bytes .../AppIcon.appiconset/Icon-40@3x.png | Bin 0 -> 604 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 604 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 994 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 379 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 786 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 162 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 294 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 0 -> 424 bytes .../cover2.imageset/Contents.json | 21 ++ .../cover2.imageset/cover2.jpg | Bin 0 -> 237656 bytes .../pin.imageset/Contents.json | 21 ++ .../Assets.xcassets/pin.imageset/pin.png | Bin 0 -> 12881 bytes .../Base.lproj/Main.storyboard | 294 ++++++++++++------ UNIT2PracticeProject/DataViewController.m | 2 +- UNIT2PracticeProject/MeetUpCVC.m | 114 ++++--- .../NewEntryInputViewController.m | 5 +- 21 files changed, 313 insertions(+), 148 deletions(-) create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/cover2.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/cover2.imageset/cover2.jpg create mode 100644 UNIT2PracticeProject/Assets.xcassets/pin.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/pin.imageset/pin.png diff --git a/.DS_Store b/.DS_Store index 931de3737c1486f0b5db0ad4789d2b5290b9844d..f822fff7ec330f6c0b60f0e6bc2bbe20a02c2e36 100644 GIT binary patch delta 25 hcmZoMXffC@kCiE7`{V_zzZfTMEX-lt%+B$b9{_}u3H<;7 delta 25 hcmZoMXffC@kCiDZYw`ltUyKDC3v(DZvvd6A2LOGR34#Cs diff --git a/NewJournalEntryViewController.m b/NewJournalEntryViewController.m index 11bdff9..6428df3 100644 --- a/NewJournalEntryViewController.m +++ b/NewJournalEntryViewController.m @@ -9,6 +9,7 @@ #import "NewJournalEntryViewController.h" @interface NewJournalEntryViewController () +@property (weak, nonatomic) IBOutlet UIView *takeAPicButton; @end @@ -64,7 +65,6 @@ - (IBAction)newEntryButtonTapped:(id)sender { [self presentViewController:picker animated:YES completion:NULL]; - } diff --git a/UNIT2PracticeProject.xcodeproj/project.pbxproj b/UNIT2PracticeProject.xcodeproj/project.pbxproj index 18efd89..27faba9 100644 --- a/UNIT2PracticeProject.xcodeproj/project.pbxproj +++ b/UNIT2PracticeProject.xcodeproj/project.pbxproj @@ -181,8 +181,8 @@ AB626ED31BD01B26005BC70B /* Journal Entry Creation */ = { isa = PBXGroup; children = ( - AB626ED81BD01C01005BC70B /* JournalEntryObject.m */, AB626ED71BD01C01005BC70B /* JournalEntryObject.h */, + AB626ED81BD01C01005BC70B /* JournalEntryObject.m */, AB626EC91BD00F65005BC70B /* NewJournalEntryViewController.h */, AB626ECA1BD00F65005BC70B /* NewJournalEntryViewController.m */, AB626ECC1BD014BD005BC70B /* NewEntryInputViewController.h */, diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..d60933119faaecb9c52c5326c703f8a7b3172c86 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^8X(LFBp8;owjKadeV#6kAr*5%PjB=+oFL-*@VtK5 z9hXlWX)QSdQyh($Rb_8>ACunD^im@>V8@TCvzs^^i%U!T^29al)_0{|b1j$gj#y&o z`Pt;eG0(86o4P)Ijtxlrnr&ed5f*%^;_LE%@tvASxhLiNBnE%+y{NH|PvxGHZ_qyL xF5^vaCtdnpIqmei-n2M&bDmA}Kk3PPzN?*WyYxiC32l%IJzf1=);T3K0RZfkPv!ss literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d9372af9eec4c8e4c59c93ae40cebd2901f0c7b2 GIT binary patch literal 383 zcmV-_0f7FAP)twz%h(OK|$dng@uy+6uaw9Pzt8{ z8vXhI&uE;;Wn99O^8k`GQcE&`F)}0x>b?__0@Tz>3Sz>508Qdf0F?}wU{Tyw1T4xn z$Qv-gXBzVWwUA=WZiY7!QUF*=1_9vscZ*|z6ETvNmd)#6FaWFzJnJ@KumgAmq&@{q zV(#*MNFz{b4!Mk67c*jj{P`XDH|(>8)Ms7JbT7vinafq~bBr$l=jQ8p%?dmG72TG; zbcX`R3}0xHae%Fa;uqu$?^Gq(R+1B(7G&cCF1ziMIC_hvrR85%vx0w~B@I dQDE3a_zSaP)Lp$DA!Yyo002ovPDHLkV1l^Op7#I% literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd26a088d815a3bc447a6ba02fce8d6b24601aad GIT binary patch literal 604 zcmV-i0;BzjP)s?JWYRhkdqJhrh096BJ^mlQMJm!yF z%=a(vBM-*UZN14}oNxS=`Tl=%?jm>2En`(_e(&`dm!_W{ahg9EFXPUI@vw;dw=({2 zd}VxVd~JM_%t2B!4TU5tFHi0dz_aCg3tlgH`&j;q$qqqai^$`lUFdJ;e$|hoIJF#0 zc*0-!OZ-W`ei+yP=xu@KU-Ioeb`T^h2J6NKyiV1zV29QeiIF*oX+=Y&Zmd|N&WBrfHgL-Dv2M6&mq~*JnfHrc*ErP zT+H|L-qnq75~J3CN=#9i`uCyWg+s?JWYRhkdqJhrh096BJ^mlQMJm!yF z%=a(vBM-*UZN14}oNxS=`Tl=%?jm>2En`(_e(&`dm!_W{ahg9EFXPUI@vw;dw=({2 zd}VxVd~JM_%t2B!4TU5tFHi0dz_aCg3tlgH`&j;q$qqqai^$`lUFdJ;e$|hoIJF#0 zc*0-!OZ-W`ei+yP=xu@KU-Ioeb`T^h2J6NKyiV1zV29QeiIF*oX+=Y&Zmd|N&WBrfHgL-Dv2M6&mq~*JnfHrc*ErP zT+H|L-qnq75~J3CN=#9i`uCyWg+*O^w&I%ypHS_Zx2Oe?|5_ZcLqMosVB{+0Vd520BsWg zBqx*VJoH=pF*eAp;|vt*JPYCVEcM`r>tP*?(!dd*iq{u_0k|r^-oEYq;L3e^x)I>D z=ueLS;JjF~@@QJM_>FiYIvW3(i4)+3#HsB+MYt}i?;zyudJt}rK3XKk3Z)b3m1WUf zjw_m*?Xc&QkRh+*%hvNT8BWr3QvId5+0obW+;;ef+W+-|I!2Lp$G&r?qVy!++|u zJA8?FANbc1?*i{5{$=9V_g6@SPvO(1{=@ht9=qY6Z}mN|cR1s5%<{9@^E>AJuE$=S ztFiRjc4+#Mm6`ALt@g$(R@I5OwIcpoep_mY2LE!cXu?% zgf-XO+%`^|;pG}^YTvAh(7b?oop7@5Cc_89#P;f>(0g_P)H7`MVf}c}{CS7pYX|av z>pY#3zHq!tbp8fp(QI6}RZ_Rt7Th~dtm9VDBzy+7FADz!;K%hUuK!SslAnwAs&pPf zz1|A%!k7L^ z2Y+)34@og}fE~6JYHRTQ4;)Qs&O1{=c#~;9bGzyngNw(GaGusJ!;W^kbL%);bF%hr zsJ8je6qcv9NZ#9@N;ukgT@q4Zf$L%W-v-x@)s)=eLoRPQdq_MKTV-$m4-r-;R}NsI QQ2+n{07*qoM6N<$g47NK)Bpeg literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..575f1f20bfe7d00c2873bcbeadedb832cc67fe7c GIT binary patch literal 379 zcmV->0fhdEP)4uF&#ffCUqH-M9H1>Dhc1dfuD4obT04R9n13pqO!e~l9mzZzMi zneqG|#5@P%XRJLKz?&j~B*8{X1{^`X6AIiMBeOzg2a*!NCK-@UbYabi0VCXzKyv*q zA$g!7)i@zxAbZmh=V}{LepI|SQ=b9 z+}6^h46MAJzGdjFg)F~%Xvt<6&IsdQ!ap#w_6#a*LnjJdCRJ`vuF#r7IQd(gnuSi> z;tYLVNK%ICmgy?@iAx{|WN5ynFS_dX!m=vBO0ID9M!dV{{miv6){vndt0a(K-8cfD zfVAHs@sSMj6%pP+)9u7+qDyEO3PYhweSn?=EHRZ@iXD1iLBWO$!=!u`ARS|$S~q3{M+Ng2blFg9D+z{VNo?J{En0BfKx zbX(w8Vs`+%3f_DutRkyViH9z36kc{`WK-*wxZVJ9+%r%dN2^Q~umT;>id zfJNh9V%3o(9sKjfv_|9;diHdNxsZJ}t&Vl6n~5*l@;`MCWYsxcQDcX5x`I7AryCv? z-z;m+=;EG++BpKO^4k9WoR1>kZZ76sV|O<854GTOAFxd|z}PwkZfrRdOHHgZRrd98 z8gsbZ##~BdqHAIz`Pi{!`xx|p>_>Atw$vT%Yg(%=y_xQYcv+3L_NLR#OuA11uX9}k zEJD+n>GAP@#IcSQ%>3SBw|Lsm*LfZzz_l_TmYBt7i4l8+Dng$yA0t@B3G5bXI~*zB zXBJAVL+-s*M$eX1caXD5!AY!QY)b~5?4=_!TTw~+Hp#b%iq>>(xEx*aP>h0Tu42z5t2G~8erk;`L&P^ za1k7T0XC}dm%zOPSoR{c$7C+3D=C#jHJuOBIz_OZ>XXIWXa5cSdaQ&G6x`s3;EB}U z!a`mzgrsqE*bOh@N&70K#_pG$aXsm$j(wkg*AzP-XV!Z07*qoM6N<$g3PpgApigX literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small.png new file mode 100644 index 0000000000000000000000000000000000000000..fc344898df50a3f211739e3df2f30f12f677af2f GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^vLMU|BpB*mL@feRnVv3=Ar*624=xlvWWd0B;Pi4P zb|LoUkTM=O$1o!?WdkSo6)QaMEAy5w-Rxf7k-J>~Sj4(VoBbY|y!PT<(s@K-&eAh4 zUhi!Sozq#hRDQbDQZD<8Y#VzYSzo-r_gF{rPusQq*UuhWyXD6Js${kM-yi0G1zGOt L>gTe~DWM4fcQQa9 literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..53e5e7bc974ddbccf7668669370f522ae1186e1a GIT binary patch literal 294 zcmV+>0oneEP)%f<}IBl4Heimv72!7 z)%3?_ZsNU#zgOy>omJ<9ZDpR_RIzJ&P_Aobcv$jGU4D=JMwriexfKq5j?+$`CmW?B sI(v^c?UU9eR>fJ)SL9P>^|=_p7YkBj-@-146951J07*qoM6N<$f>)q~MF0Q* literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/UNIT2PracticeProject/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf59cf1b7fafb31bd3910780bef34e187fc96010 GIT binary patch literal 424 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 literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index 7d7d65c..c99be31 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -17,8 +17,19 @@ + + + + + + - + + + + + + @@ -38,6 +49,10 @@ + + + + @@ -60,17 +75,19 @@ - - - @@ -91,7 +107,6 @@ - @@ -107,7 +122,11 @@ + + + + @@ -116,6 +135,7 @@ + @@ -169,67 +189,92 @@ - + + + + + - + - + - - - + + - Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. - - + + + + + + + + + + - - - - + + + - + - - + - + @@ -261,13 +306,18 @@ + - - + + + + + + @@ -359,72 +409,100 @@ - - + + - - - - - + + + - - - - - - - - - + + + + + + + + + + - + + + + @@ -439,11 +517,11 @@ - + - + @@ -490,29 +568,50 @@ - + - @@ -547,11 +646,11 @@ - + - + @@ -582,11 +681,18 @@ - @@ -626,11 +732,11 @@ - + - + @@ -646,11 +752,11 @@ - + - + @@ -669,6 +775,8 @@ + + diff --git a/UNIT2PracticeProject/DataViewController.m b/UNIT2PracticeProject/DataViewController.m index fbba8d6..ce5cb12 100644 --- a/UNIT2PracticeProject/DataViewController.m +++ b/UNIT2PracticeProject/DataViewController.m @@ -38,7 +38,7 @@ - (void)viewWillAppear:(BOOL)animated { self.imageView.image = (UIImage *)self.photoDataObject; self.titleLabel.text = (NSString*)self.titleDataObject; self.textView.text = (NSString*)self.textEntrydataObject; - + } diff --git a/UNIT2PracticeProject/MeetUpCVC.m b/UNIT2PracticeProject/MeetUpCVC.m index 0067a70..3ac43ca 100644 --- a/UNIT2PracticeProject/MeetUpCVC.m +++ b/UNIT2PracticeProject/MeetUpCVC.m @@ -35,7 +35,19 @@ - (void)viewDidLoad { // Register cell classes [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; - // Do any additional setup after loading the view. + // border + [self.view.layer setBorderColor:[UIColor lightGrayColor].CGColor]; + [self.view.layer setBorderWidth:1.5f]; + + [self.view.layer setBorderColor:[UIColor lightGrayColor].CGColor]; + [self.view.layer setBorderWidth:1.5f]; + + // drop shadow + [self.view.layer setShadowColor:[UIColor blackColor].CGColor]; + [self.view.layer setShadowOpacity:0.8]; + [self.view.layer setShadowRadius:3.0]; + [self.view.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; + } - (void)didReceiveMemoryWarning { @@ -66,67 +78,67 @@ -(NSString *) stripHtml:(NSString*) str { } -(void)apiRequestForSearchTerm:(NSString*)searchTerm { - - + + NSString *encodingString = [searchTerm stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSString *urlstring = [NSString stringWithFormat:@"https://api.meetup.com/2/concierge?key=246e57e1d7676522d3d116b106145d&sign=true&photo-host=public&country=%@&city=%@&state=%@",encodingString,encodingString,encodingString]; -AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]init]; - -[manager GET:urlstring - parameters:nil - success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { - - NSLog(@"%@",responseObject); - - NSArray *results = responseObject[@"results"]; - NSString *name = [[results objectAtIndex:1] objectForKey:@"name"]; - - NSLog(@"%@",name); - - for (NSDictionary *info in results) { - ObjectsInMeetUp *meetUpObject = [[ObjectsInMeetUp alloc]init]; - - NSString *name = [NSString stringWithFormat:@"%@",[info objectForKey:@"name"]]; - meetUpObject.name = name; - - NSString *description = [NSString stringWithFormat:@"%@",[info objectForKey:@"description"]]; - meetUpObject.desc = [self stripHtml: description]; + AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]init]; + + [manager GET:urlstring + parameters:nil + success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { - NSString *fee = [NSString stringWithFormat:@"$%@",[[info objectForKey:@"fee"] objectForKey:@"amount"]]; - meetUpObject.fee = fee; + NSLog(@"%@",responseObject); - NSInteger cost = [[info objectForKey:@"fee"] objectForKey:@"amount"]; + NSArray *results = responseObject[@"results"]; + NSString *name = [[results objectAtIndex:1] objectForKey:@"name"]; - if (cost == 0 ) { - meetUpObject.fee = @"free"; - - }else - meetUpObject.fee = [NSString stringWithFormat:@"$%@",cost]; - - + NSLog(@"%@",name); - NSString *yes_rsvp_count = [NSString stringWithFormat:@"%@ attending!",[info objectForKey:@"yes_rsvp_count"]]; - meetUpObject.yes_rsvp_count = yes_rsvp_count; + for (NSDictionary *info in results) { + ObjectsInMeetUp *meetUpObject = [[ObjectsInMeetUp alloc]init]; + + NSString *name = [NSString stringWithFormat:@"%@",[info objectForKey:@"name"]]; + meetUpObject.name = name; + + NSString *description = [NSString stringWithFormat:@"%@",[info objectForKey:@"description"]]; + meetUpObject.desc = [self stripHtml: description]; + + NSString *fee = [NSString stringWithFormat:@"$%@",[[info objectForKey:@"fee"] objectForKey:@"amount"]]; + meetUpObject.fee = fee; + + NSInteger cost = [[info objectForKey:@"fee"] objectForKey:@"amount"]; + + if (cost == 0 ) { + meetUpObject.fee = @"free"; + + }else + meetUpObject.fee = [NSString stringWithFormat:@"$%@",cost]; + + + + NSString *yes_rsvp_count = [NSString stringWithFormat:@"%@ attending!",[info objectForKey:@"yes_rsvp_count"]]; + meetUpObject.yes_rsvp_count = yes_rsvp_count; + + //NSString *shortame = [NSString stringWithFormat:@"%@",[info objectForKey:@"shortname"]]; + //meetUpObject.shortname = shortame; + NSString *tapMe = [NSString stringWithFormat:@"Tap here for more info"]; + + + [self.meetUpData addObject:meetUpObject]; + [self.collectionView reloadData]; + } - //NSString *shortame = [NSString stringWithFormat:@"%@",[info objectForKey:@"shortname"]]; - //meetUpObject.shortname = shortame; - NSString *tapMe = [NSString stringWithFormat:@"Tap here for more info"]; + } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { - [self.meetUpData addObject:meetUpObject]; - [self.collectionView reloadData]; - } - - - } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { - - }]; - + }]; + [self.collectionView reloadData]; - + } @@ -134,7 +146,7 @@ -(void)apiRequestForSearchTerm:(NSString*)searchTerm { #pragma mark - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - + return 1; } @@ -162,7 +174,7 @@ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cell #pragma mark - text field delegate -(BOOL)textFieldShouldReturn:(UITextField *)textField{ - + [self.view endEditing:YES]; [self apiRequestForSearchTerm:textField.text]; diff --git a/UNIT2PracticeProject/NewEntryInputViewController.m b/UNIT2PracticeProject/NewEntryInputViewController.m index 061a596..232049a 100644 --- a/UNIT2PracticeProject/NewEntryInputViewController.m +++ b/UNIT2PracticeProject/NewEntryInputViewController.m @@ -13,6 +13,7 @@ @interface NewEntryInputViewController () +@property (weak, nonatomic) IBOutlet UILabel *addTitle; @end @@ -22,6 +23,7 @@ @implementation NewEntryInputViewController - (void)viewDidLoad { [super viewDidLoad]; + [self.addTitle.layer setCornerRadius:30.0f]; // Do any additional setup after loading the view. @@ -30,6 +32,8 @@ - (void)viewDidLoad { if (self.selectedPhoto.image != nil) { NSLog(@"We have Photo Data"); } + [self.view endEditing:YES]; + } @@ -69,7 +73,6 @@ - (IBAction)saveEntryButtonTapped:(id)sender { [self dismissViewControllerAnimated:NO completion:nil]; - } From 7c30673e8ea9c983801387592a441fb17131de6b Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Tue, 20 Oct 2015 02:32:31 -0400 Subject: [PATCH 08/23] added to textfield search in meet up --- .DS_Store | Bin 6148 -> 6148 bytes .../background.imageset/Contents.json | 21 ++++++++++++++++++ .../background.imageset/background.jpg | Bin 0 -> 88442 bytes .../Base.lproj/Main.storyboard | 2 +- 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 UNIT2PracticeProject/Assets.xcassets/background.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/background.imageset/background.jpg diff --git a/.DS_Store b/.DS_Store index f822fff7ec330f6c0b60f0e6bc2bbe20a02c2e36..8e1c99d989ed2b5452061efd16e8630c780a201f 100644 GIT binary patch delta 14 VcmZoMXffC@pOx{%<^`-NLI5f>1yle4 delta 14 VcmZoMXffC@pOta@<^`-NLI5ew1w#M; diff --git a/UNIT2PracticeProject/Assets.xcassets/background.imageset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/background.imageset/Contents.json new file mode 100644 index 0000000..e97bcdb --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/background.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "background.jpg", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Assets.xcassets/background.imageset/background.jpg b/UNIT2PracticeProject/Assets.xcassets/background.imageset/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7043593939068d194164be633c5bbd6bbbc7b7f GIT binary patch literal 88442 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 puxVTwuuq%X7xmtGu9mrt#{ - + From 992db9e029f5f3c71b4709bfd1db455523b5979c Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Tue, 20 Oct 2015 10:37:04 -0400 Subject: [PATCH 09/23] got rid of in journal entry --- .../Base.lproj/Main.storyboard | 33 ++++--------------- .../NewEntryInputViewController.m | 2 -- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index dfd108e..b735875 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -196,7 +196,7 @@ - + @@ -244,37 +244,18 @@ - - - - - @@ -282,9 +263,9 @@ - + @@ -297,7 +278,6 @@ - @@ -317,7 +297,6 @@ - @@ -409,11 +388,11 @@ - + - + - + + @@ -258,6 +272,7 @@ + @@ -265,6 +280,7 @@ + @@ -296,6 +312,8 @@ + + @@ -757,5 +775,8 @@ + + + diff --git a/UNIT2PracticeProject/NewEntryInputViewController.m b/UNIT2PracticeProject/NewEntryInputViewController.m index 45bc37b..a136aed 100644 --- a/UNIT2PracticeProject/NewEntryInputViewController.m +++ b/UNIT2PracticeProject/NewEntryInputViewController.m @@ -28,11 +28,14 @@ - (void)viewDidLoad { } [self.view endEditing:YES]; - self.journalEntryTextView.text = @"Journal Entry"; + self.journalEntryTextView.text = @"Enter Text Here"; self.journalEntryTextView.textColor = [UIColor lightGrayColor]; self.journalEntryTextView.delegate = self; } + +#pragma placeholder text for journalEntryTextView + - (BOOL) textViewShouldBeginEditing:(UITextView *)textView { self.journalEntryTextView.text = @""; @@ -45,25 +48,13 @@ -(void) textViewDidChange:(UITextView *)textView if(self.journalEntryTextView.text.length == 0){ self.journalEntryTextView.textColor = [UIColor lightGrayColor]; - self.journalEntryTextView.text = @"Journal Entry"; + self.journalEntryTextView.text = @"Enter Text Here"; [self.journalEntryTextView resignFirstResponder]; } -} - - - - +} -/* - #pragma mark - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. - } - */ +#pragma saveEntry - (IBAction)saveEntryButtonTapped:(id)sender { NSLog(@"%@", self.journalEntryTextView.text); From c44db7244165c0fa51c5886ee8ed01d107f7cb65 Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Tue, 20 Oct 2015 13:48:15 -0400 Subject: [PATCH 12/23] pushing --- MapKitViewController.m | 8 +-- .../Base.lproj/Main.storyboard | 55 +++++++++---------- UNIT2PracticeProject/DataViewController.m | 23 +++++++- .../EntryListTableViewController.m | 7 ++- 4 files changed, 56 insertions(+), 37 deletions(-) diff --git a/MapKitViewController.m b/MapKitViewController.m index bf36a1d..0a2de58 100644 --- a/MapKitViewController.m +++ b/MapKitViewController.m @@ -31,7 +31,6 @@ - (void)viewDidLoad [super viewDidLoad]; // border radius -// [self.mapView.layer setCornerRadius:30.0f]; [self.pinLocationButton.layer setCornerRadius:30.0f]; @@ -61,9 +60,9 @@ - (void)viewDidLoad self.placesVisited = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"destinations"]]; -// CLLocationCoordinate2D center = CLLocationCoordinate2DMake(40.7, -74); -// MKCoordinateSpan span = MKCoordinateSpanMake(0.8, 0.8); -// [self.mapView setRegion:MKCoordinateRegionMake(center, span)]; + CLLocationCoordinate2D center = CLLocationCoordinate2DMake(40.7, -74); + MKCoordinateSpan span = MKCoordinateSpanMake(0.8, 0.8); + [self.mapView setRegion:MKCoordinateRegionMake(center, span)]; //create location manager self.locationManager = [[CLLocationManager alloc]init]; @@ -105,7 +104,6 @@ - (void)reloadPins - (IBAction)pinLocationButtonTapped:(id)sender { MKPointAnnotation *mapPin = [[MKPointAnnotation alloc]init]; - // mapPin.title = @"The Location"; mapPin.coordinate = CLLocationCoordinate2DMake(self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude); [self.mapView addAnnotation:mapPin]; diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index c4cd74f..df783d7 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -406,35 +406,45 @@ - - + + - - + + - - - + - - - - + + - @@ -546,7 +546,7 @@ - + @@ -643,7 +643,7 @@ - + @@ -671,7 +671,7 @@ - + @@ -771,7 +771,6 @@ - diff --git a/UNIT2PracticeProject/DataViewController.m b/UNIT2PracticeProject/DataViewController.m index ce5cb12..3811fcd 100644 --- a/UNIT2PracticeProject/DataViewController.m +++ b/UNIT2PracticeProject/DataViewController.m @@ -7,9 +7,13 @@ // #import "DataViewController.h" +#import +#import @interface DataViewController () +@property(nonatomic) CGRect accessibilityFrame; + @end @implementation DataViewController @@ -20,8 +24,6 @@ - (void)viewDidLoad { } - - - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // self.dataLabel.text = [self.photoDataObject description]; @@ -38,7 +40,22 @@ - (void)viewWillAppear:(BOOL)animated { self.imageView.image = (UIImage *)self.photoDataObject; self.titleLabel.text = (NSString*)self.titleDataObject; self.textView.text = (NSString*)self.textEntrydataObject; - + + CGPoint topLeft = CGPointMake(0, 0); + + + + + //facebook share button + FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init]; + content.contentURL = [NSURL + URLWithString:@"https://www.facebook.com/FacebookDevelopers"]; + FBSDKShareButton *shareButton = [[FBSDKShareButton alloc] init]; + shareButton.shareContent = content; + shareButton.accessibilityFrame = topLeft; + [self.view addSubview:shareButton]; + + } diff --git a/UNIT2PracticeProject/EntryListTableViewController.m b/UNIT2PracticeProject/EntryListTableViewController.m index 2c51515..ff82c23 100644 --- a/UNIT2PracticeProject/EntryListTableViewController.m +++ b/UNIT2PracticeProject/EntryListTableViewController.m @@ -14,6 +14,8 @@ - (void)viewDidLoad { [super viewDidLoad]; + self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.jpg"]]; + [self.tableView reloadData]; @@ -54,7 +56,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EntryCellIdentifier" forIndexPath:indexPath]; JournalEntryObject* journalEntry = [PhotoAlbum sharedPhotoAlbum].photoEntries[indexPath.row]; - cell.textLabel.text = journalEntry.savedTitle; + cell.textLabel.text = journalEntry.savedTitle; + cell.textLabel.textColor = [UIColor whiteColor]; + cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.jpg"]]; + return cell; From 59ff9ac6a5705eb2c8ffda140eee4a44b9ab2a5e Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 21 Oct 2015 12:28:39 -0400 Subject: [PATCH 13/23] tabBar icons --- .DS_Store | Bin 6148 -> 6148 bytes .../folder-128.imageset/Contents.json | 21 +++++++++++++++++ .../folder-128.imageset/folder-128.png | Bin 0 -> 1610 bytes .../folder-48.imageset/Contents.json | 21 +++++++++++++++++ .../folder-48.imageset/folder-48.png | Bin 0 -> 680 bytes .../globe-128.imageset/Contents.json | 21 +++++++++++++++++ .../globe-128.imageset/globe-128.png | Bin 0 -> 4282 bytes .../globe-48.imageset/Contents.json | 21 +++++++++++++++++ .../globe-48.imageset/globe-48.png | Bin 0 -> 1976 bytes .../info-128.imageset/Contents.json | 21 +++++++++++++++++ .../info-128.imageset/info-128.png | Bin 0 -> 5657 bytes .../info-48.imageset/Contents.json | 21 +++++++++++++++++ .../info-48.imageset/info-48.png | Bin 0 -> 2040 bytes .../note-128.imageset/Contents.json | 21 +++++++++++++++++ .../note-128.imageset/note-128.png | Bin 0 -> 1398 bytes .../note-48.imageset/Contents.json | 21 +++++++++++++++++ .../note-48.imageset/note-48.png | Bin 0 -> 758 bytes .../Base.lproj/Main.storyboard | 22 +++++++++++------- UNIT2PracticeProject/DataViewController.m | 2 +- 19 files changed, 182 insertions(+), 10 deletions(-) create mode 100644 UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/folder-128.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/folder-48.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/folder-48.imageset/folder-48.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/globe-128.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/globe-128.imageset/globe-128.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/globe-48.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/globe-48.imageset/globe-48.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/info-128.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/info-128.imageset/info-128.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/info-48.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/info-48.imageset/info-48.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/note-128.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/note-128.imageset/note-128.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/note-48.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/note-48.imageset/note-48.png diff --git a/.DS_Store b/.DS_Store index 8e1c99d989ed2b5452061efd16e8630c780a201f..db0420e384fd12bbf5f5da7fe19944ebbd1bce9b 100644 GIT binary patch delta 58 zcmZoMXffC@kCn+faPk6He^wv!Hw+9wmK$G+OG;@;G6TaUn2^il9yUJ4fQ^MYjGNgx H{_+C=ElLu{ delta 58 zcmZoMXffC@kCiFo#N-96{;b}48j diff --git a/UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/Contents.json new file mode 100644 index 0000000..d220016 --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "folder-128.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/folder-128.png b/UNIT2PracticeProject/Assets.xcassets/folder-128.imageset/folder-128.png new file mode 100644 index 0000000000000000000000000000000000000000..786e6f4fa63320bfa2e8f05a3a9f0180709ff8fe GIT binary patch literal 1610 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 literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index df783d7..2644ae3 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -323,7 +323,7 @@ - + @@ -363,7 +363,7 @@ - + @@ -514,11 +514,11 @@ - + - + @@ -729,11 +729,11 @@ - + - + @@ -749,11 +749,11 @@ - + - + @@ -772,10 +772,14 @@ + + + + - + diff --git a/UNIT2PracticeProject/DataViewController.m b/UNIT2PracticeProject/DataViewController.m index 3811fcd..9c66920 100644 --- a/UNIT2PracticeProject/DataViewController.m +++ b/UNIT2PracticeProject/DataViewController.m @@ -52,7 +52,7 @@ - (void)viewWillAppear:(BOOL)animated { URLWithString:@"https://www.facebook.com/FacebookDevelopers"]; FBSDKShareButton *shareButton = [[FBSDKShareButton alloc] init]; shareButton.shareContent = content; - shareButton.accessibilityFrame = topLeft; + // shareButton.accessibilityFrame = topLeft; [self.view addSubview:shareButton]; From 2b63fb3ba092e003b6b07e98e56feb0a78982159 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 21 Oct 2015 12:57:42 -0400 Subject: [PATCH 14/23] new backgrounds --- .DS_Store | Bin 6148 -> 6148 bytes .../add-64.imageset/Contents.json | 21 ++++++++ .../add-64.imageset/add-64.png | Bin 0 -> 2662 bytes .../camera-64.imageset/Contents.json | 21 ++++++++ .../camera-64.imageset/camera-64.png | Bin 0 -> 2867 bytes .../Contents.json | 21 ++++++++ .../lt_antiquepaper_02_720.jpg | Bin 0 -> 202924 bytes .../Contents.json | 21 ++++++++ .../old-compass-paper-8272981_720.jpg | Bin 0 -> 108586 bytes .../Base.lproj/Main.storyboard | 45 ++++++++++-------- 10 files changed, 108 insertions(+), 21 deletions(-) create mode 100644 UNIT2PracticeProject/Assets.xcassets/add-64.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/add-64.imageset/add-64.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/camera-64.png create mode 100644 UNIT2PracticeProject/Assets.xcassets/lt_antiquepaper_02_720.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/lt_antiquepaper_02_720.imageset/lt_antiquepaper_02_720.jpg create mode 100644 UNIT2PracticeProject/Assets.xcassets/old-compass-paper-8272981_720.imageset/Contents.json create mode 100644 UNIT2PracticeProject/Assets.xcassets/old-compass-paper-8272981_720.imageset/old-compass-paper-8272981_720.jpg diff --git a/.DS_Store b/.DS_Store index db0420e384fd12bbf5f5da7fe19944ebbd1bce9b..1dc60cb17051e53bd51ff683a61e35306948a4ba 100644 GIT binary patch delta 25 hcmZoMXffC@kCiD%ck%+(UyKDC3v(DZvvd6A2LO3K2|WM+ delta 25 hcmZoMXffC@kCn+faPk7yUyK183v(DZvvd6A2LO1t2`T^p diff --git a/UNIT2PracticeProject/Assets.xcassets/add-64.imageset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/add-64.imageset/Contents.json new file mode 100644 index 0000000..11693b5 --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/add-64.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "add-64.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Assets.xcassets/add-64.imageset/add-64.png b/UNIT2PracticeProject/Assets.xcassets/add-64.imageset/add-64.png new file mode 100644 index 0000000000000000000000000000000000000000..203f77fb805077a738baec3730fb99744d8c296b GIT binary patch literal 2662 zcmV-s3YqnZP)<%8~WXKYZuwP#OL@04#a)rRq^y35`D zc97G?h<9QBz0RF2t>k+EYiQ7lRM&b_xmjUNBsRBKgy8y2x~Xw0W+&}{vSe~@te1Nb z`Q(Vu=(0d=*qdtFITaFW~*>)m)`)|RP zEvDkX20$rWok%Xv76El%AL)q&znKw&MS!|K7?n+QJw%^?Q4QJ6L&wfXpPmtRML_$` zrl&CbCxE$CL)HO;$XbAG^!9{?8`=h-;_Cp>)m0moj7eH_%ow#IL6!F5(#b2=Ub;v_ zbXim>?%gv*tXOd5*{B>-U#6HWjRaxIiSGa%^N?L^sgB0^;FOZEXJ%*>5d)(?I{WyV6T`3-G8~aJY(+e=aXRKOb<3ohcN|ZzqvMgj@^!VL zss=doV^NAaN>t`_GnWTdec|ynCx(m(M~cX;KFvguhZX{{Ty$0G1x|LDpZ7@2+YK?C zUL;CU=LQwuB%X&)K;%{ccmIZ>`=?`10?m2(ZpM67P?5tif#J-ml+@JJl;$!Hbf#N& zPn~KO@x(@=*Iv>69qFbgrfV~&`^GPu<2n!kINqxchoZ_ugTb`E>$e3;2S)lRa7a-< z5D9`oS$6bRCk{eb9+eHcHNeI!3`Q$YRH!g!^yxM)>+|0Ts|SXh*|J-IS>ez&!}I6fb^XSGr|n^?Ss(Zeeg6cs3QT;g9O; z>nA)x@^(ReeSP5WKLl`NAc*O0W9yG_K=$md+yx-$iWd*|eYtp43xgM4?f*)Y^bzqp z_B_$_%Gmn1jP}8s(qL{`C6{lnyr}l9qA)E0K3MgU_qf>B?3KOLH)~+)c%8R6V9%bW zULm+10O6z{l!wl(ub)+5u6ajIO-<>bg%2y5jd&Sf{mY;J^xyG%N1g98>83`5pJ%UR z<@|&FcjTL(WBq3In9<`{f4=SiyRYPq=q$0r{d;#l_Pe9$O}OqaOD5;W4toaG^M;LV z&a^eZEz;%{mC4N@-vKcE>7ajhMMuXYeMi%saFqZ1fdhk!&s_dT!#0V?I|ME|{fwpm zc;$ry`wB%oA1F^GzbGOC>J*&aJPXH9Ssz5r)qRI~zOGkF_1IZO(iDimKW&Gq#WZ!{hrrl*==_nxC5*?fhWn zMYU%IgZeN^8GxDnBZ$d{T#w67D)aKHAKes!YJej-dc{FOa>E4KrS#)#X^`R?Az3%2L|oKZuAX1BE53{hMU zfS1kex{2ob<6&CyzeJ*bUcdA=;C3CNBdbL-dQ|+^>iS^&&ZeiB`X6MndfmqJP5lZp zKB3A;Oy7+G5x=8v*1*=It?+Wb!BiWLMZCIpVHnDdihK@X?zrkhW~5bVH>W#*XBjB% z8UL!rB*C`VE@5Lqp~9u zeLRZcOV07*qoM6N<$g6(K5i2wiq literal 0 HcmV?d00001 diff --git a/UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/Contents.json b/UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/Contents.json new file mode 100644 index 0000000..79cbefd --- /dev/null +++ b/UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "camera-64.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/camera-64.png b/UNIT2PracticeProject/Assets.xcassets/camera-64.imageset/camera-64.png new file mode 100644 index 0000000000000000000000000000000000000000..fcdc05bdf93426a342f144a4f0568844f2c64333 GIT binary patch literal 2867 zcmV-33(WM1P)yzLGvP2J z4(=jV{V;$z{9v)Q?Cb127Nyq64VW6dbNpIGQ-l8Y!?WS4*|1^J!sCg5N4Yd?v7W*Q zNJnWxqy{8YncIP{0XTDSsBzI?U)L|n;q*K&k!SICgi8Q0_oN(Om>w8-bVmQE_k%`3 z0#NT|Zlf4H#?iRNn#&Cy!1w)pf}@)-x&aVfZ)c2lHZ*KrSS~k2WI(-_xlM$x17I97 zxb)e+9Y2YJ8{Wr+1;=wynD9rpKttoEl}>_l!Q#_nkoAIG1AuX;P+?8`_H_P7xx!8a z&+`(;UxHHx(=L- zXJFvb(dOpn%#l$(HeHPs7OQY#o1D2DRJD>o?*VG1wrS&vnAuAJX52F5=WduT>2y%v z+`L%w71uc2)rx*}I(;1O6-Dp0#Q5DqyLTUrR8J~>vmiGDsM&cM3*55ONi*w;Y^3&f zt@kq5TE5~i@U5xAJLg^p`VDdhIiSDT20-!JZ&|+LaJ`qgmiG3@(zU8}mW~U^N8?T; zHo-1B?Z5rWuzFqF(wM*hVG&YO(#-Q_{Hu$*9eaDb4xOmq1x=TqTW~=}gwFw=RQNN5 zJCpvtE1cKznPGqDYvpPS0vpq!D8b^>OLa3qZPUgTF<0mY&IH1Ff$;UA-rV+6^?j!2 z@m~Vp1-@7Br8kM#?V#s?G%2yc+NO<{?Csg{^C211T zwrh(MLF&9rT7_JwL+Xb89eZa(v?iUdjE~qbqMrc3xOvdewU@?8dYQikZbVr2z9eD4 zL%=@_`newg29WeJHz9;v&i$;gSn6lHAgc3P&R2>31i;MNB73;R-<8`Yf`>aw!LQxW zR-N=(_aNL?3f?&vIP5utT?V^==P?%+JcMNk_a(j7J!?0#RRawAxtoAH08stw*ob^P zD&3J7P}`WU1HM@N+JEMf#Pt9T>s$Y#Fh2G)qU!;i<5e-PizUXZhkH9~hI(@?L%q3{ z!QR|TIb(c@7}q(+s{n|u4~~yNQ|~qZB|wq0A3$(lN;b8wi9&lM2B=C0Aeb9-vBK5a zY&K|U*t{?Z*jY+{W;|3WiH{HXxjP5CyWe~-$3S=Yn*)CC&Pqvq+>D0+MCDwQ_|Arg z%?q>HY!HZi9&=-eDuHxFqP<*#x{EJcE^t|q?!Mt4?|K=)68UW^S_5FlT|<6utM6yu zJr$qtXWt$2b6d^0D-Zg6{#;ugjd{ zkZS?Vxu?&nPFy!r-m|I`*O}Qf0M6N0YA%?2~2&1SQK#`p?=s>ZaSUj}&A?|ccz0RTZREmwY72CP~0g$ff^ z1E|Q8rFId!0synVVSndOXUjkEWaoa04?Yuj#l#7vIF{9Vo>$gfrYr+w@oUQ_e`$RV z!n7C8-oQknSX*=fD0+6C*YXhn%$_SMs5lm{Jo&uh6e!Dpm~%@?$7aE+0B$@uXYva9 zSvmXw&Y0w|&{#}YqzM(e*hC}c++t87f+1+ za^k#mHD&RK%&R8oV)_bzI6G_NY=ymkqF&QQSqA)7b>dg%I1XTrRS?eT9E9mmWMet} z0OCRpgO`SX{P^#}R$T?)Aiwvb+Qa4Wmt{aUn+-%60ucDr1gViN9@f=2wyv8ke?uzm zp%mx*mYq0Zt~Ay_xx2;@OoVJF0K)Rp0>u&B?H~_eD&O}!FELYE&+`(7{By`hz7SO0 z4PgZv)fE6z8oLaXZ9w2+50#d(=Jaa-!~V|K)YujdAS?4yb^lBzES~4Z^HOy`@JRr{ zZr$Ji*lz&>v2PF#=AiIz8Mog0@(t9S>Hk%*#^+CKD}CSp9XLuj|};{e{&M5X(5v3u$bKhHjb!T zL4N3YUc&eN!g0~dfnfkaK2@QGmy)UUwq#?=dGF;&HnyBspUT`Ci;ewUknkRN?5hau za^Lq0p64a3AU{M@F*jzSH$|a65(5VNcD{)5?IPox_xj>Mubzb_|aB9sp2Rk}`4_uXO%sgPYc2T_$0M!o(d?-AgEtqbB;KKsODZv>x)%v=5*gwKQl$oH%MYxIU>D)XQ@mwWfa zm4h#2vtv{HePYX&1&fXxZ&0)JTY1|m$Wke7D;W>leL#EJ%8pUn3S4M@>HHUO#r0s>VWwV&tV=CI8gBO0z{|`vNDz zP;YK~f}<-iuEea5;zoz6#)_uYg47}`n+zVqtPkVL1V>j)XG^Ud#6`r4y5|x3B5s*8{SyEc_l}t!Qstn;txmAcR05G%bhy2d(loE|3Q|a3$-tYZC4m18~$j^Nh zus?WDu-?lwAa<2FS#EQbB2O0t3a0ilCif5dxq;KIXCCvI$2{gSk9nMa{5LBnkE%4vy}wn(|T<`UY<(;Ku!^2!tGV) zAO4^8+Q#i1@LB@EFIEM03X1>9|Nr`dY3A(e4getaR|Rf!3pcY@{P7jrd$~LR72m&N90v;%HvoV^`Nwy+FtdKe9IqI~Ra;Z~6^j4>0*cjt z!>0cYyIXj_+6e&CPR>5AHdfZ|6bxpJ6r6&B0u%}sUiKF5?yTx2W_Bj7<`mLS4$dZy zJ^=6^WB#WFVEywg#jBI~I0gCmSh?6<-T$BTzpeaFssBCrH@E*Gai#G;<_v^4`d_^N z()}-M}?v$3N1$ClRArZDqx_56ol_r$*f7C-{f0UUr3AOolY27ndd0{8)8Kmw2j z6ah6r8!!Og0cL=whtGtsgzto(hTnm|M?gj(N8mz`LwJMWh!BF1 zj!=&917R9r58(+B1CbU{2vH5u9MK0c0kH_N4RHc-2k{9B6Nw&46iFM&7AY7h1E~tB z4`~_c3KS2ss0}26+&91Ni|33xx?q8pROB10^2iD@qs2ZE*2a)|nfj)`%Ig^A6GqlxQ?7fHY*OeC5lek6q?qa-(^WTf(>&ZL>7KS__t@W>>{ zY{^o|evloIW0Q-K+mNS{cak4c;8I9Z*i&Rs^irHtl29s8dQj$5j#EBS(NpPAg-}&f ztxzLT3s759r&9M&pVN@jsL=S+RM0HaBGL-bTGM`_9iY9Vqo>oOi=bhtm7f zSI{prpfZRvxG)qj%rL?+3NYF+eqo$s0yFV4Su3!yyRly zGULkTn&C#}mg5fOZsES*Vdk;m$>CYx#pYGvjo|I!{lmx4=gL>bcfe1>Z_NLhe_jAb zKwThKU{DZNP)aaRutV@ch)>8}s7~lim{r(LxLkN&gkHo#q)22-luFb@G+%UGj6%#< zEKh7*oKoCGyg+4K=fEKpad#!S< zTWu-r1nngq1|1Kb9$j=@L)|jnJ3Se_WW9BLcKr|fBL+kUHU=$k;NR%JDS31AR`zY$ z+Z{t*!*IhnBYGomqoH?1@9f`we~_` zs~r#=j2&7Xu^jCjd!5Lfyq%_;nVrL(*Ik5M(p=76m0U~QKyF5EE$%q4!PKY+gGZRh zhNqZkw&%TZyf$q)Gfpa9c=o zDwi}jCigMVCT}5MKEJ7et{}Y-uF$h^w@9~Wpje=|tc0i}rsU68$FJ+9nx(yE{AFe3 zB;^Se;0lk5gG$57$!{{>TB=y9@~iQxV`_jJkD9|;Wj+J?`K*p1Om zpeCQD^JeSj^%jGcsaD0-o;KmO#&)*$uN{;f+23)$C;UMA@$tvsPT$U(F6XY}ZmaIC zp7%XVKlOjk^lJ2u_bK%a_RIDE9FQF7926bw7!n$49TpgF9^o5l8s!~r9OE5p9OoNv zn&6*knG~FCn-ZD&F)cpb{Y&Oo{|t0yWL9-{YEEZvVcu|leZhQT|F`|`i$%}Hr=_4} z*yZRIjFt3NlGTDW#fB*hn0;B;j2=wpzp9F!0{3AFR7zivp z-0S1&^^JgtjEI1Mga8kZgo=cOjPgqGh-m1jC}{uizefJ4|I>QCP!Qk|{z?4*qrY7M zCIV<3JP83|0$@xK1QYbP7a(~JU|*w$SNa#K{394xI0zU74sZaoP-nC^}_r;ovPxw_3MQ*4jq zBHDUC(q)zS>jhhRhM49BZ6xzT@xuJ#1@>yGE6*Mab#{3tH->YO>2Uj(xO6AP-cd7C zIixKGAplr{d%2Ezt7aXtLd-XDBK#YI8}VwKJD)9!>|za6CnG+D2)8r87l(0`fG>ED zC-dIRk{CafG69`M5+Tu2FYnSyPYWOJJGDiKcia0Irb@>wNC`82r04q(E}rAh*Ksl~ zJKO@XwU%(hJaM)lb+xUAKhHgx|G@O~a1U?FU_xEt(bNK#B#@kHcjOJm^9M=k#hi8+8_p0m0v**4 z%QGVD5Y2cnn@_wG`Z&p+_Z1KhCBIa|6^@rRD|Xc?9S2(`l7{PZQM#d zleL`Zu1lI+2aO|~K%LG~10gu?tFMVer89oO0-hOx{%!m^rv;Ayd?zU-4F@yhnG=`9~mp{5`fXEYVx<`!lLoGl3I;ejN`q`gq}R+($F_W3SjeVt4uO~})- zxQx!wi4IE|8?~`!@T^s0`NKgF?s>-@sr`{0c3M}qH}cQc0E&wM+cA`*ViO@Vd1gb) z&v+iS+7Px=_!jZ_FAHH6ky-A2ZGJI7SN|~jTh|_PmoQ>F- z#oXXo5GZQptdf&P{bMn*BGg;H=l!zfqy6zNJT*nbe>x$-MIXz%&tOUpD<9 zJ&bl(L*(e(?v?<^>?JM1LyzEcb5`8$$F)1~r$C4J-LtI2Bm3GYVtMH2l%Y}^t0A2b zLBdtM)Ox7EhK@RVgQx9jyU*q$v54`bqI&8NtohFRt)_PY$hNHn_dfdDl-P)w1D~37 zaBmy=yOst-p?3>QdvkO@Qn;qGxZsaQY`k6bOp+3Fe4uiJp|D67cf5Y~NyqYbN7Bj8 z-l;n6wJ39q0$g7SL!g+&!k* zdoK_gJP_==lvwA-^F=)mPC+f4*F9-7?(ToA&|>)95B(^fl_Si7^}mJYPkbV?B#wrf z&Qjliq(i*(Pb?>DkopHXm_16n{{kh1z>C# zX6ex$B6=tn?}K@Zrff#RBpucTn2P`o% zip))pViIVk#2k4hDgJ0Vb}?!^Xy&Ll*?%2DQUr&a%E-ac5X_==7h#>46!^VA*AK;%>$NVxj`MF14>OD zDopGamHFf69jo+Hg%PsDA%t{qf>N4zU7Exd&W=cruKcgdCz3{^w{8+H;p5i7E2+&| zCU6=GsZb=#m^jCMOw#tTv=y)Y3+TYi&|R!OFnz=}i)=TVFtQ`2$3BaPbtd3s8k5D$ z_|uan8$5{Sv%NAs1KA^VAMq|P=tSMek}Nn#86f)Xoh}IT7AkK%`)sh++)Q@ozb$1e zJ~+kmM-O#cH>oa`H4Qv?d*{)36l6WO`sWep7>%k9%*{39PxTj&jTif2fa3bmYq9Yy zquj<)HvQ^E-;%kDFiDa~w#?Z0h@6j!q4U(R|18^~P893VlVVCY|H3t*2(*n6LWrqk zGZc$KDV;(m`DI(SSfvk@>vc2|KydfU%kwB~q+AY&iof?~VrlOm0Wx%HpSKx>>9|&F zK>{Rb@RBiP^=T5gIQJ3qLj!|R7AcIB3(A8~Y`z&v6_*xJ`%?B@Rjd9=#{4wbd1v@m zgj5!bZ7z-iZC|wXPNkE~$yvJ}R@Zyr3GgM(PJ)~4DhnF=l9rZ<<5M?!xjl;2yR6xs zNv$rAIu<%$2t{FXJz&tZ6`a2Q3!Ge7?(h|G;R$jP6Un{(y{qWu>vV#mlAB)JB}%;# zM9l!`$o_sI9hhnqFYnEfrptcB!hI93cPY6rI)`n|hOoYHHbASN2t;=oC5=w}d?A_f z7*mz&COG2Z%1`rO8AbrOFnsLVZmTNCl)%v@E-xt?ta{xXY-E~WlV}v{%zb*?S~!@o z=S@7DRDRc*WIB*jw}&I%5=ot)p9G!{Oc1P>b1W>cBfeg`o;(7%yc|#d_G%2`=MYWBNqj%l0B0%qRoo#~b8U_SJw zu%~Kg^vk1N6g>Hw+a-P+mi&7{RPzgwK5C6Kl=pb3J+%{ zvA#j*xr9BhBr0zY655m2{!SOiW<60fw0XS3-BY`>Z9YN6EzO>?GbkCqoWS#xh;A(W z;v0RCQ+K9gD!(s2t0E6Iw05oMS|g?zgmL8^;Kop$Bgv+Seo@o$xJ=gaA1k`}QMg&D zjWr~)P$N{PgNyJE{8*i$C;#%x=urp9WpvNblDwIUkQ63?V>nnNgSZ&LRkwdj%>V4N zRu&^@ou{6$|3Yc6zZIFgj~N$5MTZ;Q1O+?7ooz)Ow^3Fjy{6)tGh`godG6lF9V0-seVYKWohR&Cl)LEjH9(`)6oz~gY`xE|z8?k@H*=aB9D2R*0jcfBkiD~LxWESr07gAo=c&?-}_9hDs@W5T$_`|nM4aU&;ksbtrnPCJ#7F3cD-BBr5fHxCCb zAzkl}aYyK>piZSn`C7nDTk;3OVFaKJaoCoBM-Y5o9Ewld(P2pSmGXmlHF;SW`V|h* zQ4OALD~)My42Rw({2z(13+-(x_BnIKDb;Mxm(0A9`FLrhlfFbXr6PVrxmjRc*$vl%-lh78BBhRR@p#Cqdrbpw1?aY9AP`=q(ApFfyk!@(tx z87QIVFN>ZCMe#x4OKNz|bry=cjAglEsC7vZ)Wrs?W|JtI7f^n9O3a3h z6x~NVI+^xerW$9Cbj%F7f8!}lG{%|kQcOLEz52iMcVh2`nQtAAq45~dUH+g zMcd%&0Td?gPs#}_@>CN=QnZSOv60Al#?P$pW?|If;xz86>OX&043ZeFJI`Tpl}>fR z9Q4dEr=;~%m(Y=1KVAMhyR4_-B@ShkCBG4x-$++hHVg(g@ex32i90$eqjmrueV78D z`iX!nD3lDFtZ9hbIg{8tN3%)lOL;v*)f!3d`>onTI7arLNbZmdrdQ2eo~9gfb+S9 zKgz+2`)3=EPc*>pWbAY*T2Xq4H6sMww*{W$4PWjb`rf2+*lDRS%kPd-##;|M&BB~5 zLq&ol)`?C&v>vu8+m@tMC?yD;T_OB(CkaHCOk&PT-H?yM@j+7Rq2Uxr8$5Zm2z!mL zEJ2^=xj}*6n=PFaSIA*{_~Hi|b)y_Tzj4f0SPE^+OkVi%y#QEZ(mr5#$<@^MK7}-p z(Cn7rGF8TW0dJ za3Y4f8;vK9MTKvUB@-N)+|&7sZn64;_k%T>V@F|?o|i#F___H7+&dDDhgNzjsVkYf zGE}Vkyf2lSkEL*JRRKa?E14EEUG!}SthFM{aPVRIu}~ZzZgVlad}0(^VMh4yJN$(p z=2E}qUB~HPEa^0>6`S5S=vb}#raq?T20hTa)REip-DNa+$88t0ym%pOszs~3(GS-? z9SJ>bhf9rhG)_=Q^}+=uxQu8gptRE1TUyS0S2kM?avwMr!Q;G*;}A8#r0M@=xp>4{mR ze&GjUjbOZL>~Bgx+XB8OIm;rZ3ldZa`(iHgvcLv6wty$_PtK+tO?pkFQ!s{#M(~P^ zITY8_%gu;yYh|@dsnJa0vb(ss2}3~TO;%m= z$-H+x4lA-oub2;UuNrtFAtvM6a6);i*4V&P14kbtFUTojLKXv*Lr?XEm&YgW{Mte& zhlUZxlwc)=O|<-7(~LXATgU)u&>c+jG9nf-uY4AN_*6sL<`>MXLhY3XLk(Pb7hb&= znzcpm%?Eiw7zso;R5VBWyRgSr&I?@^>I$&Fh&i$LdrzA9{*y}gzA#gG)V~0?A#H@p z*!c9$M|l=u2PMONou*n6XHf~vwHefld1gGSZ7590*POq=(5Yj`LI9)wuEJKIr%Ihq zelnBUA@#EED&jrvTE5&5tnyIH4S_&-n^w)PWHY&-h}6L--H*E4aAT!3Yaiw>j9fVR zCqM7EyYKcV4C%km6ltaT%|WcTDsO5}ggf@~hx%OEw4lZX^C-(4OkO!0LWhW3sB{Q2 zQ{y~I`XDy||K0!kr?X%d&wg}^UYKPBYt0vz-DvB)t1V zg=Bwi9#W;*`^$v~OekH=A^S^Dr7zk@aFv8#hT+A4B`H)w zj=lcP{L|HJ(wM5Fzm^I)1o>SuG+AKFFx=v^S?3>#kEEAwdM%gY^h+i1HoI^?Oj;M0 zedTh6ObgUtm@Wnq2zfiI<}LVTuvYWXU41|NjygS~vs(YGe4;0KnIBjdw}&8;T0+?n zYPiIXqJkb6WX-qkLUKY)#W^X0UA(=6B9U0+yyX*9_c2|KHu89OX`6hhpf@EGOQCl} z_gqFW%Xb8iY}KP0GoSPanGsu@yD zMHo!XXJTI_vfbKzWN~YACi^TOK=hJ65D}J{$)_=9vuIEf?$%5|Er$gD)J+^Dg6?*q zD0qIII6p%(>relV@O)J-;@Ofw1$k3VqvLJbo&f=VaXAh={%YLKxQk}c;;!giah53J zqJa6}V2;3Oh(I-w6}w{mobaiLKGmo1da6w@?^I+T15(Q53ntJilHyXt4C^qr1u=Yh z+iUm~_OgGh#bfl^Fwi!PO_w;iLuM}gTk8;SQ+&pW}w zq1BQ*JT0T!snY<&s!S*6dcuZ5xYkrN2(`>777I46^?Xnf%UEjMpp{sk%Ji%T-P85* zXN9_~7Jmma%j{Ac1eBUK3UB=BHy0PUHFhp&bwAMEqr#W<`s54JCh zFJX>)NdCN?rF$A9KVJ4=C6hRr zIMJKOS}UP+(Vz?d!_q(5hzz3owUex{6|ZjY{pVJo!jA5Kw`zb?*jB%LG^0MF9{w>f z^Uo9ImO@#HHb&?eQ?jIp25p8v`Bq^|TA4BIk_&Qf_d`ZviDCM06f?>lla31hJUtk{ zvL66-LEI5$5Q*xQ2rtR+UlLQPpG(Ewz^YTP0;IR)lT=TM!f3(pNz=~Mjsje6guTA$ zmNZEtc)v-8s8FZkO4X6KrY2AqQrsmDDo@%|gv2=dMF*!ioq4_s8BlR@Z$)l1JP$#b z;&Lj=Jy6Y^_4S&S%*1NPR?w1Z>nYDqzp^aoYndzHnB@nvnxXzq_%lP`c#0h0>(?jy zfv@A)LNA0zu+fm?kQ-ci+Z;EmO6fglHSuX;fDF+uX;@H7{wHE zGz+f`<)F`^-z@BWOaoyI@E60LJ0S7&PBO6%I5s9iiKLL~YCS;;Z0)aEHK=7C zTj|RmXF)C#o2X3h6#A#RVlQr}Ee&6YL zBgwDTZ(J@*FpP>TG7Dzhh!+$|Ta+52N?jVD%P`1acHAp=iuE9<-Mh`SeVo(FB~l?8 zzA%@Wl2KTs*?!9@g8lS6e;&5`iy5G8uti|ZsU{{yEDPh@pcoB>cl*{Bb}XB8G2mDp zlnJNKDb`rBX=XC9Q^b+6Tp0^|^{n%o5A5DPIa#W#v^Vq+TtfPV{w!T!i-?&eh$*AQ z^BT#UHEk#t{RO^Esmlho9-zwIOLP`4_*Q>>Oq3Md=@bpOf@nYzYOO2uPezB zCT($UOY!Iip=gfQBpPuX?xUd6&8*l=ONEt=1Q|ZYyZ9UF)^+`}56m@{rWoi3xl!k? zmmL&!TgK}nEX3&PXg?EU2b@p3-zkuvjcKC`q)yLNiqxE|7XPWo=O<kvw8ZJK6;w;Sb~TM~3<_`On8l_txbU!ta!pRm0lY9pf@Nqh{NBhVWx_%x}w zCfu15Tu<b-{E+9woY&r4?r1F#$!SrwYag&Lo2Zjt6R&!-Ns+2U99OV{Sk;jQ|#sxk( z|Frkvxv?$@JkOCeMq$^L*v1}cecXl$2PSfelj&L+0gjtwubdaXdqxXkG(T8`@VVjJb=bq-@BrY!y=X$ zjx`=ZFMP1TAtpqg|Gx06l8jC8+P6Vcy?M8?vfl?$mtUk1T(9VUVzgyk6lo+94DFah zi3IdueC=sdJfT0>vvBz=i>X3Gv$rNCpQ*m8zT}Sp`WKVKi@p_bEE8Bk+Mt8ieA%hw z_Ux@t5vCrovZLmT+OFVB{*izyG_iejl14e_ZN76h0^%5&!h^`UP;WtGedf`AjRlQ+ z@V+lg)|^&Gt+6+nvc5~asG|~3wB4yAe#*tMFLmGAwE5g^uwMeNYjc01Y=Pz0x=el3 zt@XBY0O8wuhu2>1(IHtdo}%je*umU3hjH!Mq<;bIG5l`w)w(wf^d@kgA{j6CZ)MEC z@t2Y}jzAg$=KVd`-Jzm?=*1fy46mtVN>WNq4pX*%?heJ4msTU44t^O#Q=f!6rSt-e z35|o6wA|W=UcBQPz9T4=L$Q96aSsupR<HRM%ghd@)H&X+jUp~Pit7yy9E*emSoVsx3*4;9g7_D| z=uk7+(0)so()fO)fp7LYbUn?>nHh4?lM)= z!XY4FGRI?>9)o8;h!{@dy5)c1a!QO|6ho=H3EE08^q7%8wZ$Teln-nB3%H1VDlVyx zqd7xyNMS+S*xIyEiFA-A1H_-6LTBGq*=Vf;eObFSkGnaR-QE-vKUc@;l4ebiRM)kF zTcYt7j66g;LM(p5R(joIrnC4Mn{78KOB3M`Y!Cz#2rxI~-MytIMa^yr4AaK(!K|*8k@7kZ6F6Q^5=U*eI`HO?{wy_0QyBXT$oX$Pzemf> zA?7o*x#Uz*Mq>UT5_E9{KEAC#X1|(^Aj~O`A?SsOYYB~~#V6JT*JiPE3G_j^Qhp;I z_aB1=kSFN#H^zQ8P}ZY#bsO6AB%pL;+#goO5kDlG^H+Sjr4c+1oQ4e&%9x>

?tJ z+0c1eD<6W%B=B*pA0mcHur{m96yrxvaCK_dp=;}{cw45oAtDlpESc(xsmd}<_!$dJ z+ZnN(t`wieT9sBfHl zdR=^mRFZD$iniDDat?gap=KUlqCvoW_`SF02is#5B){)x@!S2V-VCA~`z-tO9TOJK zmUOR_8&~3K?ZIrnyL^Apd)#>jGS_%*Z(GF8PINjtjp5+h&EXMGACyFdBvar-7bc}8 z<^~OQ${`O84dhv3x!34`H)5LcV>xsSd&5CG_g6ayTYiiRM zmsUO;=>o;64+%ZkM-i3jLzWr4~|9r%}P%P5K)7V2q)Y zruH4T{(-_{RPsEO=4QuP6xbGXKl()C9Tk6*KuKvn$lGj+v>vx?gw{WHodI{soz#r| zn>X@Dh<|5UvcfN$v;_zKIOj0nMuYVJsWb<4aNv|Nj1H%0mpdoouT^qznHRxNhloUo zRQK`BIy7;1P<+hU*U48%jtF<|&H4^y&wJ*>A9)0D55e?S2qjm75@k8fKN8SM>Tdz`NBELEPth5q!vSl8 z#P z@Hq$3c^J*`OZ-BqPN%w}iFRV7T(mQt%n#^`^Q!N2mkx1+H_9_yA|hdMFQv8UH@GNZ zg{SFN9Q4GwLt+m-7JU%q7Tw&$Eln9{^Cwys(07WS+=0g6X-e%r7pl|@`eCuE_}7Tc zx?==;fq&znfBu}U9(7GSIxq-Tr|VL~T!4k!{OJ*FmQB|_Z%6=Pi46Vle9J&q_dJ`{fkNJ*nqp-G>QqL~c=E)T(np>Yg97o3*6@w<&y)4Iwc|->k zLNTN8_sG5NbYhg_C9W!KM=(Do{RLDq7GRp~9G2&8531*+HQah_qT<`kTM1gx4u}Vc zh3itSV4EuX1L-2+B2cH{>Mdo^I0Xg8C7Bjmnd9D{)rYfZ3jR@tf-3}-z>%?mY(7T9TltPr zoCeHW7KTeN@>?Du!8J9iTFsjk8Xf*yp?vGf=>$kjXK~9N6rKWs#5XvSkmcan^5F-Ubh%O62!o?Qv9^5iVrIrKzJ@Dt%5q*W}v?a16Evd4FA z)#Xbn9305Mti=aYW8PLPj^}bcMcmvMZqyY+K8hcFiat{5I`l|^TmuEfIYKN9#BJJ|mbZ%2^;ifGS zojbu{4V31HXZ+&JpkKB+Y8ej#5J=+jjVvy6?+`6CgJ{15K~mo;70URYfkD{30!MVf z#5m>MUf!E~u0?y;yG-6HYiff>gP)2^O7N7D@epJ1h)x%t_(;+(yebO9?>%bhD5IIE zDZ+hp#G~C7@qdsUZ(VNB1;p+q-eA^_j+L*kBju_ov-of>3P=tb%&antqe}cTLPOZb z@~&DjH-%F!1s@UzN5yApFeJeRAr6P$*3jS4Wp%?nN=vCTaFSsR&)#H;g=!4RCr8Co z!jFOm|rq{g`FAn*B{Uqe09bcyDQ~JrM zuYb;sG6FG0X)xM`&U;(&ay8>4MQ+Vx(=G05+a}+=F98k_ZT1_vENMfrHA26ffWqiesc z&YL=K;~9lIHJ3ToAQG=XYHAX>Pk%VAV#EqH&gsxdlD2GG7YJcDgG(h|%3;bM9a?B= zn_h%I;1qy1l}k~^xq+_p&rJDmiJ;_|9cR?WNXW?$xT<4>D#xeWgTcP2Vh<><*td

(G>S+bOqxy#Cz%EDTE05yCVNuu9Z4fMllwy@e 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

K&aAou>UFLq24PfXPE+xB!wDu&Ni|{E6#} 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≪>&_K2(xoPpC#B5_f!RW!UsT z56LH+=7Nw}h!hvBm5?_P#r*vtkD<-F{kmH@W)jNF z&>uJap=$iYF0C3gm!qJ^bR_c=BEtP^@uZlo&|G1hQ? zidjKa0{c@D-{QV{abGzH2EjZ=shaXfj|^(jmwzCZBYkXgM{`7r{%Cs+th{1mVVgYn z`%YuhGc@=W;t-}>pdbL3*um^J@;>6EuS5Ecw+xRV|x(!kb6RCxjgl!(#7 z2WVWLO`7L-YP$6Mj;0AFYg6FJll~%vX!>?ESwW+P^3?e;$H<+ik+^-=wLoG$x?^?c z3S^Qo2RV7qp<}c-uzfp|E3jRHGF3{D^~fb_jzGVY)l`h%0zuT>X3u6|_&-OL0~eY> zlBJZCBFQQO1@_xruiV!srDAK&I3mvMPDYg4lu=8KG*IO6EXmKAC)z7%?f@!(JXc}S zP)*!Bg5ZqDns1x*IL1hW4>bgvB%zK@`XIH%8+M4Cv@$>t_BXY|#98<>)PN4I_|`}D2Fz?KbS zPz{3>R&r*`qQqpGBz(UtY!c=ql(MPfLL+F^)2{3ERGKMGm0=TRh+mv~VWaT)TDAQ}xp12F#pwR;|V zxw5x&3kOxZXbEY>ESu+G?Z$d}0M=-CWmR zpAVEpELkZAMnBX;go0S7lVYe)fL7vfhAIFc@z`}w)JW?rft5$?0q{n)*uF0MAYf>l zWLXS8%vAvmiZoePfdky}(HccYmH%-*`GtC+GtrvS${UH z`1^F$yH_5jSaw)R(qd|JymrZr%C3G6gowZKNu=uopZ$5S)xjYT!Qh2 z2YhY%n~N#z%D^7vALMkZlx_K)xu^xK55#Sz5rd{<11m)e6B#nKi2W@0e+8L%KK!2D zSTJ7+Ig`~w>_{G8K9j!>YELeeqxB1XE&l-hU+gp)NHIO3G7pgX zUGd+PQIViVJYF*rR5;>8jeNb-*7(Mb;U&%ovW_7op)M+zq{+v> zr**q^M<9aT*dJ8^@x@m z2E5~~OG3u+2DOz6WB&ka#gHQcfB_udTiP+OIU|BBSs$LML7$99O>I=s1f2fj#$ya` z4MPT(CY!rpmRDaWnmGHnwJ5){-tO#=eumAbnaimAZ2thc=i>u-4ptK*%k=6PJZ&IC zRBdJ~P;yBN$i6oZZkK6NE-)jHS%dUC zoY{}`RYcC8=DX+fTy0H)ZL!K~%rAVXSGn59Y=( zyxAMgNGFOy5+YG{slV|gpH*4fdFQIHBpHQUQ}vA3ugYO3gS?5K9LXdIBv6w|zKK?k zqz_*vA?-1Y;>XNv+$v0BnBW9Sy`99&yWV z=1^g35$Kpv$%_=36GOWlU0#tww$-p`cUHgOk9(*%nOG3p+6k*<$$^uTB9-a zvYS5ukS$L)@H_Ndp)-^k$6SbKg#1G;tEZSBFC~%^XJw6s@`1a6c{C_lpijrRAcJNm z_9}2aBYbZb=Fc2QD9av3GKnFSC!o71^#SZ^jZp=H^y=1j#BC+5)+okWW=^B3N4ee{ zcamf~C2iz@lpl@|HJ?r2za0xKV129Lie}NG!NbTtRy)MI8S&!)m>7C)&lE|bKkXd+ zg4;>C#4&IWV&v|RsLPA2eaCN7$q1!MmJ4e0P{O_0+x zIQ1gQA}W*R@w9FP4Z~}4KR+j>0NhiqdS-Wv;QSpsAv2l`cGV}mX!0i<&mXu!WGaxp z=J_BVZ=yf`(Ut6j-_CjAjRs8z!{;6F;(2ECXAv^9Ja5Lw-cQFL6l?e8yR#cni$3ee zq*TqqGtNWOqh{lUpMXVkwR`hBaZ1UF(U zJ&JBS@8=!jHfCDtK60);JIf-hqD{)n+^}xq?19Js03A3do@93@s^%T0j9eyYzgllG zw`_B{?0cykUfxOko~dF(Q*k({jXYAdk&CoxlqQ1e(}bMrsGGJnGnY-%3EvWtYgv?atFN& zzn*>i?U@WDwKX2LlT(>|KMXlj%RAhK$CDzt-3TJd72MJ1_v*U_44=Jbz<_Job7T}} zTykzQ8+jr_y4aQblmJbGUH<^ugjlFih`5p|Vb0ZOfWazdWA1q&fp-)uR{Ot_zdibn zsuD0Jm1DGL5!PH@RPyABi4w@0S~3Te0)hw}n-yGtir61K1%O0L=}~d;=0f1)OXj2f zVtq(50qJ7Es)gdLiwt?>`;LK9M4;614@p0$MIv~ivLSbp7ggViI8|O$tF`yCeS=Uw z{V6NJjJCvynDKrdG?8M%G{qH)h}O$vFE_iMZo#i>HO*Yu$2x3!LgSwwIs=sRG;-vi zXv+>6w;Q@6XE$BAQC%7bn5vAcwhsoohpB0vNO>961TrBaKQWf6!EO&cRfA*r>68w$ zm@pvJq{cDU`3XZe14CdpU2-WE-pmzyiY7qnbARX zV(O%+B+`!D56@gwQMluF>`ZYqwa&pRtdq|Y$j=xXS~gM$0Q+!9Jf1l3&=8 zG*{#IJka>-l%M*J-=}bzO^B1{OsbA#5Hx}6!~``n6Wpzn%@gT7eA(1yq!Uo$#Gd~E zg<+3ZcS$9lRf3vH4T1q`HP{Qf?{&`|XDE723GEHEgN)DGkA))Acm`)WXY~I76HdvJb1`gq*vBi(cgG@9s&U-%)qdN#>^cEYUM2N48J2*_;%%pC zIP0Y1W6v8$G(|!)eYrl4RFZu)=_0%S-4n%=a5E6t#6sR0D~_^0BV&b%DJ4my4q{E9 z*xG2VUhn-)@H*|s%2*J1?7;OV$J8{XhG?V_w8mdBMk;_%s@2$n+yUSC>fjoynZs>; z+;p2~=@6&T#ROm^jF8A0U9_8&8gq0&_xR?oqyofp%r5&q{vbN9hw4H^&hePLiDVBTzS_SUI%84oMfqMnnt?s$0LiOz~g{= zZIpA?QpsE%`^yqAon(eMRz@u*~=h!qzMZ>suSWy^se z00xc4Z&E-nx3=S8k7_5q9*tiyjQ0yeiwr?3#T4wyQb`s<$WRL;i@n^b(V#6Vu9$ZL{M6? z>Mx`Q096y}u0Mc%k%0o?t2l~c@oXc*(c?jnK18sd706OnsM+qk&2Uue={L43c-W2Zxp zits~|3`;IVL0uX(JIG>o0C)hX1Xuq6VbU^Y&SqsTMv0^Qer`LN#<}6)1`_R6-64ef z(RaucwYRYD2>xo1U8YMDb3UqUV;5g3964o(ERn^#%XL*0*K`RCN&Szt z_1cbXX{oD&-4Aqi802?}wB}6=zMVVx23UGSI z4%P1gql&*S{?V?ZB<$;pi!5n^QcQF#q?MIR5Ca}a{D0ehHo^uBL~*ndGtA4yMX`KR zrZ$2U!$2nT>(a$Y+6Qf+U2OZFYo4I{iQDJ*n!S@~O~l_l{iZsckbxw5WIkNzu^p1B zS%}`{yY}?4vDgqO-34F^Q8Ce&C}kM$5KRM6$MBbj<-$nYAs=*7$t#5-H{1r(c6R~C zZ*Y5c+xCnZL!{d72|4>fGCWTnx2{UDw0PJt$k@w}w3Gr+Ad9{`pPL^21=n)aF>{~T zHtCJoJ(z!r{MfZkF&Rvcl@hz{?<0f?X!{ZRf1X%ZzeKYdAo;=UzR$aG2ZQ#V=veE5 z>5^cSp-4>8xdEeNHq;8h@I6iQM!#;GLGdB&dRs|QbJOV+c$!AX&c~U|aKet*u&Gc2 z!rL176eJ*!SQ`y|bJLm_5j1pI_2)P1_<>;NX60*GQsBwu!WH78KtPs+JF(-9x7)Zq z{qrl3-vd1zZ5VhkMs@wQ8UV`iveSYwS(IL^|e4K<; z$;fdW>VtYYZNzzdP1qG+@-Dv}A+=q<2~nuJq%iq?hgb%t&7Qdn3d6e<+{lv?Qh*2m zKXQJ~0ioKszOz10hHX@$D;FJU5M$u@b?23#hD?xgNJzsbG4jnDG{&lp{!cg4s0PTH zwH3~(QNYjMEC9wpIlmfolVhU{_@NQS9E~G=uC~g-edusFJYR2qm;+{~T|Q6u)@wiX z%_7ffj0NIA(zFTyc#)`X-PqM0K1l11mjH1n-qH#MooPBADAiCBp=D*3IUH`=<$wZ_ z#ehdY1pE%Umo?`baVdyacZ6WnBE*GWqs3+2C`#UHt$DC$9u1F3=}HoA1!^Q7vkia2 z5gjWYOl)YS$IaR;m(+`VitJ5)wLmE}x z>I1RlmcA>VxSKU!DONyjfjR5n-X_h{k^E;le=<1o(`>$%SmhfD45VMHo=0!}`fbLu z2BI(mxw$*xrhPkJ3j#C{#P1G4^T(N%jUtf1U!sS%!&gPfsmr3^TXD^KPpv#dPl@t! zJdC85YGX*JaUwMYr5<=;UHK}0dH^u-OrdvL@m&7^ADR11&>@0mVL4TuQcRH`+^@I` z7h-^7d-6B{@zJkdBQPyv*ANdAYRjd*J3$k?5XQDvL2<{tFguR~fC%Tf1LL9b5}JA@ zh$k^0pN*|&O{-yp8}4Ww{Feey)(wjn+zx&?uASe*x1>;;Xg@W~_eRCX(pwWH+8Gxv zMUrR~kx>^#b^`m34SwU=x(80=^`5~~)6dSJxw=z9HcU`tM)I>p!BMuTj4K_+#qh-N zc{kj4=}p#5u9J)tp8NYwAQ^f3v`;d{CLHCWAVwJpEVan{TatG0pxCZDi7ZWYmK9YS zuAQf23<>w@%T{Rf6s|C1JbhO#OtO&63POq|W-*Z%Jh52~ zkn9OjRcCL#bqh!GtjWLoV!lB^AA;1jaH)k4VaXP*7Ka0&4aBH&WrF*o>#IQq{6L;!ul0|My z8a|PJpPqVR-Wmou(jfZAx>(0a<`P9P{T5}7pO7d3_A7zy`wz!YV2&aZK@?_*sV*p( z$Rm+#QbcRZzJF>Q*}s$T$5z?FZz2Vor-6kbjf*a9LPn6P>~lZ>F8fu24T3nnI-cBI zs5uwXNa|u79TUxg%d@k&r7Yl<3S?V0C|`f)zesonXw%DWfZ+H>N%dTb-cPCeg}EjR zwn}2uXdY?1{`K#DB{wEFgkf>t5w1R#=>$9~q@7jdx}<&?+H$605MBxZGh?WH6D zEss2gv40oRQ6{2|gT+vc-5kR@NM?_FDvFH>-b$zh8~*_C*G)vlRvu6-8z&zpPM%*m zTXc^qd47=z4himgG%SwYh4axM0zr&U?9}HAC1lqdHYuS*g`5|WHafN0eYZrBT%Uh> z=mHEZv;vVd&ebMZq!qZTsuH&uU~QPyaaDiF;0owH(4!eB9LBgMA0}BR&5B8v^_5VS z0PZ~906-re^<$QFdLn28(m@VUtf|YQkMGh+K+UNntQrLHKG+?MJiQYy8S-MnG36-RVFwTtL zQB|rtn#Bt@{{WL+P^EQ&O`i~pblp&AJo7=8kYt6}(v8l9v7`iD9tVGGp?w{|CeNP>c#lkSL+D$H8xf%&ngCN?0Ov89INjwE&IUc|R@6jfX zB*5Huf@hv2g|)mGAc|OwsX6mt1Jxg;Sg1cF`~Gi>9Z`pr2>IRT7N(Dp44JrDkicZe zWjo_L3aLPL?NC&m)%I2{J#_|W)<5!i@3R}~n9*m< z^G{5{f<-iZNsh;9rupx8cj_HQ*o(0OH?PJ^!>CKD>axp;l{|RS&@Qo%8N=`^xZ!yh z@za~C6H2H8+6DcN3>ozdRY?;!B1Z&?cPX{tD_swBv~l0H^%HrOpujMTbEJn!(xJ>* zvNIx2Bq543xPS+umWV#3`S<7H+QEzzKguKe4MQFwDJqbi=vRBUn9b=`*>t17KRp&b zWeXv}Fo%S$Qo#!2xDCE&er=E#;- zfGUASR@?9X=cTxoN#=ap!&6J8t~xZ$1euOtN|n5^yKyW@$m@=)50ufTrV9~V z$Dh-@{{X7hGO`>lRBy5tcqsX6+%@yqsqO8+_p`gCma4wn2Z-Cm88P8cjM;KFOtBPH zDE_8YYa9yNzyr@2`fE92L`2biE>_vQaY6MJd%-VEu z`M=sNn@o=%P>nF9ThEQ39hySH-rLv6J5`7y{{W7|rBnwjIhuX*1g04TU*qXI)H9|! zwAeUUiwsK&v}8Wzgb-MZHDIyt!Q=g#P%{c5CW{K*Ke)}bj875iZ<+c5^8D3~l<7y~j~y1lN?No~hF{M0els6-(hbC(4*f0c_ae*%AU-o@H49VmtBxZ^r`q z%c-DS0&D*O?mA=B7mtL)PtXP)6nMf+ZGt&OKCRzURIp-L_Ty>i-hS+?660UC! zVCtDTSou#5Q2j{mU_VvP`=UL`Q-1ZgwRGoCaHuqO+f3NReJ6(#J3z_Dk-@}r9}YsQ zs=l=Z52fp0ej3vA^!CY_a#|d8CM6EX>ZI-g_N}Tr z_p$HPwN%l>+3fnhD*M574KjS3Ej<|F!5or_wyF}*sAXXq{{Y=e+;RyfkGD#e4Us$A z^#LqEzMtG5#~Rigj|MJgLSd##0<$D)=@$1!@~B?YQ0_k5ma#;2#FE(+b2_5|xiVD$ z01_h~NPMk-Cmg}_xKRzSZVR^LDx-?yWfD7f9>=0slRYgxP2a5d-x95L9DOeeNT7L{ zAr%>SEb)@NocW!>`?$VIJp~kMJux<8Ejm$?sNu^7X5>U3V-+Aq;E++Pfx?~#b4R`O z!CJ8~4Ri#9-{L*V@fedHOsJ(1G0Sa>E6{YZ#d+X05m#IquAQ4`l3gOqE6Y9inASZ_ zW6Yl>Kc`_5qedj*WL2?h7r9z1XO3&%s%bDBiJw-;_hXm_chl&qxsVVWA|{zZQboHt zAcMt%Pbcw2^tzw}iCqV0@HRiHlh`>@9I=m%u3?ojE;Qjv5o`%#!4>R1`K~V_A-faP zXBV}(jkM^ZW_V=Zk&Gy&_FvH|XscZsuz!GWrqf!%lV@OTVERuqZ8|**P|M1Jqm`Z% z@{EA8y9OlCzj~_te#feUK{Gz5iA8len&5b_>N31+%W|x8LolCXP3B43s<z@fH>3~Y)gp13)x>l;~Ug4rL$)5Lm&QLY}2sI$n6zsfJPsW-V@yAPf{ ztM}`OssbjG-tAr>TAnmhs5u8Uln=Vn<#v&+%|7QX6ouHzUulomMMJ3ez6t!3{FT&es*!yaQ)j=-KVQxU zCMxijc2$+?wzDYptq=SW#s1^2#nhTTb9mw>@s^628h#v18_bI!MdYlMp{N69sEeak zYj^vf5}G5K+CJ1gPEXDOr)b!5NskH$aMw_pJ?0bt0AA@2ANe=j-xbo z$rDm)owjpxEn7uRUs0vT^8~PY?TkqC@lNrviR{(~+)dC2*xw8a0zn8Q7U>Mrx67<4 zf_T*)QrM)bBE(cUaX_0Ove@Kuyz(fIAuiiM@d>|;Un^M3#>-4ZOys;rn)bP4!xL9j zz!F0CG%KnzUI@&NmYUEVBP}~xow8Annv0GMXe4gr61K#OKZDOb`*qhsa{)vMK+`0b zO_pWKGeX~}ixQAbhx`rhuTs};_w#*q3#rSh2`of;s6zxT9z2NnlEW&?BF5X~B#vnD z!D_zWJqze!qhPR}N2KF@GR-Z^BZg>70zF%g=@uTsz_Z66!E`muM$~Qq@6I&E$;a35 zi&)1VZpj`%thZjFX8Y0Z1yJbnamkY0N3WOp3dC4(@j|joA2JUvJKTT|OA@!Xz(4-z z?c1gVff1U?xUW74UrLHNm6hR@AXabz#tI3#yFC2WiZ{}hp^+*Nip&-aH_oGy&5sdP zQ5(cU*>c6WY6pUEpWu$TgLTq3ysy*Nc)Bsg#bVJrh*{(jZ6j;$0b6kAvi|=7Jt0vY z8zc_I4_@&GKBKR}9MYKFxW|RsGNI1fDo++{063$!`Rb$^xxfG{&ogipk`TUH2txTx zS9hLn$qhpJqs?~W`kOr(A~LpYLvZmvvKZl#M0}QvSUZEmXVpaeZTaK5?bQ_72BevQ zzbJl0i1Nh47a3a?ZVLJme@7vK0Fk?oV@KfEO}g>6C^d`c?E&#DQ)1}RDm+fe6K|I> zJdi*n1H*7f?O&dO;)sPJAS%ih4pnawJKhGD(@JX{(2sA81^Btgp z*CI6#?*(V#iUsvp>^All+yY7KnejkGLy|$9L`T&tx<``)#gP;#c5(r;>;;?c>^SRz zv5|od&?2w>Ef5j2rAKw050UQej*Wfgs_ivIxb)2l_)HaA4t)?47^&muz2nJ92F z(5VG`B9MKkUGY{ri;=|8oO6l0XXG*g=1UQlVdcRo+>!zmw$A?6J_%li>Jb34W|$gQ zHXfRoa>iO9H&YS0@d4^W6w^sOp#U#jF<{)vo0PS zaX@5@5}{m>P*Ef?JTV5pWBYVfjZ|6m9r5Tsj>5ln@rQ?ln**| z&W{=-X;A*B*==O{NaXX!em*+Bo0Xshj<7FxC~$t8!d@Q6fIC`Zq#=rLU4$s&`5%++ zLFwC2labD5Z6%>VRY0(Hn2v04xQ+&sStKbT=$3Wu*MqR|397WzC z@oq*xiF~AKTP7gN=!v}zg$uU307>TWkK?3Pvr|yhRYK>8(@M@cx>=q~xS1r}1(2Uo ztGeIjte(_+bm5N%McX)zG=Y!iP->MEIOJZe%5@<$g;)T#W8`fe~ zkC|ldP<=md6nL)Q-5yU9uM_3J+fIP*6ov_~^54gVqzCk=+9T8+y3Yi~SFRS8DtK`J~YPKUn#{9|>0y`gm#PT~D=Ydw!1x92wEsb#+ zcn);K)lwNY%DB=Cump1lFIU)-2Vyz(0B8f#Z)zsyeO*5x{eNavpAO(Rhg%_L5KP;c zqmo`iXcZ|`3eh*u03O{!&m9E1-s|&-;qctLj!X+4D`iQiv7HHKgiZ$*IpfqnZ~eMP z1RI)Fv9$Mcd&HhEJ|EUrASB0Wg0zAn=?c9SB^YtI5J3d?H`8r39aJ2d&Vl1-b-@ed zY9PjIbNQ>h&a!L^%^C_vV_cD3fv;%)ncC!&=a|`Ba13250~lK#ZSoNZ@C}G0P2zk zM13VSLxJ*wq&WH74meq(NTE_+B2T%uGabqgate{h&mHTeZ8G|Jl=sc2t7nt_K>Rs8 zx}K>vG})>qS=r)^6U=?jN?0HC@(-u5Yd-yF(N_I4XS8Z4rYo55Gsi#h^jO|=Wl4|) zxl2f~*?ARx`&$Fe-&JjF0a=+wi#s)O3X3Lh5@2IH$f9YAvs(rm0J{oDG*5Bw+WO)P z03?HK)G!?`RKm%H*|yD&ixH9Azo&R;{f!;py^~{(lnW%+q+__I)#IA^^`9yJsrZ8{ zQ^|p)27Eb?M#3a4RW=0-X!C5tkUjduU9Ni?NP%)@*sB($r)4Bfka1UHuF^dOEfo#l z*j=h zoeDW)XtFZ$Pn7bhA$KdD$~Y#wlkUd4(zYj@{xfx5Z_eW%5$M0(uqJ{fIT;U-@-LXd zRh$b$L(|72+wB)s(O^jevnA~AP!|6HezU(Zv0ymzNxDc^dx(^*dy!m$$Hjf$2lLed zJQ$jTA=GES{u4bTNr%J{;>W2ONGfJ$SEU4&AyecM7jpXxmBL`8>Uq3(U zWsTvlp@wCIJZ+P_xQW9$9q081;kYY$RF9P$and0*QubKx>lsIh1k;%#&Z%;@lQoKo zLhaypE&(R^HcwNgv4}$uIN}i$@xD{y^XPuH%NE>l&;3(VZ3bsJ@99bu=2-UdP%17Fm(%&DvwA3{D zaWo~!$dO{lIPFZyyt@)TR5&Jpv+Z~9)r!_p zHc1>FerQnX_K_%UjwU*brVc;X&aIem=Klb$ulkVMg0wppvtJeY9X^mNnH@_$9w$1E z6loMWgCZ=4F;iJSRF`3trz&fXMe|qNt|7Nj%$Adi3US}_3c>K>=4p$Sj>XKI@+5)H zO2=;QO>jB7LYLeF> zwQVp5e=!?jXfWYtU{A4CG7LypXsHk~?qEBq0>^-t*du=F-AsvL9L`dW;7|~s(@q<7D};Ux-xkbr19@ucj`{W zU`=`eve|-<4aTJzmnGzf9p+_60kSrey;;xrjmkpy91oGwmU0O15F-X`eLg+^05gcZ zEFN`e%!3~tgl{BWvJJD40IpYpSa&=g{Ushp5|5}@5PHg;D@RPIaOXix)3H$@21$V% z*-)FXz6l$03#?FZ9-cmpfsvri14(9&= z{P*cVYs{-;Lommc>{8`=jcx7+s8Kut&qUuy$~u!(bCt@BK#3z0BP%FcEa+Lj z+pgXDKc9}LxX_f?_cg`G#FlX^vck?h#1ok8N6-3CxE3$oy}Dw0#bWjSz@cQ&Gn*MF zh@$PKkcJS_`p5&fw;sg&bur<`^D0X?-85Xq)glcVNht+kisSWF(vy5w775_j9~}@` zj6x`19e*>aVwXo z1RGdPNGvM33PXF}xcKUJWmOGdoaaP=9}gtwFPPCW1tJH`j_!quum{IJp8fhXe^H#p zgKbkBVw{)5bR!F7hCrDWaP2BKf(W8Vetu6!X#`12FW6+s;qqR!00yNEv7e%2NN{U zGUen=wNnlDNQ|7U#Io>I{k^$7ka@b}sc=luv%);*8l-u1q}$5KmmgFlll6z?TondyEEby0>~P~te#vM14} zk1|J$fUPRa<`8+iBX=sd{CD;zrtx%>)KK0N%rjAv4O0cyMyVVUVIZlDfWz+OU3(9- zfzMA&M()Ixo~1V4Yws6*Z;^~+o_{VJ8*F0aI0P*X`@68`)n@k^>^hA!&<=6e?G{br znUhe5O33okMUX`+m1ea~&J#0MdAHGN?HRFQ;D%(&I%$Wv%# zA-UQJRveSf`x@!UJVCmUfg9;it7c=q0Ex0Nk)SND&eF34+$p_*R3I8W8sPPGCvAy~ zSb#}>f7t5?%cy9nG>A;TWN`;#NR=6*-)8s#8{&ob>W#RYGF3)|obj%;JUK97#|G@Y zb1M?Y_5j>jT>a7N5+MsN#l@`vZ|6;l0PS!KhJKf z?Bo{6gWDC9?FReeI}az5mGquT$j!ozSmP{0D(;ZA0yqU}sDG!bE`e6FF?;>MV;|%t z^;OBxO?U! zMuX5Nr>!OSgn#McF(S;CH^b;Mj~w#vz+-#ZQ(?0;|~mI#K`>Wss0T2N2CaR+lmd3|kvAC1)dRR7_l2 z6Lw2jBiK;+Jqx2y;f0POpB2HEsAc&QFw>ez9psdtV94utbbVZLU+O)&D_lycux7e% z^!hyPLtEfhp`JX{}g5mgnH}OU;M7Yy1@{GP~KGap9KsG%m zj&G6jIqHl7dlH4KLV@&;aI^8^#4nfiBTT#mY7NpV%q>$vo8Wx10rXE|!zM;i{w`bkBusUW4MP6hHaKV5ZdHy^4 z%1w7e#?!npkLBc{$MX|$MIkbom-K<)ayjR)uX{ZQDuXA9-p;}GZHFNL0COxoV-H!; zvJ6Achc}V2SDm1#L)&iJuWn8A&{kJlB2!%%H3Hw)^VAuhpQ>ZFT(PuU-l8R=0K|;S zJp}Q#ha{Rm`}CTbJ5S0`Fjd?-9R6n~O~->PGa-ZJ3`+9o6ptfvHSFTS2W{6Jes7?( zt0$@BVe;?yfMED;JYN_L==QL|^BBYpEQH2ER6HvvBoZih9FBniIDUdvHC41d$jLu! z^Z1{&ogQqwOuQpI#+g!ir(h&0D&dtuH?>hn1QJhr;<}kYZ*ly`8p;Z|9ChjG_3J-p zYK`IC4H^hh17eND9>(ldcfN1iqy$`jM^Y(I9LnzryUCOoB6%+x zm{j^eaw&^^Sz-sh_6MG-jntXt>w%rVpS}QtV`b_v={cCwVmix+&5e!K^CN4SfFnJ2(8SnP8-| z_4;~T8%XfH)91@9*@h_j-vn-loRaDBc29DH@2v6->;(`^AcTr6zNjD#yJxg|I; zzSf1+tlQsUzt1E0>4+DYyW0o8&)RD)B+8f=c=E%Q`g4$hM-scRu7B-70q=eN$4^3l zlPsl~kEhcg$(lu{&;7;-gi=ourT(!D*$P2m02~o~4tV4ro`Wo9)ENgKy!T7OT&-sr zkyuHF7k`!q2<5CZS0JhF$A0zFSR%~33QB2boh%y1g0Y}=Wr`+gWIJw?U{(VAjs=1E zs_B%1DyN!?MzJ9JedH7AF>BLGWRh}`i6Pzp0PQ_L={!~6xaP;tN@(JGVa}gD+$}sd z>4oR{6336ZB@q?^CjkK1!0=Bu&%pQSp#!9zp;L5h&9StZaok(88R^P7`qHd5~IZYklRg)0Bsk1`+z=r;-;iE*=!E6 z4zuA%a5EAR78YMjVMA=%?ah$Atnz({B>eQs2Lfsuwm0;i!KXzu5Y3My1*pR9KoZxq zf%4tJBjk5IbWOxw>Bgxv@IjRC<|NJ~+@?EVNC1KOpwtIH?aCZ=g%NBHXSm)QiVPf7 za9MIEF3wF4Fzup90P)B@?z*Rh3q6UOQ&-2~5R6BU3n_f_EUzh5NeK?X@OLi+08joq z^vkPUW^-wfC`T`mfrh4Y8^ex`9EQ}SwiSE7@m1NX{%gJR{;H8}CO#YUnRt<8#>R^% zBx+*cI|oaM8fL2Y^;oN;#}{2Wd_akvzbPu(Mk7rG5ycTAMgaK=1Y`>h5u#oO(-pFNte&l=AH@Ce21We^fIG$=ciY5VuW#$}n zFjrs`hM;~;5nu0p0zd{?bnMtMd*rlwru>Apk{1L4b2Pq|wiR_-X#U@hraa84(-lL{ z?HG7}OpWIg5sZ?<8JWIFxHm;?L9C0|rc=IRD!pK~@lrF$H z^3;QC9dI}mx1W2XeL16nn1cW|CmI4|K0c(F@kUjp8AzMWlVC7o+ztTXe2;KSAhF@% zS5T;69OsDJB6%Jb6Q(i2$$u^6iCFn1R{ih%gfd}86ir?K0RB1*Xi$%!Lmv@} z;L46XI5Vd^ro)+%wwnOiLOABCto;5cE&#afH!;&4V*K1@b0nxrV#v(XAy7iBXaNG~ z(Z1lHer~!)BBP@LRsH65rsvC#hS4mMW=5-E-4M1|qj6{1Z-dXh^cAs)+Nw7LG4T$q zCZVaiMH<02N|07Dv?_^JWI{jINelS|o9d&?NGkgWb7!S@_cJvAsJ zGHzM73a&qR_ZMB0RluLfmuzL^^2?2?b}I(si~9`{IkEB61qT8lV5dFjyNLB&X`sYu z)=87~%#%kVk+^we55?bLeg6R4sk3dnmt7#>D3Tf{k8$-}!;!hxS!76zhaAyHBp!Q{ z!8{Lcv$N-MGft+N)9?vZr1+jFnru&7PQpL=0>;tt)ZC2R(nis{nfSzY za~ipjDKa+Ubtk2$S?t2E{{W-sp?S<>Lmo=FQ!U$&DKnno9 z0qifP8iaES=!@K^k69-IvpmDAS?f$$To z4+ORkiW@J@lJJntZ{Ume8mc6lbpL1m?J1V!Lq8#JAqq%ei&W|cd@?Io)S()8qQjqOtB~*cA0K<+ucI%r^pAqXb4K@7(AP=lnRx$k@)kfr8n_Eu24I*Ic<(KdFWB+=BGWK2aOo#6-Mx8SDJU-Wh-$Gcgk#Ok2uAAO)dOv859*}-pLU*L0Tf2j}>*r`}YE?5~SlF86Bu<8dkri zNg&1gzcpRpfd2rDUk$qbV;v8)nBAe2)mqRZKd zENtEIJNM`TMsYaIQ<j~x3Bs7)^tZ>71iW||j4H!c>o0UEaxL!Th zi2#4OmRazYX01zV`R~Lo;eh@6I=|(An zOg})FMk6O{BNb2^{{T0y@rlN1Qz7*!BlDdUm4)Lj zt`wer0KVYpUj#;Y(AK_tQEPQN(Jh@5sM7vlm zt?)T-U`erk`jK$Wx6XFHn9~c_6-Gv6OKf7c3c-ZeFGGo5iXWGppI48HL`fG|kz532gW;U=unKe?;XOA~c zhaE8ESxhYxPDzc`_+L_eK1ic;l?)EfMnOBJ3T%{b^>Ru4?mZQ6DB7A-z8;+=?vbw~x_r4=9zy1M zOc9uv(dDLA3t$211P1m5ac8bltm5aB?FztbQS0)-{rQnPZmFnbYgrjFuAkePDgLBl-+Z&IorVs)- zF;YdFt@w@Vm0=#JLjokeQR<2R024>vkH<{J*$}A;lznp_4K8|UGaflN?F_`wnv@a& zzBwyj`1k6eSBa479(bvqmFdsPl4zHKBi(_Ffx55Xp4}nSBxj^^ ztfTZCoO(dAW;haK28uI@mLQsDVx{3c(Tvvvby@f)+*d&OFkwax2?HY^m>gQH*tvL^ zuP2xUrRO2Sg#kbXyWb~@_dO$VnO|{A%~oq3aEHoGcLO0$)EVAs5C`QlA!Vgve~Yhg z&s5Trb=bkY$KD{;Rviai#na%8Z(_|NzV9)J+&K2F$_>?lT|TBTvYHy3md~7F;gXq~ zj!?-HM!SCS11jIB5!=&bgI(*tO1`JgD`1_xN2gCsQW+tYU{M@F&zk*^jkY-C3+9Kg z=cNMb;+HBdd5nLt#%H`)l%&nPx_VwCRz-dfH~aM9UId@KC-sPvQpJ-RHDp&=nbu+u z6jI6n=C~q-AJ}xaO;ub2B7NrssCNdQ+@UF-~KBy-&D91a0LKl}9H3aJuK?ZQZS*ATWa*z4x2M($AU zdMoY+VgTcxf63}By=Ki8qg_9_If)!+8IndxL2Ce-k$?)yNZejD-r?xP`czdwVt?f8Gzrm>-U1;6#rt%=`AUP*J81a!`SIWF7ir!yeQIozAWUc_ zk)ezQCu@hIN66%;{CxG=TA;Aa4*8VV_F${D3uBnu#eN*j)->tkX)bxBU=i(9IlO$zxK*uj z(iz+_UE&ti28HMM@B53qEiC$$Oc`mC*wNxH^*pxTR0F$cFh11rJMVT@iU$r8Cy1N ziPCJAid0Empe$;=TpAo&{{V<5jw_`kb(Z&c`b1@@Ygqbzo{WLv$Ay+^bq^~o8wA%1 z2qTZ&{Pn_#oZ!@Pp=yxpnFefJqWKd<;!vajECBqEU^a{6->$GEpH7Bh2gA~7!KYH6 zs4g`lV2p4`RvpNo04LwKew|2zb)IDeS}IL~7ad`lOc57UK!F(Dka(fnf$Tp#Ik6^B zh}<*7*{g}>&cbYX^5i=sprQ?jk=vW(gTNxMqPP}#kO0_TNQ1s%&Bx9S1c;(TvE?Oc zfVQLg3w7|-*D7vnJVz{4?N}nuf`=fiWhQD^nzopvR$a_L?KW%NQL5_tPPw5nYN@=R z^V7eK2g6cBpR2B9n6M~6@uqo!27nWtGw=~Co+OdcWP*b^1j z9Bg>}*x+WDc`v*%RpP~>SMA6YdZ)V#D){SCPpaByaqHjK^D^+}ksgCK8YWMb5=4!R z;GOfhU@rdBr`%n4BflKzq402cl^VK_rQ;dv2zYfTY%}JxpnZfc=VH{`OB(Jdb6)lF z)`imxhRlF{;D9T>W3LlyQ5_2+1Y;m741%a_<$WjHivatR`RQ1N@q8jKosbVA^N?eTRdQWPJa!;~&paQVvYlR+HV;C{!RwQk2kahw<`Sz~1 z=^g$6CyDK7beG=sl3paw5Nnxo<4p-sCPZ+uz{hbrlroOM07DBm&%aNqsH4G=FYJo! zm92x>llr{GWDVk|IJ|{kL430*L3ZJufDuMFD4|`No~%m(u?L$nDQaR~9DP22x<*$>By!u+f<-N!L+yHt&2$fzlCp<;rOnpG)z$Ej7rokVWeAOkG+ikJ5 ziU5vmj-48gBDWK5GsBCArsHEmV-m;df*&^HB!SPx&;Z{jk=XDrm{01I`8gA3CM(B> zFP|)-qG?#gF-^9{B1Y=1)n~Bc_~`}ILV%huFBy1F4Sz$L7~#pqlO`lomI7VF`ni&Y z4&-skzI%1c%%C(V#QqHM1R7puCLTs?j&gzerUa@mVoJFx2GVx5mHGU1<;$GF#A#{T z4ky(Ih9vOjm4J3k2m(xV6_W`Ch!4kdidy}JeAiB^N5#^=&y4Z4J*``Hd7J*BQ0pE} zOmX8vWW&s4o=xgeq8m++4cS^CABz0mv8XT(YD?V;-n{hk@A--G^V=nsRbTlSVr1Lp z1!)o40Imq#OsYuj@JC!*o5UkZ*a4IN&GgMaeO$Y;rK8*`R@{}3%SLMd04>-2S4;0x zXcEt-w2(XMV)&z$M1(}*Iis4|VxEQFyY45svH~R4|p3kf0G>k`Mb=@5DN3Z9K`T(bUxiMltgEMw(8cl`aUMF5=g(PvbazayUB#czrD-eoLB}rf}w;-NJ zP~ZOmBZ*O`XK~5AeY5<@X(hsg#2HAE#R~{a2ESB=l)W1SQxYwEe>ZtuR>&r%w{QHx zs}ns#PQ%r_5uFgogiEM7h7_>d$E_MfxtMza;mKA^`L{{Avk3&BtZ zS^VFjjwg5o$kg&|q8M(ypbh{$lg09SvuXlrX&S0LO&RzxX3*mg=QoxVq|?PH22yDN zWA_pZ2ESorqnh-Y^;t>v`+3JpsL2jWCT2uJ3|Lf36vh%2QiLM=Gg&m4C5p&OmNUtrrg_i5Ay_;tD(5i1a$tF{`~jr8u+t41}cq92Gu+=;$Rkkrg$VfmO3)XtW|;CRyjQJ z*wO8MQILU=2AkQ)nYN)OqX7DW9Ag$)U&{cjKwp+$wYL?=@;mV*0=F1hDAF9C_Isgc z)iYF@2ga@C)vCu`2L}KOxYTSRPv-x<<7SsmXwm+ zfFJ(vK(GG*u<2B>{a&!LqJR|t08y3;WXxX}n3iV8SA>Tn&0@<%XmG-fAJ4x|tnOzNiM>FRhxEayh>THs4GLOEvMR3oZ@2pb=55Bq>V^=F#uVGTp8 ztO>ISeF`ZfY>ab}3hZr$Gi0D(DDl{vKeIQ_PqYl4WWDA>nV!FZb7jOxq-2s6D;$4p z5s$S)`-SCr0MkG$zxLz#qSzLu1!0hT^MK;`YtM>hiDekl+!L_BF%%8X7n`6g3clw1 zbb$x}Mmm7E-W8!}35%%8G1*%kVp&T(B*>wNP#H}I70sSNzsF7mm~}OAo?&|DhTzX= zAMFkxl!PVB#cBIiZjL*lvrS()%O&A zzIp%ymEv&~cg*il!-p-loS>!IJe7=Bnx@LD5%&NXl0Wz9$}k+s*t@PHJxUWk2GnP1 zo;D2I)lez>`LkRQJ^3T!rrbcsF;{3}TZoc>3QMnN1fCoRd zkDjBdH{?e~_f`)}{{UuC=~((?Vt+5r$;QYr@AAD$rKp42*OSTTjxUa+Mrh3%x{PcN zE6%2Aq9#1W##|m|)?%mB03=ezNE>**Yq3AeD6X&_P09dX{b18+SlLq$avv)v41p~B zi|r?N&=mUt+>UIX*VEXqSfa*A#m@0D#1Uo1THpp;6$Qtsp1upm+6 z-u`+cnz`F7WL{=CSeQ7uF=9s1l!idj$gW4MD6-es^JkvM#q_F2NOcLQS~Pl;v6HW17~h`&>!M>9>b;}NrtQl9%AF^*z8T>o_*_}%0K2h5`93N z>UeSC;7hronfI1-NjId*!jxI$^1sL(uDaj={anJV#Q1oC$2|IUgC0Do%RD|&4z=X9 znxo0%Z*%_u*mcNjH_T$HMbx6i5ny5^PZ;)z5$Ch^K=ylV<{9 zroJ<3FhjBwcTPtPqulKv{2p)T{mRmssYVBFn0q^B&y_5aNYQ}mlB1L&jqLAr!TeH= zh1rv1v;ka9a&*}z!GzBcSn^|yk~LqjklTF2$?OTQVtPgfqa%wo(*FRCB#x{7E|L8a zNSN|0L{0jmX{HBi-=)O?L~=P7(K=?aF22w&iQbgcVPHj-3=feOM2&Jth|*nxQGh0_ z(%)*}_8oGO^M_KIkHR&V!gDsDv*hC}4UsAV96ME2M=Xcn17KBH=cgmBOzOh0Z@y+4 zuZP${JZC0BBB6}Lt;{2K?W)7$lfdS{KK&_L$c`8@U3$zly(URCsS*uC9cBve1a3DN z$94n@-N-z9a668XK_-M{Wl?Ml;x7rw29_gdTyo5;N;O$4>i+=JIRp=GK6+M6*_@?# z?9C(oo#5eM%jL%u$r6zwI6ii^~oiFbP7BZd9Ib`R;3? zK#q>vcS9fgV+p0Rp4+e#YH!}e& zK3|f+2BTnK6g^X=0FH&8aHZU$$%w}(U)w!|@yyv&?lqqBp!GhPve{F=gMc(0lY+J1*z&Umxbly!5XtXgn({4P{i#VhhljH_vj;=0y840 zEPMWh0gBz4!*MBd9<(ivS;otj|@`qSdF<^BrQ1u$)a8+)*QSB8WA`gF!&!^IcJj^@TxE zO9{oyI=-)uk06iI@NbMrLo&IHM>`Sepm-vOse1r=v+N^zGd7uJ8*4s)BVuFXT-o7* zNRSCIvMMS6q{}@iu!uv#08;=kX!@SCON5VWORuR?Uz! zZa0we0e+MqQws0!e;sBtPA1(D;FUjL-esWT;_G=Wl(4)hEKIv&l-kC~z%J3iBWe4O zJ6EnIvU)~hO|1GK^x|3cjOKh+##Y9LRe05?VW|X?wl8s3ApZdMdmgEv+2(ov))CYK zF=7Sd9DK+;K{uPaHFjzI-GsDlBCu8q@<2VTa1XKTVG000db0+*pjftk| z*!a0n$1dM5wXi}gvpZD+ZnqzGHQxHoshvn#XE=i^?N_-2ciPl@ zD6Zm^mOy_~qEy9ztde zsN1hGtoj@prbNaJRY_H17K!&rYt+|UKvH@3+f~qEh`MiG^q;<)A|)K|iZV=!@dM=* zK9#;bC4p-kiv0E0pNyh`wuFPnj#%9@l-b$akO3$2+l%T}B?t!Y z4sfEwn-(KHEtM<2Mj(cDLK$E6F8=N~ukr)9=!=HK0z^A6Rm8(p)Mk+$JS>KmMqtc# z?I0qlJ%Uv zI|;KVc1x({;$-8`jQKLkM8KcXi5be(O@*jvUp@SZ!;t#7t$A&pk#ENWr4Y-ikbZt}sEZ*XH>RO1uS<9`e ztGCPOejmJ529uW-n$gDgXpaNi?|(opps`$%fHwLUHd`& z`}M#QG5*2-0MICqK0b6jr|$~*TOVGN1*Q_m6gdRED&b$wE&>WC{Ynq)TdL_HY}A*v zYlRp*{x19L8f56u;_1+3ON|Ns(;e9I^tkIs@VS)9JkN~rBRmo* z1yg@4uS2ztz;ns{x?l-AiND?>YBKabb|SLF2qM_H+F!$QQD@Xv|S^mmFylj=7SE<&!>hz4MI=YT#w z2f6A>;=!6dqfL%Mj`ST^3`RzoF;Qjn%k11KBLp4~Cxh*MxUPDtwr|R0+y4M3C-;=G zV&mh@3uKcc#3OD6`9v1l2etCnLF2bQE;`3Uxou}S+T7aWnH^=sIVj8pm3YFQSl>MD z0>6Hkwr)+3p`bYX`bIcV&7)={!bsLeV($UHk3jr;*(ccYdS+$~n3k-x2hMHb?PnuV z&SuG)H9;c6^z9kjxq|?IB!4t&x}vBjagf&iIOm_lDo$3)f#wS(*{^&Sa&j`hf%naSe@0_a8DO}5$(`x zCNTXsbMt0TB1|9{@}HSVCi7t!vyc)gmS8;FC2olz8V8SV4{nz2xy%Ok z;u(RY&x?kbGQXcBP_&amY#5zDHnm{47I_zI->z$Ju!dXR=TWYYmnPX&K=Yw+@w*-C z$SrCCqTTuYj!$5VAu{2vGYs!C?5KRaR^1z~cuO6srEb^)P2agB zRdq$cqZBweBQT?ex@>cU1{O5>j9|qQsbP?n%Q5bz!0pZRT`*b)q)_%pqz6s$4lb9a z&o|Pu9BB5uNw&+_>@VAJKAIiJOSn|21&9#;01m+hsSZocdsU2bGk%!b6b=xdNV+xd zZ=RD)tlUQ=aUbAg&6$kTx+E;H)P-Mv)c_AX{{YjndE&+Q_Ugcv@tL1+L$!0|>G_;$ zai(5AH<0ni_Kn~%J!$6{*PE|?99&^$6tChsX&NKYW{Q`j2rJ+G<;u~0hg zV8b9yG3IQkqzwa<+9G(`+{dwxB8`8s{{ZdMU!OCw1UFX1O2~Pl$K2{_Kv^6c`%QZm zyFb5H9N0G_zJM`y5~5_ zS64yh`AuuPf_XK!isYUTP+|nChrAg*ocU8lD#fxA%t{anODWu>8@l4h9qRu8H9XZz zH3I`oSu_O83y9e`@J#+-Nr(`zMXTNZJT+M(njbxI6uv1!K_Nyax?Zy+niTnqG>DNg zMf2E}fNUO+1qKy#LHX$E**NPLPyj#>tt&nCNaO`#GmVcMles?a%VeHT-e`6W(~xoq zgUE<3qm?cu8|_?o$yuaXB9xVeQhhs#CbwN5#r`Xx(5T(c1jkR8GF-TQaKREVkf9VI zq~%ur<=k)h_TY4zu~4$8x`yhRabjgO*#&XhNW7TROr8|6Bmx2KYl{R5>C(Z>8!dkE zW`3oGlxEZXxg=H!=^MrYgz^auceD%t0AcUXUBLsH!5X(z_a`+q44k}iGfz9F=_HXx z=*MlUdk{e2jwpV5An!Tm5gm9V~C=tc6OTXR4`Yx)*`oJLYOlzYwxE@qSIAej;j`Jl*8?gb8 z7hU-PP$K%9YPCYSYBGCP8Gl2D#h2-W$+cMep*GFAdvd>VBycQu>Sd^zt4I;yFs4tuvR+W6#^twLntTx|&&o@_I{Y(L8zgXi?{{YPAOT;=9>K__$228t2NlV2g z66<_gjlcs`eMY<2RU){KGoG^R!`gai@XxGEJUDRYzokl@qS5Y&Oo zXN~Oz-M!k2AbdKAzxt!C{XS#^At6{6Ibeo#T027!6+?FQ7XCr@>i+QRD7;SgWnDEP zc{TBpFnEUpRdE&@mvAD*WN62gGOB}MH#Qs&Kkn*kM+R)x(_p)Rs4fnaGRkUltZ6cx ztcu=P0J4A$lj>e?*zwQ?jm6wRDIRIs+!}@!ZcpnwWx$cCejMzBpKbw*f?q^bYR&QW< z;9v2@I5!xmT#1&K4jzvfSaHE@ymujd!l@7Vt3SPp93Iqq>bMJ0s2|f|N32b&NrtO5 zo7DNT1ur1< z!;bw(gM%yp2Qn`g4oychC{2y@Ik>W97!~pY!HS`-nY$|xOMgGOE<2&YEdDxh1YWjzo@r8;wHe_tq;C+4Ng*LtIH6Vt(kxjm@$=6eFFf^yh^rkZ)AikA zEFA$Mk)H?XLYA6T+2yg3nFvw$3N6QO2|a27QFGFK(r?t&@SD5hY2YmVKg8JcK&mld z@}1^=+mbEsu?FycA&CaPhhx&Ci_Rszp>;ItcgTDMVdDfbV`4=F6PJpAFvf&ZqwG7Q zy8tOHYqgKXb;Uz1O6Y18JFgh}VN%XZnn*5$RT`j0> zxrf@Ay=~xUAG9iL2($7N$`G@OWK$U+##eH&aa>sd0!?zmw^bfI2sdr<9zSk^XX1Sw zA<|}CC=Nz60Tvs5#doW*@6P2nN3j5Wblfh}#ELQ9eNKLOn2k2-Pf#IJZ--(l-yh^9bi29`A5S=N%d@YNS)xrNm@Ax1m*>;_7t0I1M)A9-4m!o zcukor43xv4wBJ#DjW%^ulMVi;QB-E!#xAf$^iO|*a9Xv zrd-)0A5jEO%(&xoZhgM|AD#&6M>&>NtXx|J@T7S;ab#|b5_T*EHrso+s`s*M{A#bI zIOpddQ~2Ip$&(A&7m?KU}vijuro@W`x8>G#G#HN2B_cT(5ne06oE7jp)qjm1H~ zgv$apn_ADFSY^bFd1{p@EX}lV2eAO2*W8=xx<{BCjiWv05jIqR+u0r`iDHoqUSS~e zz-_x8piP5)nD^v$++fZCnml|VQ{XIUkQrDP3{{)}t3+=Af(?<_j+L2iDjQqx(iYM# zY|+Ts5h5vQqmYVq91}w5oui-FAKjFjqXS~ZTal1p%yq+NXUZX^Mr1UjhU1Px(EQ&6 zpx%<0{{XSX!VM{oc~cw{#f;4ZM)EXq#z}3Yjzb;vIpdOVuB=yBgwO;{BgK@&#t9-> zvZN$sGWOt)Et9t&>f`P-Z>bV!fh;M2CpFXigX$B*;Osmt&ax{y&H;(0^9Z^OIUo`b zsC-{W_VXx%-j+Yle@Voe)_K*j&_H3tSpNX!_3^lp`6F zw4pspJ-bk_IVAk_jE86!h|I{$!l>8UbF1ml4IPNamSqRcibjwAgBQP1yP_=qE7)H^ zfEK`)LdR1lK3;R22;|i88zHe7JnjBoNJ0xAU{2sa1fJLU>xUOOuvV+%q%in$9ZxeE z-yPAk#~CRLF=*VhWD+^Q^m&6ZEhF8^ENq0ty%CM>e6+Is7bU~wD-7s9@KH<&5^;}K(NgV4w zG%B$I$}j3q!9D8!eto(|Tlh)_@opdFQ$D+mrO6l7$neFn{{TWO2XUeSBh!2XeTn0x zH|L2>n~i~(KDC=P4>n?>ObaxMzyTsyryF_Q$Oq%U2cYVFrziu%6JTVvOl>UBE<8;l z%BalKOUCX2??s6`b6(u^s=>MIDC!p=PctWn7zT_!Lk5d@Whi5Cz}FveyZeWK{5HXO z%sY=QG4OBo7Y9?#&7UJT%gBMs$uh)MC)(S2Q{4?P4o6|_(JG;@gC?vTQe;n{4N9FPXf*1bXQFp5E8-*H|8sB?X%4-X=P}tBr=zM&>|-APj&flnAh^SKJ#v zn&{vd$h;V%#5#o8Qb5>9#d0B*H7h7BAr(NI@5LX*^d0O}sv_24dOohniqYo7wq4F5 z#*K@s01bfKxbJ&zhd<1L#TjQs{{Weejr~W6#{iNEBoR!nx=7?MtI4XrQ2ziRda!I! zlYeF);Ksl4ZYFk`vc#qX)=l5W3h@862*V2inC7NlmT%i_r3))H4aQpYG(a?#S`?*9N0zzs(K0P=hF z#OBOVq;}Bh8PBW#0DKX&LGoHERSy1G%O`Oc{PXeE!vHEkCy}8H$;y*2>mrUHEhCy) z9uYVIcHTk%07xy{j`h^?N5XRHfI%miizio1oVf^b41Qg-s>~WHTB0xb?SJpmljk%d z)(1$7FHvnjCE1c+AtP1unpP~z%un$_NWYFcnqb+Q918fu^!(+_^3fQwFp;1{V5L&U z5ajxe-^j3k9a%^{W+zezA6Umv)A8TKc!M;+52>72sMUZr{IU7uetGH11*p!V8q}Dr zBZ~)BhQyfY5;FT1)@HNnVhw}0jz9+Z>0c(yuH&$eII}%s%*Zsw<5=l+V=`g8yp(C>ydMqjj96T6`P~JpW>W}6r{-0V{w(2!72v+rMu zvTJuyC^tq9LJ~Re1`U|5vd4yG`h}iV;>PKJPlC*QSL{9d&iY^qyP9>qbYE1CU2O);fW^=s#`kU+9;ffxZnNxy#g+m4l!IhIX)SCnU`{{T<%GPH;w z)aI2=1Zvds7D!|&X{(+t_ygbPr`fvib~$Y)kM%jhkcpz-DCP9x)!CGHbinH$q_sJ=O0lca;3SeAd&(6 z{Pi@TK{In}lDkyY%O^pVbe7)^@6(ED8RS+mkU=U1fLMafV)^R9#o3WzSW`35boep# zSf?*6@Dy0yV(i;5up-D&&kc4D=Bc-Mc+Y%AC>YV=S?RidHmUV%=5NCcprV#klX8GT zZ)@OtStsQ62Pcy&rf5?6&pdtM<;%y7*CKDJwep)9OH6kFbGMFu;mNO$bJA&`yOwQJ zg{dZdR1QuIc>v-oCoko+ra^lu$EGmWC^v9BaB9vxjwJL+Ac8YAO-Z~%q2ZVd*~&?oaRRI+@O8LhUpny!?!9QRB-J%Q1&0M!8D)kj9Bbt=j+yQFbg2#`>7@ zmZ>|cYK+b22=UftwuNDGvZ2~Q4ZDTgWb!YO^Vb1UsGLOp7R$-k{7y0Dhfw-_+{{R#CVtpZuabygIT(*)H+zeX{i}Z3xF>nW*=E!5g0l*tc?ce8j zRMt@E!-}3~vR;-*$vUPlE@-FiUlR;GY(Hpyt~l{CW@$JTG*Z6%=8aj`Pq zIHO1oJ4ht-vmdw}zjHMzt^0K9fmAPMBWp8)%06Gur<^NS%owoI z{2sWV-M`8mGFJ4&SDdM-_(C-EQL}O3kz82}6OnKwHM86U^{6t{&j@*tK!r<6FXg?4+F4dgC1 zo+-TuFK-+Z{#{R3*_5FgW1rq%+5M^ahGTV)h@R+pTAzpfIA<{9;z(*tIM?(}`5SXd z-pC<9S{!cV9{phVdYX24;(8CMqphj2Nh7bzr+mSs#Qy+`LrDb7{lf})(FcLMk_ ze*6Cbc(11mE0QEB2p(=FQbn(nzsCcjpoJdPY z^;n_C&E1yQ(pTJAaDORdzfle5awDkPGBAI*ULT5a@w4M!s*+=hKB1mdep8iD2vK|x zc|VW#?|K2Fa6X-qKo!JkrFfej2PrTRnVQ}pNR~!7y1?UYbN>LJel#oQD`=mL8#lyQ zx@NYIfM=daw4NCvqa`*awB)FSDqqJGoN%!iW~A{@yC2`Vv%BmuYq!mS?k zcXDfkz`mR}hKxdP_0Su#3G)+loV&=O31 z{5g#0Es7e-L<4M9xC8#6pn=D=lhTGah}w%_sS)m#n2S3|f>&8lL}b%PDY8NQcB}7q z&s7}Mi)oNKoXeXx_Q{r5f+}M+{iAS%mjoLf`2PUMMlB1zw+`5u88FDDmPTO{NKuH0 z3J+h$&paC*{T;G-0OBjwG?&$6`gI040wudKV<7afWvO=J7Zde$C22gGXuF#VhaBNw>^&?L56%&YK#3d99a`z)+TSQm|9Nd*Cn{`0u!mGCP_i2|F8=@obLu}GJ<}P&n+65o{7E!HDni2?80@myl0~-k zk?z}huY=qknT~6TJsmKr45fp_Q_rMljDeFNjoIDMdL#fILGB0uUw(UzI)bs>3}@0& zRAUKq26R}{N06-xq+lzZqA&s47?1LyUi{ZicgcdQc$;YPMU%fSIZQF3^WH{`I2+gs z1N@DWf0`B74T%)2K(}iTUt6UpC~Xh zOXZ(2*m=8&enR*4clI9L`UPnE!p&mD6U2TfRKb<8WkrSFP$Jw_l>h|MJn}VeNLKiM%ghtZIxk^I(hF(76vw!N=0@ zV#>?PhCG=f0h%=<{bieN@&Mb&qhNRIK`U1?c=r`q)~ksIwT=!vUriVePW0a+pdhy9 z?xe9Cd=7e^qV58r(=3d4W(A$$W|LIK$d58eRwZOHg(GB}Nau^Au=elmT{9<#9#NN2 z8w7ul6!7d?&SvNqsKy+?pp;c zDliw1ZDp?Rh!y#--=d)2BD;fz<`b-VYFET*V9D6gZj;UfWM#!#k?w2U9zvgU!xY;T zdqFpIn0zsngAz%&&e<-qPM1v};EkfY0=xtB(QC5^)UXGC>`ML@j7a&79IB`bh*YzA zQWqdGU&mo}_V>Q0w3%hpD~pU|CrC`Z%D*Y5B-IZlESw zRvKsFVafu*E=DjZ3dmAY0+O5e4oNgCgGx_5Zqw3Q+z*_~tj&8)d;O*w#-R=&$5dGZ zkmXR1vf7Ihdl&CrfV%EF<{DtwouVAAd@uU*@|tP6xCT6Tiy*Z5USlE!uQ|O5zMJh9 z5AA&S>Q{J#DBN1UC+pH>p=Bi4SraUdCXLQSWTiE2?8ChqB8~jrblOe1IE(T)rjUwg{yS`0A{`yA4ws{kgyZP=nJ?X zQM7}wSIU9k-}XI8vH^}jtM5H$t)NFHSCF>`$K;Y&v-dAwPKiA4&o+nuJ+<`PwyUMJz zK(-cpnzr>Q9CqWbe+jCE6LH)R5b>yq)dcP3WoJK}(GUqL)nS+)O$8_OWczi)1bM}* zP~tdDajKD%AZa}3-iRn2rJI9Y*X}<&j;hL78xtXzF@fv3Bq5*8B8 zz;qz`00zSWSMz*zJ)RH*zLuf?0Ip)~V;(H$iKmOmMR^LwBx4?BCfjcNLXFkQ_Uw94 zq;WJ8<NvAuG|ls=+$OP zpBqP>esM33;64^?VDQHr(t$jC8?pOMH)DKv0FHldfEC{|x4+LHY4TjDHBB2?n+9*A zcvV8IjE^JahC)XnscM^#g#(+ul+|3?pirGm*;zgkIITR<<>Ig=6p?}=9mKcifLhNM z0JGO(?gNe_DV5k`=!qXD^LpDH8=9~_5orX&!h&-#cY+2GjruBsCG z>jBi=!Qy>7O*1*L_r6L+BvGg>2rITTV4<_eB$9qZ5y0zCqFBch#?pPPZoKo?iFuo= zLE=3=Y)P51)=1)JLV_cVs7i+^&n(No-<2nu=l~eoOuKd;4tehT#OgS{n+48ZKJPCf z42HKfDp5;HqzY9851*SIx?q}MQRXOjEn|+KC>}0kv$iHY;K2}Bq>Un9y$J{&`zfJ( z5$rwslQ9j0Ly4jdftbO z$&nMqJP7QlqUMWfKrh+1bMiqX9(s}8U#eLZRrv3pq)(>hMINOK0gID`iy2uXX?Dy7 z@Cy$0#U4oj0C>K-^IXn#AN7OwnRwI0@xF;XQLM3<)<%#xAte1rU;hAj4#xgCu zU!TlOi%aqo%f4<%P$dI+9#H z0%e&Yk_pF|6Nd~+O2mlCh&6M%W!$AtWda#NTVW{C-bM zO2iO-B5DSsyFb4(9V1Goz=lkz<(dR99$T?hMD?<$1lcqcZTY@{)7nCu)T(OkMt+=p z#G*_!%EW`q%8&$899QZRC*J$7kLxq`TJ_n#N^VbKe+xtJxCfeVmKm) zW(B9}^GB-5i5yuH!I9SJ6GIV5fG$gh5e+cqI*1Hn7f5=~3PuO>9URCvV6 z$SSV1iV)wrj(xj+Z>tS5z}f!hZAL_JYw_3jiDc6ZI?RPrJv(!e$1aqQk z)9JbXTSi(jD#aOiOHCkDwo*?Z`daqa~w=uP<8$1T9&Ccse}3gG@Mj|BBtRF z!#3gEhOlg#2D&?MF(?CFIE5tnudiiFnGizQXw4HT;5O}>Kt25&*yExA11B;#AW*P> z7dFoE3gY0;9KKRXB`ioOT+zSDVqmI-f6+$r zkb0yF8`4j?00G~)=ke8$V=^wH?sboi7DLG^XAErF0}abD@`5PiaQOrie|J3e<4vmls! zmsTf&(Xk?fP^JTp2W$R%O1zn?gW-#D^_leCu;t)Z$lmT*!-WU11Ke^24ms*?j8`*8 zz(sjLb2DYkk)od@`4R4w)-*OknhCzUhOdKMetJ>s7^vtWG3E@6OgWKbY@AtRILR9_ zEJTJUgi`+o$3Lr2cE{cJ@2Jqcmi-_2QvtCd2l1f5lrn2CNChv z7%{|DpGQ8X93DvTW80+IMbZwreB5|ad7;LX7N}L8Vcn<`R9N@<1aW*(D>piT19S=;{{S{tf@sz= zlOm#)V624gr2~=)qwZ^wT~pntS|7BV7Tvo0@1)}+4s1OVIVO-~9A|$aLT+|_)&nnl zBeDBU8|{5eAR^3iRGRpA`G5@v88Me0JV{_CV=l(6>$tFMCdU>kueluc!7&`_3pOwM z{v}U?<&Q;*QUqhj5+chN5tB?kV4EP1{r>=Nkyb9UgZB8(bscIp%#JfWISi}}nCb{t zHpg|2HWCOY@$+}iEZ3A|z{g*N8!N{1YPws9bZ?=F?ly}M>2-Or062=JWZ28K5>gn@ z+Yt8c!2DNCssOo}shD0qaaIS2@*4@;9!Ouv*vT93BozdApf_6sN41_w=rJ`kjUZbw zj$et}Ptvg-TqOaE##eI964HW4J=k)6C;WbR>5CF5$u5x1G%F9pBUV?78Vr#njHs(D zo}>2;54DA@zT^(wH~@?blYKTrWW>6@q5Zis8zEX<*zAiEn{jtV$mE*_zjN0u0dq&Y z-9UNY^#H^1dgs9r%1J(^bSB(_Avx^~?06!@PD9C(THWMeF1HI!{{y2FdFnjnA$ zP#?Ea_J9VZbd~mSTS~h2Vfi>dL^!cPkfuM94*00FaRYV(50S|f!uh)DY`*jK@hFTC z?qg^32-0*cPxzJ`h+Y*@<_C(wmOu~!H+QZq{GZ#c8VTdw^N{w9U;K)B&(Xql3>g(N zwoX|TE3Ir}eb0MgW~FQ!Cbureph3Oq)$8q?9Gj7C~E4KmZjUcuY@+2fkys@6v7 zm;V6yf=8f36q3(0k}`=JNm5rNAPN`DC%Esp6Mo~a_j$7`?|eH)%2H|BSj|2bJQKvy zqqmvqKcq^V4M*9z6=KQ0m;*!BV%1x+!YlD1mR!vBA}FD4(ZoX(-20fb6IXnD_S@5t zNW^^#!6(WkM$`tb`3PU>-5yAyaupZT>NGviYCY`ybu8D0YYKo;-qRz^;&nIfZt^ zd=Hf@x$g^1(?glMN@f9xG(9J|7s%(HFXyH;$dhqhAzn4`zCVcB-zC>8>8C8@cYq5Z z*SWqu#hd9{PClNl+yTt^rY>x9O_?T4rd-r*s|xLH;R+u`x@w108QR2CS>Q& z#>9sr6q_Mp9)Ie2Z4)zgNABmF+xv7tu3|QLGtUqar0G#U7|6|^E@sC`GGq}$GWG*$ zsx@Vee*XYHBV_tYrIE~zhr-n&V#%^O8G|A_64D1zdzgv=M<5P3zHC=tSzA43T9%xe zH2CslPPxygPLB-jI3Td>8Ni}PCixV3=z?1HxR?mDno+GMVqa{xb1zm9GNmg3!Hj#Ya`*g<63}62Mvd^aYZ!w=Q7A$!8OOk*Xk-bxTABDce z`c!uHP_LajdVy#h&l}n_@Xj$(vVA?^f#Szh%Xu+lNf(gU>V1dc(O@h6C$~pYLE>RY z#hcCM6PM>_%Q0h;AoB|}hz*mqOo|kJ$_eM*w+i46kSGUlQYBiLW2g8cNn_LFFhlhY z9wG}1;gpKlhQJ>L1KbWrexl#1he@$IwMQ{%Soo%F*qK;NsT66r((FaJ==UYc^YAEF zyA2Qyb0mGFu%n9l&)UYPCI)&1W?XokoS~v&mE-h<1F~4;8?o_yYgJW3tui@xZNuSz zpHVo|w3L`ZibDBv%pxVED(cU4io?A!kUlxH+o%yjz?vA7;(mX6{Kb=Gw}kRhF|iij zMJ`^0mIR>!$t8X-ju=&SEjtXv2<)NMUrq<4?^3{nP|2N?#Tq?K=s62SfxzWUIRJn_ z2e)pMSOUP*e`jM>4;ZcRT|2YoONcW?X;arWAMama*ySgQRKM2w}$) zA2LLLP=Y};-j(N_!G+(we%*S1@(+D+JR5I%$Zyl;1j|*(8jd_0AcSE+A01Q7EIkgc zt@0PS82mIe#52Jv0%+!%(eim`p3UJ5Yrz@<&Q^YMEnc`&lYghHK#}pv778p^j;mOoHIY zk-&~M2tzSjrZ>&<4&R&U^uZ%Iiqy8r$KTR#G})4C3lx~*MOIVho7rGk5uV3*Ap3AE z6Jw<-W~x_Byf&>UA2p=Vrj|&f^BzWxk~4OW{{VYka6-_lq7Tnj2D8k{7st1!GmK2( zgXW{D5G0HNazD&fwef3Q{^ya^7`0NxWdzwhkIajM!z+X08Kx6V(5X)}N~Op`YQb*6 ztxy|o$9_7_+D%5hruX)X)7vUE92fBS(PQTqml9=HGAgx3+yQ)F0*Dt?_~{W!gLs*> zin%`Pq))10&kL2qiys{)mdeP$q+5sI&g8?9^$djig_b#3v98FW>u4kWL5A;vx1tI1if93U7*?;RL#FC-<>d*{ zyUf$ zJ(uUI8;N8S1l06dye@#_oMR zL&T(uEG+U3kJyp(*JR>9ysr_PYS|Bif%-7VlFZwZT4YVaK1l=Oi9Zy3^cdF@wES6Y zNxThhn=RtZ$PD-AOhk+tRkBnq3MA1KJMqU;Hb;tDg5gKPUud%8YC)!j@;CiDTKStu zOW-l>%Xj>KI?xY?6C;KPYk9|dendHXS;&oXm0UZ!y#Pgp01@BPJA8}k*FzuN#=wW7 zZcpo2*xoI3hnQq#Ldei$N9k(-7QccIKe*$mHIrn`OL}70?G*TfL&g5i@yU+)5HiOL z1p#)c7NLdr?N!)xk99Am*$^naI}B3fPV!FpF=Hbn0G}?Hfx)WWYq!bjY?7Y)8$?+@ zgqKlxrI*ggo+B&D%VCj?54X7h*zez^RIzft`n@NZnl!k%vE*dOJW~~pDI3fEIZ04h z$#xZmf48?Bva3bh4g__lX-0QhrQVW86(dhGd{d8Vu0U^c2ge;*P@LS)si~d4h?fU9 zKTOx>`n(K*7V;Gr*F2Wqmaqt+$hM=~uG#X{amVz5uCAM_X4&%@5*5` z2HW*53m^f{e|~xZo@CITFPH{?sgEWU%$UoKBdlgtkJ7e774q+rJvL9Z`}Ep`kt?L6 zH4_%c2AL*ou{4o9@uIRt1ot5lT^0$*Q^_rMFXH-An6fyIHCu%_hGHf*lquqhAui}* z61Afd-cr_9{VP^%4vK@vF*P3fKOe+1Mtps54Kr}oEkg{esvj|nI4Za0(CxuDcU8wu zRDqEpcGy2?J7|(<7^o!LUTIY$2`=eSG2|2P$2^Y5p|FgZL8=<+XtBqq>9Z>`OB5xH zj#`zNpJltRYZe1^=J<-Bk_n6aIj%_#ua21b87btKQflU*xDtqcuKB-%@6^SDCG|A- zf>_O=(bH9Ubtdyv#D~obxTqVhk78_Cug~$(TnNR88$`p!5g25TA}5xeT0y}I1yYiB z@mza;{UO}FV`-@$VT;opg^oSsc`J;0e zV5UbTv(O~pxv$S1tENRNd@*&HHW>7SY1otMc`)Tg7EsD>JOJ{Oy-M&;xg-w9^VZFc zRyxd%;2pkQ{wKPBh%+KnlDqaXZ`Ebmi@*U7dLwfVKhu3@A%VJ<+N`u^9xK#&jN%f9VN{nnpCNIrqPA#QXJ~ zmd%NFBm=rRk~~Dh$8i{vDB32Fd4xIw8r6V2U3NAo*X`ReasySjl?LH>*-&KSM({91 zMo}atWh+F3RmZEpr1lrjZkS(AU^lqg$9>!iZwodol94f4R!Ka)%wB;uS%>pNxByk2 zn6R*|->l^%-9|bTm_8mh@8<|uymL(CST+WnwaH z@))oFkOyD@HS^G7Pr`DAtQ^cdEfS}TszF|n~&LqxQp&O@?MAPXb~J;192sj#z4DunG9%u}f9jh(H@ixioO zBuVO!xw(q^f*y9+8>)vR%ecp;w$~O37sVPp@zGYJ zP&u)>eHXy~5NYsnq>4d{pNAwQ%A(ktB)`J3r3R||`vKKX)}XkaQ?no?g@cdwP&Sa* z*_j3*J}yKT7R~n9$IS$=Zp^H%Ip^&^w^t2h)m-z9?H9*C)K{u_jiG}i8DozmxMMOl z$lyk0Msw^=-U#e>4teX5k1LqYcn7-a*y%Ti!`T^{bW*I%GviBAM9J%5io3R+%T0IR zzrP(p)L!5wq}3s|lUHBQ@6vSxjC`DEvt?M(l&OX!VA6&t?!@*D_m65H9Q3WOqr=4S zcEyXR_fY^Nli!*R37_UEgs?#Pm1x8eN!A=sLfh&Kr3 zm7s7;k+-Tw3eC8;1ljf-fFHj~&qCv|V@u}*)pS^VQ3f_d_~GY{HQ3Rb2LA4S*mvxC zC#6kOM4k)}q@k=I>U9p41du$jK)Zs8k~CFjG48FjJ%-XfsGH}c)L_|+jj^`L=)5gI ziVjRpUjlr&PB@L1%Xornt1ufx@M6#hrBb736~N!18YiG zb4tt!^9q0soyUr2n(t2$smw^KtBCy zT~rDI9CI-0=rd~b$dj7plIV=^=M{<>3EEGr##jm~$prr0m)iQB7F?Q|2Bzac8y!A( zn4Vm@{7SM#lrkccD8z1{*mR^-de9s$6b#*N9$n^M+uk{Vo^vT!5xa1g)**{4gf;^bSDy*Yu^qtB`1aN)1 zcb`0GbL5++pVdSDKIJ!3o!3>aaK7n(R98aX6p znL?l|Yrd$E=`p)BuTEjUMU@BHe+zddQ zRV=>ifBCP^SJGTj6({WuGFPbY{fay{jL(=O$C)Law+Tx^&RlI!S8%bxHT#clI>yA^ z&8KNge*I;hI^`|DlNKoP=9kWrCsDXJBy1yV4&D9xSp4!? z`Us1qZMr#^cBhxp3mI?I@H$qc^_J|;?> zyqUq3kw!Q^V<|k6tzQ85zW04ek3%)7C9P#{k&0VRhC?=cMxyq?|29ZxrREEpV-^ouh*NBz2dc@dgamVJPhW zoW*=uk0z|xrbPu-8&#oWaUh@~#cittxAV~tT*>>gd7b5M$_7 z1NH~lS4ZA;^Ny--0xj23{=M%*-ulSdZC21QE?~bWcZ{Fbzu?Jtta-$jH%yMUaTTos&pu)-cvvZE{E_ zzX0FQM{ui%s@{42W6a%1>l&DXDPAEcrghy6URf5b$G;~1JlL_)p`6H6T}aOm=$<6Z z@jJm7k4M48$5`>V4?b6n_X-Fcl0D4;LHX+2twthQ-hX-WpXugNY!Xu18CxKy9)0*TL@(EBnju=rX>MqT*?JEiz-{A23AUqSM@K zxQ*WScKdes=(F2%iJpl~)B!U0RMQT8^Gh>*LdcLZO9|T1se1v57q|}Ki}<_Y&ykZ> z9R)@Dw}hw5(Wj0)l*g^;(>bukq}{nJSR~z_&#@z=2gOENbpe>^-WbT!a0&uvnIvf1 zK-TIu&^ynlj?3}$^U}D@#!YUK&M|QeWu|PQ50<8rX-;XlA0TnxzrS1#EI@j}HEihc zF&?U4^kAZp|<H?l@Nt4;Lt}N{q~;1 zfdaU$rW}zdTmw@C(Xd_&ymYcfo>htO)tA~_3X|9Nb-NQ$jK?}$d~>_WVLnXWT?}^S*!&-c;_UT8-}0xvk{kB; z$nVO2n@svlKkgDCb(HyLLr58SSgw7E0CDs2)QTI#s{2R)h}Xe>76V(3V2V;ED;!%l zyi7%aPjH};Pt6PVJvNvlGG5WD3Ka*KZ;h}rywD?3-f$92D>s&5ZJ=)Bf;-p0`}Ie# zw5R*@iR{E2w}0GQiKt1W;Uw`NDrbEaYt9)9z!$->$TfRg zzg^cb14M!88tUF&eyfq1Ve;E11qzXX`%2U7;(_ML_dJo+JU^%p>P0sw2u~k)hgR0H zni8{!a`<0dr7 zn*%Nq1WM)nr!06BZ-OqpulVW9-T{)JGuBn>`DQdZEX^*$R!Jj4Z5we%+W!F9k^A)= zlL!DT{(GNYmqg8*3EL^+F7eBb^nRv+*aWij^e7qZxzcJHdkCe$jl(0C zoomVfQ74miW7>~C!>;R@#QDg766rX(_)wgg5*N&j#HSetsfl74!23W3z&sKD-2&Cb zuAi(@+8nWJ?{ocJtOzI4p+(WVH}`Ty`+?EjV*(alNt9YJ#K6sr&6Ffvim575ia$Z* zFrwCPzdYAS7{wNI-X%=YMFx)Y$cv7vu)Ogyta1X>2p70fDi1fo?R^1p6ws@ao-x!g zd^?2a>84WBHzq-)XRd zgefGA!F}%R{PyZT(WPT>X>AQwRw+hQ;AP`QuaxwrHcT%5ZqO9~{{W`6Z<;(Bqs`TI z*arGmAj=F4^)M|<8zFUQ;fhlcZK8PMU9Aa`2Nl|tnDg77p7=3EY-`P5#Lo|sOgIYh z!<~ULPa;I*JT!m+dvR<@Pkt|^7Ay&zGU_nYH<91Qdy}u@X<9o-@+SPLONrx4D(b9@ z7T(mv8|RMv`_BM)x?I05Hss^|pFY&Tt%pk2S~g^n(WFn*Pd9kG3uIU%8uz|C^^4vc z-E-AG#9K;hr})r#vsF?AkD4cWao9v+SeT~Lt;My2#|F0#U{6=kdl(ly{{Uz{?2X@E z{H4aJi!QknNggyfxlwt67tJh@4S}x5AQHrT@;cPo0)cA=dHNpE!HCk&$FEPc=f^nZ zbMgdOW(Ub!Zz-sGuoW^RM<;6*91qAG^cmYCq4sbYLA>Yq&wg_adKc0>0WL$fEDjl- zMQJOG0d0Hwi6wgxUj1cz1Rkf>YSQs)QX9rQ^piSggbt#qE*4Hk?00;UW^xi!`hVno zw)d{&9;5E9vB&W>zOmC%7-ZwWSkF-KzD9#6mMPF>VZF%SS&`7NO_GyWN&!%(-=5>G zy5T~u&-4ABN3y=5V!DRG{_*}oHGN-C(<8-;3TYzAnh3HdWQ-nn@W+F}ZKmt6?bI35 zcZTk7)6>-|OYkg0a5em$Qx_gAtc97Sg+8V|fr7}!&dvZU!1${^-BDdmE=_dZSh9>} zzl_E6%c{-eNp!Jz_jsFOKngJf^vfOrHapPg@z#2_#wPy&dWT6}`R4jcj4W8Rtc8yw zBmQG4L~5Zz37nBd2Wtvg*MI!mA6T2WsKm=FT>7sN%N&xK@)K@O$p@+h^Ee=mD6qN} z&+pLQLs>bBnm4C`LT#x>^~(7f)1!In^o0S7kXDU+SI2IcoKDkX7ib)HgkkEr21JD( z5V1rO80J9o5)`-rxd!_m#e4Q;YvZI=PzL`1K4f<`#~^ZRgZMph1TX?iQGue}Cb}e}3r~@Q zMvUddB1RfSV56VK*rIqn`&GLki zz+Ktq=pR?VR8}O==4aMLC<)+3FycJ&Mh0J%8CFJF9^;&l?7#&a*&@NCVEb6<$t)^G z2mrY6q$60;TUB^mMv*ogPLaV^JT3l27GIsBzCZC01!f&RT0SF#JJ92g8d%$U<~gA> ziwF(4C4y7{Zo%#DJ^CbcG4&a~0y@&Nqt4JVnke12dR|6d>Rk(uo_llqj@Q$vv2!yY z8O+-l%5lAWEiG9*&C)L;)L4Ix(m3`%Bd*UeTmsZT5J0&fTRXh*PO~cyQteu03RS@O zvOT->%GBO2v7WZqlmkn^@->`?mPAHU9y8`pcLb8k-L8f5DBtIxUbu~^;z5ru@&T)d zOti)lv~Z$7=^zYZeqV8G1(XsES?@!?Ks|AY3S*f=k3667+=R^}tnVWviya9oowRtm z7EcGijlDmS_<~lB$qeo6Q7@R2+S$apRxf`s*ZZoWOG@u;G?0 z`6Y!{8zO}4l9T2TyLU2^!wdE#-!wVt2+rX&li~3mW6fSOsAxF^PT1M=w2S8u5eWMM zBB(V6vPVAE)9%EGve@Gt<|WcFp^HlqPmE>X0gcsl}J zGX^mWnB&Qbc882c@dc4>h_YzawO0$ca}n&E%~MjJ6k{{WElhD_SOVEnyw2VD`+fd;>dt2kFmfmDGbbxMCO@wb zv=c@rc*_99Sp7y}+Sm>%uIuBa-FF2jpoVWJ)8pywA^L2L>{fMY0Ula#4I8U8MPDAD zZvArC6?2%en8o5VnW#1~o_OL(6{UAw>*WLlg$IRW@J-jxzizxjbZBmy$(IJCkw{w> zZz4$26>?SiVilZUZvOzl{B*(ZD+dF`)-TJzjq)Ku76wqoavANG6(lvYd_N|EzT=KB zrrK(8YsJQSapLHiM-`Qk*UUy{aPFii^$pcwyU`-~zPL6dx7{B;k>-pZ3_Llc%a1BZ zwjVK4(4YNcgMYeH=&>2b-9DWm@Y zsx7wAQdQKY5y@a*o<~op2pNl}NXMUj)Uele48XEuN0hjdMI#d)<0Eh^g}-A$ud%P@ zAmUqS=pY*2t1S32Ly0o9(x&9{p;*LRGZMp^U$FP?r`hvAh!MODvK~Ta}n|cU_8r4S(Egv8Lmgs=g~6 zPZ~#yO$jH^&oMDhA&O1Xgkn{ByPyd?Q1tfcSeneTFuzFi!=f0p6?x-U$cYE(k4Dwr zD3UlPiE8<)zKLpDh{3m5oM-RNl3AmeVXTG9nE^Hi+T+{+O%cdHJt~tJ;8D!@PJ83z z!kN+haPm%ge~s^%uv&ZHa*5q@NzqM#`dlo;M07 zxi##106H&A+vJttAO8Ty zN&t#!P6TldnU$bSZ*K@z@xx6F3IdYy|^$Lgn<)lnK=>2bf_}PMB6Kg z4MmN#oxiE~8*&e@;eLAL=E%6sMSQ0Eb_veRV34t!B4(vxDiTyH4Ymjk$lN#_9&4&9 z0@;())!LrEesky^8}R(PMx%%2HaW#Gy5|PNjCc8-Zlm&q zSkJ)uOGAl~hdzJMwhXw-DBf92Z3-f}J4bTdDewNDeyCLL^7WZirqC;;*O~9E&Gh%m zX`V)Hk;S?;Rse&xl0Z9tNj%X$-5tSs=_Tm4TMWuiG?37%A4~iT-jZ+#|%4NzTIHWcgWG870M2fIU1opb;w^Mx{ zEORO~2qusF_=4)w$mR*4geiClMUH>^u=WlQAgB%8U3d3ARTWN7B=Q$%&S=GcCDWHn z@hWA&*zKD>D8qJp8_LA2(snzIbHKX|`*q&rE0PaBa4w@b+RMSbdi06)H_O(1FO#O@ zMTq(H`BGuWZMHtvA6q)10h_#LUQ+ zlrB7E#-x&WSR%tIAR6c2p8a{73qIAv_rLnp63-czztb%|r-`M(Fy!Uq2@(M)q%t$3 zg=?@)4ayslZO>k(v9G(_pnlWlfBc@GybGv#{Bv@)3`W7#G*&P{yHjF~5(DM1RjVh8 zpsmI8U(ZXZ^}xyX@`F!EZ6}KQ=4-6X`sax;5@OQB6G;k_M7*X_*8PJH2@E@n`RN#s z`Wctd(*sDAKjbIGdJY!1jhZEe-xne{OwS7yas%x`Psx8t*_C2eo8YndP89iTU)H;Pn9sdB6 zKNCv2KA^b~8Dv1|7(Z{Ar6FRhF5Ofuf_pI|->NdIWwZR;iYe7JF~`cRec}jw8I7xA z1;EKzK2`x|(XfEB@u5OkPzb;tW(G zq1;OHL9yT1Up&`YG~5h7S?TNOgixAz#G{K#!_=etbj*Tv$ciZ=ISFN#YJyY!CvgV7 zjh+SGfv39aVhy!&IOppVYdU*PsTM#4_%$GNer#&@>kLn*bNTQ5^)}NRs7;zL;JnoH zFC8-F5uY3&BlrF`E7$1kzCmE*5o65oTZVl!u1shonh4xR|)P7~vsh-5;AH3t-F( z8&E8epz;qiYy;BT)d|iRw&~tEfw3{=jHGi(DKV-sv9t?O?Z}}<#~$_9C>->NMo!`7 z{KXz6)Ael4LT$0GK9!4((kGQE61>}iR4>WewPwC+->Wyf3p+`*H<8)=MiOc5o4$An zM39w@!C&x1rEykn``;WNo`IqLXD-%WLjh=oDj%-6v<*%9EznOMyniR&ZHF7gVm zN$x0f&#~#3BI2_G*o~mp;R_rAo#ToX-ZxN$h9D9){m^dqngQ& zEF%XW5rK^MnTb_OUceA&9yvd`>dV3Mf%Mf)o=N5ruWFJrybmOYCZ1G8VY~51*ii0! z4wHB|Fs_=`={e#*7RQZ&G+6>{pD%K%Kv!W50d3&b3*?)+zCF%%BIT3W{{ZSur;hTq zs*~s@W{}>*kwCr&ady_6)mO((rx5#{v&{W@^Hy;n%8p+uHTqKCVNXyD4{KrA5J2|6 z-76f&_hi?Ub**J-{{TQGm~NSfO_>rGR93&!+D{<%zkhy!a4}PpOFY1SxpgL%Xr_}M zGb%cQg{BRQX8!E7`&1z z6=BVAw0N!vT^{ObtL3~|*zhl)N>zNF#4`GT0)gR&!1(8&PGBGvvlu+s za7R0_mStF(yx87@6#zdbtblVWHCGsV@gXJmOJo>q~SCQaLmY#h-&lx`gG zNF)=_94O`hq&C})wA`_%>Cp^{rbT!Mn4yEUi9d@^!5o4)=#mMO6a|UyR(?Dhgq}m= z!VdDAqAr0zq8GJY&^KTMT`?nyoCYlO1n{;tVMaqU!w8&*fmvCnB}MIf92*9Y=bm~> z&BEnwb$OV1&|*OH%8tOQN)*vxRd;)kps=rkemVy~q(Z2t#?!d*B~09@GnQHBd4j;I zwH(B`;83I3ckOlTZnb8)liWF~j5SO-b^L~dD;`NwUC%toLo00yKoUJXhV9K*?r)+O zk|e<@L}!PsCafdIfg^$EkwUjDjG;lMBm!HxCqsWhmA4g$Vu_eI?cJa zNJ^^tstS>_w%>8-vtWDmK&w-c$Ua_I4TU0_F%VLx6?RIfyCjq_JgVMd~(RbIiwbhRffavLFKIbdvn5qBUdEB z{80=qffPDVny)3_Sc!WLmpI^`Kihb z!}2C{azOax1uX8~UzZXoP}@MSa;J{wk8VNJrAHG6x>2#|1J*Q|vo+l}P=hb&aV3Rg zh817|a?ToMq1$Tkzv3(BuSquhykoOG#zyyqlXcVNG5yW(u#bl|gCoQsnm;=rl6bJ( zNxS~;c;@!sQ@{TJk23U(v<5#s$8C~YaM4phWT%x0wqT%<`yWUgdmeh504m@D{ywvK zj${u2iSfzbuoEz5jGvGFO2+>H3-iZGv=e4I+Af9T>ju^&Gf5S5e~>CTKkd<>)JicMsb-l; zkBL0_6E^H@L{k`2RJxT=2*2{?%Kk5<3cQ$B%F>DMk*XMVz$D!)Ml=M-6+w|r6|zBM zc?XK*5zTeXD<&HZHq7-MN_;$gcb*v`$H|!b#YZAL*ec2GT#i2-O0?3KHbFGad10HxVv+}h3;31bNNwtKon?#Z-@TFgY>{{wb-n z97ySdw;~mR;Pb5FMT{CqAd;h!NlnprVwBy@upFLlyYtg&i|GctD%JGzjCB714ICln z#|)`c7<}NI#MS8lT^it$eK&oq0dzEXFy?2}<7%5fnA~Yut*Hz-e1?Z>FoAu3bAUnu zO>7}R`4>mn)=g1*g^vOQL;rBj^>Eyx8buW%9`;y&+Lr`>(3U z@OYtQl@va4*4SSs^Zm{e-^ayu1E{0L=lp*Y zLTM_nQY+KqdH9Jp;>--M5KWC74A9A?$cY-v))BT^MhKzFCz3tSSoKP?(4L2~G6iDY zV~q!_r9clJ<(*tpsHC3BYsCUwMv*YU;n&ZnW zhndHl403s8AMn>zdwso#9r_KbrOqfyud}iy;hN*&EOf0MAA}QH{6BvUiCP=mr8Q79{C6EPi={0qIKE>KY48`|^QBFT1C>k&J z%+sagWXh5ahG3LJ%Jc$T@reN%`m-5Yx zp6uP$xV8NBnkb~%6Gyh{j1kZA9qL+^XNGkAJZu$>vYdyW6*k4$K`m#33jzEi4z(h( z(NSV$2Tg%56pdpxY=_OCa>Ss}INc_4fP?kn@3fn;WG1qErI2j&!+QtBCV zOz9*KkfB7JD!Y@#(BK;9-=2_WftFIMFv!sIbl0CCkQ!+wc=6$DMnt`>>Hw*yb5K78;X|Uz(qS1RmnD3dVjw$X zIj$o}UT)6m4pFO;%T1{lCoK}WE41QXcxJ8Q&E zG}9a!;b@qaD(s zZ$Mv3ZQ)ds2k};k#&NnGWw?*960PI5TKE$`})f5VnEI|dO28V>+Ai|tB_}Paz z?IzNTL@{Rf_cnSPK>$UttRsyxM#a*Z(K0;6l5{G>kgMpTstxx9x%`v+bbZ|n9+Enm z#fXE;r94L&TLv-bI);gghNUC}e*?Huc)!^6!A0Lljj6m7))AYe!jQf{ll73~ku=e$ z^4=w}>MRcxUB^^#0J%LsJE_>n$H!v;lEW85MRQ<}$mzFZ5QGYD7akn)LmJ_{c`-y(Ie5yF!M%-h>_3sx z*y}mA)k5^Y3rn4<2W7`oBpZB{9r;!(&$y#s9r~&U7bU8~sGpo8#IEtU1$Q)Y^Bb{7 zjd(YI0>Q7xZk6+y+FfM6r>9}$=&doGk@3kMmE7Xei!y(xk?s5QL!~Gx%+jy4(9Oxs zFGFaSMZ<|;Y?-1#F>`XpMYG0Nm3|G5IUfB_9IURP3^R$`I5FmFY3E5R$1I4lNiNvt zR8Te&dok^NSs-2CP1ejsJ4ssZ;TrCs+777++Z(id+GdbiG3JAT>7ltuyEXU~(v`EB zMWzQappG1H4k34JXzh}>BfXoDanB$h%~$Tq0T?oLN%3|frPY@yqm^Ts@&HG5NBcIC z3k5VySts0AMNKhLC`K&t1)6Bq9YG#!uO=}nM=(I4*|#X;Z+-=Seru+?7Y`If%TCD5 z#gHOJ=rb!z3&v@HK!Mh~3Lw}9!Q^q&#!W{dK((D@PCVt5&L^G*MN<;d$3R816WoEj zkbC>{(G&z0Xn`BxN<$Pak2G(z1VnEw7=h|F!TX0lzfEIRk4x=PX9C+CK zeC9$6ASN)Ii9c=e#r*cZxko;cQHC#*1%p>cOn7C0NYKbxfND5R^SF*k-~sQ)$3)OF zr9sFumee0BA~X_+TOhfPV=n}k9*d#0(BSqPudZHdbpQ@{{h_(dl5yd}o*r6fo5_f8 zF3Wpuz6#NPp=jW!K;UecT>N$Bi zxKlzJIWgEz0s=w;Y)}W^o!r;k)llCeLD6$(pS&YXie-qov*#8I1PM}FZ4Yct-+@H; zVbijK#}QqEk~;TO%_aet@4LAEI%LBQ(ry4>4=`odvT=xSHdpe}MlnVdxI0H8`--nkjzK-T z?bxvcE%b`=b$oqJMPUHO%fWOG`wB#Nso>Y8#SVMX{rXb;0V=51;^GCFthSi|SqyQM zW>O;*TFC@*Xz)+RC+Df);LF!oE}I5M2EXS#jEb{1=(mPwhrMxLrRVeW$3buB9hnMk zsgL|;nXjEa;g2g%C?#kEurZ)!b+5?K#mjrJ0A7MuJitJBOpu__#d@G#P4-Z6x7fsKe7^V|q<9Ue~lh)gKB~QBoOL5J9 z-4)OU%LuLQCW5hrV`sOAwCn_6@=2L12&F5&JgeaD+t`K%sCNh3s;X0MsE$?1U~V_@ zE^m>wq=_!B4)(MXi{h3shG(E}cGBX$Yv%eyRN=m|x`DR>zfS&9 zw6o*pV&j6S-f|7XMx!?&6-%S+X`JNiZ}!+fpi6J|IQhsiT=bNtm5(e%s@>DHMnX(ZEQO4BUSAS|${ zWwtC&J)5=gFXy4WlV&MP6a=K3LDTUx?0jH`NM&;#Jc_`WSO9i~73sPIj(EDd=-J@K zyx5-Uo(*grJJPZyV^p})G-q~86k+9tHi}IVUHgxIjgn$+#xX8D38P1YprkY7GNxp( zh}EBIjI*)=Ec*k0k~{Ivgl*MR$o8!xxtj+cgE7>!+q%;4qHnl(O^wMIIFK6#g>t4n{UgVq&Z%CyGe@TM!U}RzHif2j{;%Dq9kI z2~BhwT4OmqBaaAUPl4kZJe;upOQaVqEQud1tf25n09dZi{Po%?T7-$4S ztw)arQ|(uVJcnr>FrYTtW!?$o@-F?qZnkNtAco_1iXHd@zfkLmB886A#S%U|O#CB}jIl&KmVY7@V!}{L#KZ~!_bwwN zjsZdV=~rkVp7Si)O+{4y0JQ|wbSd?W!#ZS`C7w`2AU7d!4+70S?iM|(|n{nRvYXB!D&^h z=#gK8&*Q7u39$(!3;yE8k#aBrc;E`TYJML;#1R7CHIB&bRYU+B< za+2B$rtN)X=4Q4sGYn!Jd8L5^O#o6OknJYJ@^=G7kIy`wp?In25)WAO7gIXdm6Zd} zEcoi#6%kv$N`k2cO(`^O_S}dw>{veGfBC%$T(OZaiFvY>2i*jCe*wLZC!! z*xYT89m>~!XQ=#X8GS!z=TiRw-{vwXx?W})NF>K>g0eO_1*?T(zk^1H#aQ+oXxgc? zoJ?RdD+SMd!F8>39x;QC0G1|Cs>)^@%NUVcfO&fy?eA56xt^m1VO&aR=^c%A=^1BY zoQZJqV3s3OR1XY*$K{>1B_2I1wSDNZHV0^?iC+C<9bm^kqraR@;+?r#s>6=vSTxuY zMVUPhke*=M$9=_^Up&`pXn^IzB**v`RM$rMngZ>?n3MeM<50n+}ON zK2YE8QRU^ui;0S}KpIgTC9lm@j?9Z^k^%cidcLcrk^mDXu-b*#)O9QoX}S(Un)k>~x@%Nd7>N|o5^^fK*&@d#=)X=<(j~-lQT4?08npI*{ zvY+)31^aM&Ur`!FwO$0awykN|8U3fNp=CTP6j4nbD3r(M2QmQRi5-svupj;UVhH3; z-i$JGBbQ8Pl;vTB-1p|V+E6d1#@^OB`0damnw%JuKuz&-jQK5x<}6DrfumUyaLC=Z z$Q57%Tz9j50i1b8DmQL3-D4eMYf+T01CN3Ms`#!r>$A&F(gjx66S(ye zq~v5nis)>QDrSb7AW$8TNCdVF| zzrh_(P@b8MrZ#w={Kw{J^>el)A>mmzd16S!mtZxJ*YU#z_vh!Mr(ts+Q5NuE`qsY? zD=K2hvxu2vmNifdZa^bo2{u8iBD;I^uH4QFMT5jhbyUU1lM+`kyER7yk+OnFTN|$F zY}ap|kxgWAC{vHme8sbPf=oXUM};tkX(q)<)r5BbYV1`~6ncpbU%@tOgl7e|%AGn; zZnFl{^BJzHD9 zN@?Td$q~nw7#w1fM=nhBk|B~i+)CLs!0*LTCa zo_XYedF1|VHkz9ZOh$VpRxQ-=V^=R0_L5|kBS(*HGm=3hDC81s5zSdO(Q}OPG%fSx z)+5!hGDATNGc-BT?07e_m0nKnO)wSMeAwuKP7LN?EY@aN8EvXevHt+eBqDGUMIlb+ z73GoNj!);0e$*&N1eny%K2fe@S<~W3$vcdBRpk;hljg03t%B%_A0NL^Ag(1z1oKdR zOD{J_0=^WWW>3X)03f8<>zS2Uuz`1K#${f&b>Qs&Ee zZ6-2_B!yRM(NN85c{O10dFQSTd_el8d?zu^JdkNQ3zZx&M7#GIXJ8pCc^?bU9_Mec z1E*{Y9V8PtCz1X`vV2jAJ{0R<`4Y1jW4BppZA(?qJFdn1bcK&uRnlt|B@7-R!;?)D zd2*8XLC{=ckFBcjo_}z7>C}qAkz{bhbbw;&NQ($rG2@n4Q6(Op6q9FXa8Cn{d-mv( zPGbZh5=Rjfl8h~1DWLPR;>Tu19(!Db?NZcF%?`wTbJ2QQyw_hibo5CC{{Z~D9*~SE zL@I_X{{YgCjPa5xG*kdt?#wTr*mK83F(-M9x_B#IWFMdH2-Cbt3|dSQ&AJHVo;dN! zErt{nG85l%Ey1z={U^OA^?fHcku5{6d-8(k$W>B96tb*q<+j1FpgTb{0^_M zjGRp5g4hwBqk;~A^WT*gF!Kbm5jcCB7fLX%$!|5EbkE*Y~rNy zhe0u~EnjOEZ*{wF0VAHTq^#NF?bwL;TD$&hq&vjAKAqwGi6qFz${K8k>f=JBNfBqe zEB=$WzriGT>RO64ywCSLMc+^b1Yhqm$JYM<;v5ys#>+U(ERC{jDkA^|3P03H70-LV zI_*7Ad3EU-^iG>`#7BeTdE>`#u0_H~rd66LS9ob?0k-SXMGN;o&r?$Twg9VOBsJIXAuOJ);C)$SoYwkAXm9Ps?5c0 zF~B?5c$u`(=IL@`x;vQ}e2^n4^w6_D(0S!-GXQSK&5op2vfXBc7IFTbvEyoZ__|Ia zw7fis&@}lIG)x_67xGm}pf?e_lH7Zbo|%ZMg-OK-pH|LN z@yYej#;tEGjHIlRZXvh_f;Q0{SwFW^HVoD*oiX%jGV$>v%*{CROFYq;LqrwG z1~A6B1Qq~-2tNGuY#F?aOI<@y#ReS6gs7?l%Dz{kG88afoDSE|J&keDRp}iq(uo0b#>f-`sJiF4_URq7QkrX7GnLAVCr+5*t7envPqn0hgAY{^ zOlbcAr`Ufhwxui{W_Uh25A|7wY-f`aBOGO6Yh)*aLG50G53y5cs_mgtE&oOLz+#SnxWODmp_K)xW7vQJ0E6;P8tb&v zAEy$2(X2qSbL9-g!^6{jTRWqsYh}poi|N};!O@7~h*~1Oy%cCyR0uD2*&(QX)m;w1 zxZ(%mjUr6UzdtJ?Br41mnOJTwNYN0yo&ykWf%xsysG|{ zkw=eAW#1<(9Qujf%>rwV)IV;!QMy-H`Wj29IP=F$aBtQ*@Ti9?HR6^5^wCPMh^rV@ zk8i7CZrzJ<&G)`5sV;`$kyEvOt4&XY+530v#P>tiNbwvv;aT$Hm-O9KTevGs2VkJD zJ-w^9Q}@0gIn2JMk@sYbSekgNLToIYnZBiEQjyQ*GY}$aO2~L8+-?M402=u=E(c4Q z(MehyS-OI(;oi- zcxJbTVUAp^jKKKw%M4M%))9zH+h+J-?0M}+tZam4u`i>n3k@^nab}qwrLF17iHn^Y zHu#t-`iyce;>)|9d2aR($OECKt%3xvv<(%@be0-C=yWV;W056xMoFae1Do0ajQ}3! zX|MZl@z-l93<;Q#Npe8z{K<@bIQ&WD2ExaZ6ve1q4IF?@4< z@jq!kF3HKMbLL!l@?}^cj;w(o^r)fAl4{4fti8M7h$Ib`#{T z=4IV#3y?hru>$A{{Bmv3i%}6a)tJ{_@ixso`FUgM=EE!I3-a1Tq4w7xs|Gbdh94Eyb$b*s@`NG?CFuC<@Q_G~@^O=Yi!Oef}=`*{BT-<1%TTQUJ$Z{=dwg@s^^x z#!$=3m7Ov0{M6WmT6WqlH&I;o=k_O_v9KiMRP{7jbd*+eGRJuIiLo;E5tP|%iz6># zBiU6X4i>Db9gSJ-*DBBkr!$Q}RXC|{qw0rIkSwo~?SshOiu9LViieqEq&g|16Xy8S)c-eNITi6P( z-s;Cm$)g{^&q)6OOU0WS7o5HKEUxX+Mu<6s*MlZj!#tcp(mactoa$N!lRh+!nl~u$;X7_7srY@FC{=eU}b6mo-5k@jda5A ziI}2`4f3DAxn`zG%abAxrj|Jsas%$AP{(Oe{ycvLkIzH`O_+#_R5=rTeAmEoOnD+A z!GB3gxhD3NzqW{Lqs@<=omgP>kYu(v&+i2BMx~aX7|vCg9Dy)fN{OOSq^qrf7;-@b z*gqcbi~{DO6gC2m{{SK^(ltE&HYt)38p3CdWMMso1V+rqcYjwP@xUYwl#Gyv1`t$% zxOx8oFw^xZi?B%;RdET(XKG-|ruNa?SH1hM?aHXLMms3nSPpu1zwRl+(s1P0Va-fv zzNytx2Mi)~G^Cz={X9?{6Z`cg19jB1Dcj;8h}%Zcpw6q6M6ie>HY$l*EnftY$UVUQ z`qD)k5+&=ySj=EFsIznC!z+;+W0{enW-g8a3Qyz!cpOpZ+odvyz$|vCR1lEULn%Wl zm0i{kYCm@e_WpVWab0AvPcby{NvLVE!2)n@ta>~E@US{}0+>v)J>Cq5L^w7pOJf@$*Nv&5}(VnIn+P9yvyn%ll*8#9MJq$m7^^&$m+ACa`x3Q8LV2$u-F3e0bU^ z@j^!#AEb<2?jU=H?tfv|1P#cBfL?fv<-s^lDS|c*@=Gy}>B$>xvH0XyCaio8j=@(r zl>i2bGSRYgq{dk%Q5;d3nHS0t1}(IZdx1xfk;gzSM_q>?MpDCvCJZ?-l$Ct5JZxmI zH3_3h@^1Ma;Ql&uM-oeU26?UNuy~70YbSqS82aAkTV;%YJ5TF1kdSR~yGKc+%$oFG1cdD;sLziRnC zO{s;5sy3WN8jpr@qn#K;l6h#7Gr}$#dr({&+(@Cv{yDgfIu|!7Ruq4@Hf)n-VuoWB zGL=X-z~t|dTkWBKlkmO4uYQ=RQA9)t82DjWS|iP*0UU8I*;+#lY?mMtWt7;u7s2iM zu7=anQwz+n(cn0E`hd#LVCtFnxQ%?R(CBjUMWI;a$Cq6eUMnlVR!d<&nY`j&Nrkkq6ONUH1r&VIfig0{aDF>grWQfF+GkVKT}Y@Fqh=2mK9^tR$WBkiv)*7vlc_AJ0wU zyg;g_5GTvYO+y-Je90n^yqnkU+z!@Fq;|eX&*J)F0aXK>%_9q)pBc7^5;zt>R)UuV z+VMmNwddF#EcDwkAV>pg8J%S4Opr^MfhSl2k|^Zh!j=Zsv3Ke}?f&%lchk%35gh)5 zkN23%O<*+0-C;gWl`{}F1r`bc{#AYWpeyI1r)rxJYN!6a_xXu+Smzq9B$z&N5lUHc z!vY;i;cCyTmG}VPewEtHs%cW4(bt1@nRBAgib#@1#R?-|vP2AAuwg{s0CD&nS6nc9 zT%M+oBoo1o<;-l|CpG6^ti+ZQHn;^rZPu(k_R$yaJ-Q)74Yec&#s=v3`^oK3~lZhQZ+Wu6o_2st{+Sj-rS0D583L`OW-al>Ro+^VeeKWrf)< z4d+UOc~CuzD6R*7M^g5W{TMYx_G{2u7mhr>GxmX_%cf%BLSbnSbH(5 zae%)=W8xJ!BxD?=X*VJ@{>A5d1BQ){ujxZ87SqYOWj@4wpx7A(!zHIba z1!s!?03cSUwd?^TuYbr_!d2$*XSZ&Knwq+es6gHFfRO$ro~G!qr)r?y83N zfIgk{l6tl}$q{I0nkn2!t0a}RZGZ*It=3dk{NG5m#NDUnXU$HP<&4;Je22{fDWk-N zh)EjBA~$WJijYtK;dr{YnEvL4JrB-#q-BY-V#vwMiWq=sk(dJ}Ib>Q=yaIO$1P;LT ztg!ArQGOnX_>tt|%9G;5lCem9vO}vF$qK%~2>$>P-~RvtXPcS>8Xj{kB}jEED3?;k z36zTn3n0EM8?C@8G``24PfVkju1*P)`B^%gatP*}oHz8k(Gz|}H9qX+dm76@t z4HgUG;C^_HaI~L04hR&-^*>AmEL47w^*5VjeZ;9e-4EZMuuZVUhyg)Rac94`!X2#Y z%ckZs!w8JVp&uj7+enLIMit1~q!C}_PtQvJ&_N+ZMfQCHDV*K@@qPxo222uU;Xxcr znFJ_aCL?YAvRJy^?s>C!Ty>fCKpU6*o{D=jG1}kk8eLERI?K``mJ90;;;OSH3%ZsYGjUgjurhiC0EX0PTB*3L%9Q+=kd;iRkry_i_;cJ1fKii z8KP)7*d7?dXwe%dPY)BAq!EqWw)4dus5rh!2ftR+(p4V4{U%b*?!fSC6~tkxV+gzg znM&#AW5(;afLdkr+=_UnB!%of{zVUH)3n@1L^=+us#F{w-^zUd08sv*X6aF4;iO(d z30MG2fzCoBdmV(h8uVj)c*kH4y;(t{{W~{KC7VN<6@H9D3zr`cSu^4QTZEBetY&6 z)R00uFz8 zy>(4LRK=6&@-k(U6Kd=*g-H}LgSU!1R1!~q$DWr})QS>=N!L(r#o50oURR4TygjK$ zk1(ufmN;TaqTYpQFMcU%hSOdD06iToR$LmB)b>E;$@R}z4q(M^5<+zW^)TT;zDb~7 zFvtL--;ii8Z&e=m)fkqr*dJI`Yft|GI^2CIdBwUOr4G3qxbtDE#SB}cmwwXd6d+OC zU|LW~_EYoHqG!wV_>HKgd{=kh&NS9gVEBG^5=hxFWO;H&xDg?79WZXn%r^tOgG1w@ z`i83P{bK0p7Ha~Bf7GM!zMBl0`12G#W>jvzay6{nQVgWqJN%3`)BvDo1 z5!2@oHV4+_#S4jC$1+JAu7%M(AQu9~sQ{@{@qXu^1-8>PHV3>0qmK*eP+?!os zlE$pEd7vX6CL51>t}IdKsT&;2GZr9s^^d$Z@ZjdiCpfGCZJ82BV_*a`u>+Io1QB#U zbI@FgHe*8hf#YPR9&D2pomVY4w2En_t;1#aQ?wF3I5p2lBbid5uFxYq{P+%u7>Op2 zC9x79t0v(f-9bVB04o*lFTYLtjL7?kJWc!quN2bq1gu1n?v95s#zhhb$Wo?(_Z9Mb z<*-f0*V7g#MS8w2tES05QI8?~$@xHlO*@pODrkijXO4YcDIHAIp)Y9Srs$JF;kA{@ zw80QFAOV(ANZL*Jy~4-aUp*)$jF1O)Li{_Q4n~{xnLoAg}H_p7njY zWhRc}8&r~MIiI{$uVQ#`$2@r=9DVVQScxTKzh&2?lV9#Q>9JK2P@FXP8(VMe<>QWN zCJ`!yz4F8fuV2Xk6Gz*g=Y}TWZ9L|A;tv!kD8~$?w~$79??)G}PJhiE*LH#5rjrWdxDOkX1mC1quR!Kp}S$ zFW&l_l1$(>lXDOFS#k0m;%t+T2`>t(*$-rm$J^Z9SN{MAFOw*B6b-*w?~MEri~UE( z$9&AWew!XdnvsNZ%P1-U4@8l{AD#WUJvg8$V|68k`t^}!U3WhNee{fTwx!gS z8>4(lp*ki!(?;;^j)Syfqm1#j5AFy1{%fjWV2Ktxo5Eo@nd`tpmI1;1)JnwzrRp09Wi&!!*b=DQfWM#aSQ_@gl?^0D@+5$1l99h?AbwVrRkKfzXe&(bq#i}jB2 z9xM!K%C2FzQ9O)Iy>UahYXp1y{{THc@x-6GC-nJE7aDCxK1@hrou$MfJh=BPh%6f2 zUYY{W>_F)+$|>-!=HgHIuU5#wz|6(L4$?w`Xx-gT;sTZ2YjqOVIle6XbXO+7Xj=)1 zCk~}17l&bj0OiC99B(R^%XjXHSJF(i2d zea9~S$QXLT?A^(}0TdZKP~v`Ol&)h+vGI@7hhJ#SE* zXNVJ;7$hQgRz1M=dl61=QbU_KmnByBqh_|RlPY%so(XZd0os^H$A-g^!GlxdT(+mPRBOY3^sf{c~Hmw1D z=z(6{xavmCuTDS7DLZ+Rz921+B#dK`a_7n` zR-zwY@*j>j7tM5lRS;}Dc9w#1pd#<;LVRcB+65>H{d?b{^o4wJUVs znVVsvDR+2b6b$2$mj9+g1?AUE_TO? zbjOzxAqs{YlgcE5runZ`el33|psY)f*^G47ygk?XDY3MIz6mb53>IPK#XCOZ5l{M{ zinHk=z4<@s1FqCx4S^w`-}(yVbB{hJS{7DDCLS&#$&ixd9f*autb{2b4{$6sEpuER zkgg$e2`qT)`R|DPLC?sVAqG16YR*F*7#bEkY0h1NQ@(m!iJIvDv%6w#j=Zr=}MY(@K z*QLu2N8QaHNA1R-K@&;yi9g}Fh-h-Anr4Y)DUl#n^Vu8{Ta!n)?NmN%uJ@jh?7*Wk zi%ZST{-C_cm-M=1@+fR(h{?V`C=2hxo+^dPbd~LT-F!Vi5IA)x@-U%njO=+95VFVF+DOY1(rz8CixIoMgWR67Yn?W0oBf+l zP+F*|th$`%!|_5qsbRztC}aVH7A``X{taJs2c}mQj7HS``p~K_!JbQi z+kyQ&d^_`rvoPh<^sL-0iT7!GgSH%Q0VX}fZj6$72GAdnJNl1Vomh`4=p$*P1IZcw z;&18hE|;a~*}4`4YXo@n7+h}dRYEEYCa;n!imC&@QbA^>-)cN-6JL&H29=Hdwme)D z8b)T=^2Ulo!OEXoiv$4RpWeP}Lm>bam_6b>@6BL$*Mpd%eJ?vq@g_@oMTN$ZA1*a+ zE7N1<$v)Nj0QH0ecoWerq}p|Uagfy`$ycxpzAtVIs8#V7%B5&EE#dzPD+e zBAMjW^EEWDQr92@k3M_($NI}Sz=jwBGZp%oRgjcgky&Bf1s%iY`2~H)S`$S8&odUM zv;fAq;D0B-j76V5KDDAv7HDsx)8+1)WCB4d>0E=dNDrH4I^+Wt>d)&w91U)ctkJC`JW_~{em>9XM9#Mt>+ zB50-GD@hur?V($bo=s7++qfNKS_d=MT~OwLu~E*Goi?we9DK;4BtVjcna1$UcQZf8 z+kTUN$Euy;d;vGIrO*~1DJaqnGs(A`-AXuQg7xpCnFQ!#fi<8t8LooEOKJF8x zX&JhDUf=gYpbi@-h+-KWi}NtY>!@?wfe>}{Gv zjd|L50-CGeiu?^F0*I6LtwFop)&McqRz#Xfa3l=afB}zWMvTEi9p3wxEuQ>xIq8m@ z9Frohm*MB}=kSwW7tr&V;^nlnLy4dIQ^PcX`GDCGE%3aaa_~ZBJA_ZR;5(>qd)WLDYdT-K%mEZ)cGD_Q4J*AfR-GbkfXP=SL0czCB zwH6`2(qVf30oI^+qg9gXz+ zhv_((+eiY`bN)`eQHw66kTN2kL=Pefe6|t+vvF1`MI%P<+M)>aW$otG^%Ptv?z-yD-aA=;5trjt~{5}wF=9zdar9LO?v`Z9*SSrF9 zD`+$cG$?X-zndKmyPJ1NK_Dnw^KTX z-$)w`FoooNc70IZon7E=jX022+VP&4g~W}&&t(sbAF*tJE?jr z8!#x%TiI{12iW|cj!@oCOnSPPZBh(<{0m3DhREn`=3a=Jd5cu)I}@eHJPM7BTY{+v0(GDC4qMsN^hhf zkj^_0Ed26GyRLb`t!B$!hqv< zbmdQ2x=Yjv&X$KaC(4MnSDP7P8`ADb0>JI*J;x{ZzEPM1#JytphGFSHPpZ*XaIwhF zth>Cjs4Rj3_X7Qf&^qD-M?1JM$#I`j!-38?aIvFI&I+u+0NapzF%${*B=POjtyE9a zaAM4sY*Ux?`-HM?mBD&-iEQvd;<)^O9Re2>IVhWM1bcyua^bb z#`<>|DUXt}U#y0Wi;Fv~&_Bra4}sB5rw8gLeSJ2)m1O=*_G&Ys9nv?qGCZm&)m4%f8VPgF{#fO)$JdHo6m7~EWfc6#- zaC)+;{;SC8=_2~=yWIhU*URw=)BFh&X?WOKUUc!!`n);oCctjFzc_b>yd^Sgkv>SsseJ3Gf{6z2@>56BXwV(Uy$+StZ!(8h{{Z6(@rEW} zhx0t`B1sk*WQY%O1LI5MKAifgt^tyvA@kR9mCRHR=D==lM{{V15J^uh5awVKb*VG6pxG{$KpwC=s zWkm82xjP!Mp8nQwdsrfk@(3RtXwg%+EplW}h;I2#G|WZM)6>exk0qsqwp7Ts5*005 zYK@w&+@1$T6dP`!_x(lGVjF4sP4w(pv`8atcUV}=+kC(ry#iF-S7Su}{{3d#M$B+j zfH{o(KO08|!lD+i=>YD)x%851{pk1og>>X`6{wR6canUm&>8pPsuY`Ltmes4S6-fY z?c2Y8pG`;?Ci@N#5_306lLu1C%mU|m8Z}7A{{X8EPNWZn{Ltk802XBgcubQ8u%iNd zl?jS}t6Z$NX+QxeeLP#Abc(G(s1UsK$s?|%T2du6=!_9wpAX0J1d~yGy$qb046-WC zCQGh0mtDa{3jO&Un!kRe+lE+5_%~8{dCARSWSrbw3}$RuVh75OK3i=dQGe>bLdc&xzR3?N)AYT}Y`~|2thrCTD zCRvT}r(h!m2~<2={umE)?mfu9vudi=CeLcowA{Rpy!oyaO{K+?c~eb15v-ABd1QGU z3RdnI0th^J>(F8W#J1ZNQFfb?Ifo?87xuZ@c|znPtj&=TMH`47&cF~)Vh_!pZf60B zu2jQPnBhDMnCQo3ZzjnZkQVbp0z*=%7kqB~QHre7`e)Do0H|8r8nzabHk+Nl2+XLb z5t3%fT6>JJAfHhJ?0fsr>p}u75f=>`e@>#r#)>FDyA};S)XE-0%N4T*U zuDOXOBMqYEUyNkJ$O(X8nap9xMFj=!0*e922CDx6@xkdro=nUDHb9K?^n7WxB#wNy z#c4520iuzWVUdtp*fhZVdsof$;ZN!wU(ECAh^o!@U|OGo4E_<02xDlnGM=PXLVylW zleF?$$G2-A71Ez)@Y>60duG?YOpiZ5UxZ)bt$Q8kz`%q^x|V#4E<)@TjzhT{hX9aN zDgOX&J;*zM^5nq!Z>f6Y0AJI*%l#+&evy+K<*PwFur!6xkP=@l!+B&Kv`*eDxjyHj zp$VcSwO3V!<`k?lQQG0?`)E(IPe zeC$O29)mAPh~wqXvSvjIXU8wN!X39-j(Ol7D*N<^7^+S%HM#Fm$_YBAnMNQ?gfrJBoOYFU$IM;F%1DH76( zbQA+G{no&MJJ)`>A8P|E?V2Z5XmpgiHeN=puFBYtFvHr!Z7CjHN}#7J-Uciz&-lM)<9E# zc{mU+5l{W&Q3o9)$U2NGJaDs?VX%O%PXKa4k>8Fv>00_`TS)8~#ddyi-}k1))1rb9 z!ZoQ?mG*hzSJg*?vIX|{V3HvGDQ)sKDf>w6@_mRSzdZq@GFzDwsOmQ$@4g~@ z%@h6>pCM$PP%+(R^U?QrVm5>97MOAJ4Rh379Vglkf85fHJ*!9-Ui{)+4@#1MuhZj6 znHw5H*>VE$w=Vy93*mShY&)uAjSC@4m4A0O=R>#!n07O_7|b7CM5* z8}9Q^GViA38&g0Icm#ZPT_roS(r5PXY4^$%InHBG19i z0w{14Es=Fi-i7gfNAQCK`zDr(3+v3I&EKf(#ZXY9MLN_4>p<1 zV$FEB8u-fU>6A^!KWR&afsv3BV$US7EV5)3AeR;hUOmR*x9#oI9WnqU zOiQWaA$!MI$0Jk4!i3L`Wt%C)MZ`scCXsgjZoBs24&6aT5=7Icjey*D)*iZEMr47p z{GH*8exfJ=2?NpyyP#Kr-`lrTT%IK;AjtW_wH!$_2-LvxOBO_)Vn&MF*_8qSKZxNhKB1!%;%T2uxRLDGu!%>M#1Az{b3=<} zQY?Ss`sQ=bm~*+zrZV=@PW( znbxN=;$h=rW5*QFl>?7lWB~h>0Nz3Q{{Y~gdPZEB6-Xf7F%+30lne!bG2*EFh9TRB zwYwFxn;czGyW^v{jzFN$Ji< ztdi-l88@E)0Jt7b6uJ3n2#Q3?c@|e$&6rAnNJ`+FC){v41ql;Mu;Bb7FArgT1aPKY zw8#&c2bKv8#IOv)toQs`=eJK+#4XK%1lFc_vLeY=GtZFa!?J@3Q^Ntbg49j+Jof0l z)FDCO%&>InHtdo~_Pa?Y*<3rsNj!2ain`$a-u?PQdc|b~RaM0LZY+=DdGgaJ$$=^Y zWo0epKGr0^ZTwiO;EVa{ble$d($S5W1EpKjd5eLd;cko)=k6LMY^!o72jIr7xb{ zk8#f&^u>t8rikis6!>FRoa2ZKM)HM}W0Dy{Y~-E8fqQxOYWF9p5E%N)Iu5dzQq7eW zpXvk&5n#+3;BD)4>OtLKaI@^+w?qPJB5A7R<}h50#qxw@C559~kyhOhsV%dEN@#O` zw;=TEeFTBhP}_-^>rn~xyhw4~8P#_t<|Mx7^{w;lM|0SB_UX}cMkb)3)dkg|mkS0+ z;R&}L?G_6$BZVr)&uYHh)t>$OQ;!LYq@-ugD#uANa@C-b@+5yQbedaXWkF;?LWr^~ zU$=i@Og~J%s{6sT@g1j#K8`y~RGk_W6vdX!*Y8_<9)I)K5Jp6rpd)Vs?*P;xk5b4n zWIvY-ZMhaU+EZv<*Ico>;CB`6&=$l9#YUQvI!`cWn;%^sY?zqwPNDWX0v#2RxE{oX z+GvYlJ^It8tVTr3sz)kw{PtrH3&oeGnlD*rz02|xfo|GojS8?2v zrf$LDeq-P74zXp=3b@?#-eg<+(r;@DH_ed4+PWlTh*fd{Iq$J2JZ{;!G5H@*9tqIJ z5%QI#c2MoSjw<_cM(Vh(q(Qp^I-s(8_s5^@7x;f()g#15Sq4@Ri9il)OvKx6u6EzO z{!Mo1Y5|&;2m(=!urWr~m+IilAuoGyjk)QLb~NC-P^1QT7r7vGMw1v_kgW^8-PK6n$DGkncl z$sw94A&qz3d(pQc;i%c7F1yk9>1_V-*-dSqpw0^{Fl@$Vof)0Qg=b}LyMB8PJNM(O z>1pr;hPj|gKM#g4=Q|KfpN`S06?bPOlT939n1);ADPS9l;<(^jSvVbH?BKD$>F0qH zc#{J=HV0T_Ai&~S-2VXkAzr4w+t?F*yB;r~5tIVCs6wvmIP>`aIGJM!CDL9PB&nR5 zE`?cG>;?H9kE@EV;_tZEB%0*J(m;v{Va=VLDQq{BBMx24SB7__CP3!t0sPS8 z+;x~CUl^N(01%qEAN*e`_=o5rj7=QCO6>?`2=or?S_E#}$2^WWJPprv8{Fxt?!WRE zfsB!2B=H4R#+44^87lIzC8I!nkKNv`{{U{C^u<_+x`Z_o&+XDB)-+|*wHY&;56zA; z>e$BB+Qqf7C!MrUzkiOSv8K&ERZ+AY&pbEb5|Cpl$%bg5Nd|5r$@+NC6sszyB(?G1 zn;z$`8g3rIu_vplt(Nn_^N%%MPZBL^2%=|v*zqK2Hv)=;@#V1h+Ce3Iu|My7H(bv& zdp)UZu0P+O+6Vp0dGiJn#U5^4j^$zHB8lVN#oYEAn6&}#&$m#0%xjsc5klF(A5(JA z8y;6WWa;$rn9-Hk6+sa|SfhY_RK~Xf{x#G!0aH;IB!l_y;T3%hl4^%083cf`t1k9F zX$I_mE3hNEBj2TSb_l#rKnzik%cjkz&6DS3i36}z3{-6#p4G@IKnI&0@2zYx0+G=1 z7G}pRT2y%$Nfs~Dsf;X$HpF**p;GUHd-lHLzeAZ(K+%I{=x;jW$s`z~8VF>9JwFyZ zBoH?;y>1lC!5rEAbO?ukK_&H_UrvuwpDqCec&Jk6Ff3;nm!ZL{JQBnY&*P#7BY?)N z#F=^U$()%VSbV0O#3g91DYrQ)RM{XM-*>nyJ%>fPu^nu!80R}y&vx>%vGOtF5i?8% z;gJfBi{{o+1rvRKwHt z;kxqIbdqB`lj{cQdHikWyOHiXi-iV^-J%$2?jJvtYY&R#)cmbK9xS19Gs_I|mS+7s zD|NslcRwfg>LXEs6&<~iD6u{FQhq7rZEwyn#gPlh5Dl)RBC${jvecxhzu4EeN~EdY zWeDG=?vogbvor_P@^j_OF0$ifJVE14qB3~fN3itSKEroNqz1&$H3Fz3tlty*XkeB| zBbGQ?A|#DnjAXXaL>|@)16S@Vwez1o$F=^$sJ5;=Gt^&X3~hvLo*%>UR#rnY<15b@Rgxw2NbFA2 z@m%-(f4Tx6FluTxg6;j{*U++$iSZy$)FyHfo-n0I;42@Buqd7gzmAF0d;Vnq0Qz+H zS95*rkAE@ndvT?Yb~5cx(>c^JOvI!a7&A+NizVqKuEu{q~fE5 zup|xN&^=xXZ)77;mMIFDfsm$jyh=!Pp&zM4pts5N&0# z@<3=y&vwrkGFQnAtOu7Kw}Oo~}k9A)+`vfFFT<`otWOxNs)Fb>rG| zeeol3vW`|;;pN3VU`~u>3apJ(0Xuy`7y)CR7<+UNiM(D@TPM3vR=yqeg#Q3hd`A8q z)$wx?h=G4kDmJ!#`~gfX1M90G_Nxb_)UYgZ6WL1YS|3UKMUq{A!xNyKK_fJ7s$?P% zfH74f`5<7UFkNrdAp|sxRm(wJu4G`m>$6 zjRa#SAV~A04^BSX06pJ(09SB(0(xMet=tc&<$|!WDf}7YEIe&%D-t;}B$;7x6EsCu z8d0?F_u;s@=}5(sC#buR9dr1N+DUaxYy~KTa7B35q+?(H(Ucn`Uq2teQX?|@Y@lr! zkMMN@u)K#QWjg?AQcH}tVYc}dVE+I;`gH_gn2xryc{FUe^-1!ihG`?oPd-RvT4rVd z0>8C4dhhelRlMAZ)e50ju^7&Y1_T7-vqKE40U@nhayO>AwKPHJi}${Z4u&AIPSXI( z&wNc($Q~SMF`^rwF_F3V6G%P(06#rByTRf%mPXUo1+VEJ-?WHPns{W5R%y~MBv2X4 z5!mtC!S_5;^o%nbN%j-vHpY)3^fsu{Jwh?R{+hf%?X$2|pN@UcZiqkuAi-hV#xVo& zPAvFYIM5|JG%C^tdU%wA+rjN*o_}tG5+i8S0{nSN{eK~1g``-YC(8?v8YD)R6Sx~- zPpAL^A1Z&2fC0HZ`9@VX1XYEPk&yWrlPY5_(IPO3e3?S+*h%h57NYCpq7CyI#?R6r zIQWuj(?v-X(#D7g*h3-}CdG26)P2bx_&j->!C7We>Qm|(mOqz_GDIa}J5Jr9w>J8& zQnuI!{{Wtk97g!WT91oyXK7Y*kBsRv8EgQ)VxLi0P)_9pkO#j6`*aQ5r@IU+O1w`z z;2fAzCuvlORH*Z21wAaRN$f1`;;Y-+s8xuyW}zA+($A+#`3W4@@koLQyuF|`6I;!2 z2S1+o(HMwGCu#c6bykZXG8e_ff;WIDiYXmsX@Atq+MCn`cNNXp>znk&U(|B~)3iL@ zb2An3QI<6htFj`?<^Ze(8W&^{LdOT5n>EfPc8-yzsRY>g zcni;i?nTLCgt z8bvdUWrrSMs#ArsOLiND*K>E#Vp|s?s3;#upED{UsL7G^bL2b|6=g_mO9Fz!T@G6B zfqIH^@=}>~GV5Bdtk%1CjZd z9Y9mKVEuSJeB(@VG+YQIQf7$~IURQrvOBn2X9B?Vp4^XDS=eoC^qUof3LRikc(3a* zcgQ}U%*S;`2we~ZWmND5vwK~McTXxPL2b8SS>0EEx#*B8a@OspeFIF*iajo7@@0lxecNMor@Iyq z{!LLn$DW(@2^Yc75d8f=8#hK{8+mx|myg6|q(-pkk;3-7JW(7G+S*D$vGSR9GvIUT zeq2B$)A4Y1Dd$+(3pw2@!Xu8T5Qr!+1hFK3!?@~+rU4{C?#BneSSALD7g3)F4k;AP zD@D1S1GKT&2>3SKkBau^?od}3zu1XE4c2jKH;z3-IX85Xa z&smP);gqXw!=&R*@^t+-CQLV!!8~42jbhv*ReK=`8;y=^@y!G6)S9;gaoJgoF!h1t zYZ-D0B8^zZBFNshFDyW?6s!I!Zol{G3$e#Y!$EmG_tpokORed0LL$Y*npTzuA}83q zh7Vx&1%5fOd!D$OS3$dHn35PrhEn*I;uv$C)&L`nOldsi9qxyOjG{$oDUSqo}fI38FcMUNyhZZaycdhcS+-skcd*p)CWYX0e-Pu+I+cspVo|tR~rpd1{YDvb_pt~?G17X3_$88?xnQURZzV5^Nn>( zsd2Pv;)i;!J~DZ3+dz}dac-n=D3MePYqFt#8Y36q?BROaFZQ|8I=DYLx9X_6}0X-nq_IhJn9?#ZOu1xx5 z`3UbUi#aAqQLciw5ym@!d2@ZX*Bo`9QrOXlOHBv_McMc=cu!Z3K)F*A;x8qQhwOKN zea#Ph;Psl8#?!}jJrp6-oJj|U7;>Y>=3iRukrwFkPd9gb@xb@@>vLpDp(BW^QSjUv zE-;rZ@?)DZHph_2LP~FPjid2gf(hwNqCRLvQ_r0gv1zS1&rAp;mlc{r4)42nJngIx#97Wi3*&p(4#zif>1}vhp8?$%Pim=9U_kh=&po?9HSIc#l zHcW(wD)~l+Fe+*z-oXpNJl`Dm>cQ2=iePOGWnT}|=gd!~!-=QrQff_)5rSqS2PT4& z?14G%Hv-&t0FK=C5^VZS+s@6Gk=CJFoKb6Gp9Pmr$Bl`cgHJC9aR&X=1MS7t^xot; z?pZX~Z6-QyEFbE1{{Rijn!I`NtV+^tRm5l8v8a_(?dsaM&2l=Qx*%I(DfWRtDZu2y zql4(=&v_pbeB9a5ownLb3b72}FKyP`t&`8UOYV;s@`1IPg^RD}$|CVTs&n#YE9K14 zel%MGLxHp>{yyvFY6n+}Z53H0Z?MB+>FbSf>TC(=P@~iJm58IP4ge3=eP# z`-NQ!2c`|1>n@-uhj?$nc^WR6D{9fto*m;D@vN7)ITXlSlf|Frx}v(R?i@^7@2KPr zA~XC--7D!eEhjJP5h9XgD3Qo%M8G1XhPWf{H~#=}_vy`Qan@$o`eX*|9z^F^@m3aY zu^P#f9HCX?8%4ZfPz10)%G4Vd_jBHan!{boX!|KuCbB#Jp#C+{-8z`Kmm2`02j|xfBe_NGctra`h>au zp&E{`f4pPE668ip(S=w$WqFBBV1hx6DBJE&dcLixx`s%Z6?zam{PmL`)GzKI-}9iv ziY138RE*6D^|&hAdwOhuFW&zEezLNVcAh5BXDRMRrtFHGXc~1(3{gz8QhZrv#Pf0xl|>WN#(z;%Fe1nT zxZsLE9Zi5HhGwn$sH}J&2+LgYB1w}bKhwuPB&w-2z2=8%g=DXKrS(;f-#6BR$Y@tH zGU+-1LF11vIPWdx)AIhBTv*y%m_%7k6y;JBE5VPt`l_18VMphtb}3*?DWY5kJRUL6 z^ENLY1Rhpgs4?+jIRW0h$jX!`Y>NB0cJEX_8dt=Gv8WF1<7m6=$uAJ@{@WaBkp6t} zl|+&Sn~&V{ z+o7n$_+sek74iIk&&=}^NL+Zb0_5en$Ubk9V4ay zVdKV)i>0KScRMR2*6jATM2bHrl{MEOJ99SduNORi(xbz=LTM>LMuoxP1B#8+w!wLY=Rg_+HG5ilR17NhbvJ?A&{|9vJK#dFuVT%Ct0X5F<{4% zSsAB^O3u_H3`H6OfFtsG=i{W*IRZA2V{hg4g3pq1U@*lrh=U!Q9oN_7NbJDTqkJ!K zembMl$>}pSk_GVz$MGuhs)g;R<*I(0$T2i!co2oZlckDV+!k}$73um6QeP1i+ z1aAf-WHcKi21mJ2FQw2}AWamtfPI)fQ-%Sx!i$v+<3K_2~73K5Ts zq?Xh%p~{&t-x3v9iDY9bEbQERSJ^=1fOxVly6wQq?IY_3)A1q7U#m&uo;-f_8Ilzw zn_k?4RDx@Y6i-P+a|i$sIg+3M01Gl;@fK#MgDxC$>JmOm2^E?gRyIQqa&{)#Jd^M3 z&}H1h`|QDGd?Hx*Iy~Jo9$B(;VRW63m5GZVmnJ(K+IJ9czySXM=Zosj-X0(bP44}o ze-wC|BNI`1;$sWog^m@Nl?wi=S3tW|kk$_FK<)86sa*{)YzSN$+y(<2{$v?)s}+}J=BfYLf4V`>2h;b zAgn;9&0qNwYMM?yMo;%hot(_?7o8$+j7vZeM|xX4{{Y-RIx4hm7|ZP}JP!!Q(qe~7 z#aPuaX7i&F?gdNB+z>_k3%~nC_v@LDoE!I&0K^j?GdsmoO^~aNixmjjoAssPi7INi zBKaQR`*ekRnX1CljP;#GmT=)z5yH7R%_i^D2h3B(@Pev>o=+yaq6rpqqyxvFNnN5% zm8h5798szyRPk|UqL}*6 zi45}PM$9(HBuLDSkV>B1A9ALL9lkn2bu|nq6%E417|;n~(;F^m1Yikf4)PXY2(itM zIpcypZ>k0IncNO8p|04`Y4;k&BUsMWQU3r;s0Yhq+kIF2d-YPLMGbH>JWmrxm#eOI zEOB7oD?a}KP++`Of-a2%`wwgBbXb!Pu7=Q5d}Q^Ob%eY)|F${+NJPWRVdFny7;B=H^+c1YCQvJL)b;7!C(vO-gQSU&Ns%9zLlVY0AJw%$CzHVU~Ld~TJvu@z3jyZjP4C#pKIAPF>Oa9H!*2u`ml6Jx@Nk%=ymzQ#0- zOMF>2*M8OTIc-m?oWypIpLMA~}*qlvsC+u^*|z-GDcLJ%?_hY&K?+ zYfr<|`24`N{7kJUP{UbdoybNplFF?!7}wOmf0IxnXy%80I+HO6F|@|~k3sPCo?>cH zW@zG4>5fxqXrxw-B2~?WzQVz;U^`v)z~2H`sSRT=Eo)N6UovR&a$ablb2jDL`0Pj@ z{ZuS)c;fi!2^+3d0>f=hG_Ms)smNMrNO)o~O6WqMT5=hzenr=7YUK3#WQN3szL-HX z)3Hv6r{s*dWJi-~yOCh37En|Rp+@e_+2fv^vvnQ$$?RM3nUD88*fgk~beGnKHjIP0 z6mL8l_ykuJY<8k-8F>-|ac#dp+x?6*=S{KMect!S~sza|`_q@OhqhaI9un*cj>S?{uAi(mp zb->V@8bngy89bGs>p2t;HQaZv_UEQs3z=qJ&$>oQi8K=+XNp;j#K`Y)#-s%yYN!$0 zcYZ%TL>e|`(oWn*no}&8zDkJXc>--kC7MGa3_U;^95MWb9QCvHE!6T#71X=uzmbfh z)h3w1Bt{TrjV4!`_CTO2JaQ37cpFW7QTgfr08-HANx@!5GArlE^qxzJCZn%G6Qpsz zN%9t6N7Ab(EJqb%cQ^6~_p_1&O`Aa^-F^GuPc*r{sLO`YD8(n~@tAs4?O6fa{{VFp zM3KqkxaxP(Ho!o0gN%JX-f?bBk!f112!zOT7H_9gNNCW#FekqLOHuh2N4{4cBQ@w3 zI%=mROHCgxPwkZ9XJy=~#+IDfvQGn$2gTn~-$aAQ@hG}x_Xq~Jo`cQEiN2#2S4j*C zH@vJspbs1a&DDWk-4X%|xuZ>NP!wm(wf_JTWO#Q`!Q?jxurB0S!jRiqRkA z&&f5_$<0b>pejj@7a_I0Sl~yV6_7?(c;CLrBhoAY2ep5Qo;< zJgKNjG6?eJa+wUwI77iJYq)JTD2f%(-Y&$|O2Vo*&~?m3!iFgE-xDVrAi(qD#%MYQ z+N7J~X63SZzW30&GnqlMWZHOlMUH8aVr*Q=*#i`C3zj9zdy8Xy3M1Hx>4_&Wi>^#@ zf#HLbqH1SXFyu4H$kC^$C}X)~G$=?21C9^=>=+N6&8no32Ld$Lb!aqA18CVKW6PRP zAOW}Zg1Mkb3>iQ?iVa7uQVNtA@A#MkH@psU$j`?gUPJ-#vn0)EFlNh-Ayi2S344&J zup5oLZ*Q=(X6SX8J?47bl;NTHxo`vQCRC-6^Cr*}h% z=WDpg10p}d)8^Ckc^+Nwjg7G6!~szxcO(6$i{#g006xb0*{FnaK9dUS?;zhG^YVuH zau#gty*~}3Y2%hTLpq<*jrS4>t_tyF@yPFErBk-Rf!GyN{cbXmBg&f+Ij70blsK7P zKS?blB&!j^wHxQ!zhgI20hZ7zPad85&Gnp&eA%HmZ8Bss57r6Y-cqiF_A9r!`TSo& z*+&p)BQZPi^YZ>;7x3OLotHH8ndZq{iHpX?V`)g|haa1&;L#mK>R--!fQkV|Dl@>y zgAPoHg5}4PAv>iJ1y3(+@^6|WZCCpf)fK?!tjVgZ*&Gi40BAOTp9ZIiBsmdJis?Es z54W4n~Q7cOfq#dfmounWD*JEP4bjmL$5NdlsH}3QJ z^Olliqv*Ks;!X6}`O~o*z}y%u`9jC1{D`4Ohdgy;pf_}$cB3n5@mR?qRGoG zrp+8XBaq7j^AU1xF58H|zX4TcU02%1$ zAyh1SdUW!xuq@2h!t!z;lq1fy9@VsaV$EZ)CywKu56@8!LlSd+Wl>R-1>}68@3Apk zR)u7V+_T1$`kmwqPR@BHZ@D9O;rz{-n&yQp>F!tp2Tw?&%KE&_Y4Dark_n~QOI7+< z^1k*-tLB>j039efsdZXIx=<#kANQ<-9z<}ss3Tm1=6y}_+rD^EZ@2_kL^0}SKXwk7 z+_pz}i2nepnV;VDQ!4`+&fv%eidf%}#;S(lTywMnJC3RENnG$`y`M`+KRgfL_c2F@ za`Lr^vK4T$3M^|NJJ<}Cu)FqgUc#@C1y{Tl_jqTgt?q?0a$?wJmr~Ay0dZtFlYXg1 z1!P$O0hgX=j(F`}{?r-7u9k`_*^IPJ7JNNW z?s*1)uGf7|^J9r!Fh!1GnN!UyIIZiUBFPywTSupG3&2W?>B$)~dTIwJJbdME zhjpb*Z2*c@%0nX!))=Rz*pc!o>bV}^^mhSOB6P_IcM#tb>MpapO%`0yML1a%7Bjhp zcfW1M!*>JP`jap?JVw%7W0=4~m=H&m-di5FAImM4k^ z5>7?N$lHh;lmJHz!@mNDy>!D+bb^?8YoUf^ybm9nAJQ;`7(0iNjC0Hs6+k_P+ing2 z0PHAq$Lc(EnY4YVvwO00Fv#&?(<8_7Ru(vrshQb`RVGGZU=BNg2p{Fi?b5q~Wwf;0 zZF3#sL5?v@@<)+7yBSNUGBC9vgICW3zi-@hxT*$JhCEEP$#SN9$a(zPBa%InHrXXN zLz7@x`99;|^u(6QF&F`WIG9HwVC2b{9w}Uh*$nguMXq`F=jOq`$4Cgfm!ecH!LvL* z*|?`7SkoL7aU6^pmad3fx;)kM{{W7Zt|3+zeo;)G4mi1T8OyVba%5AukjqM0TEVue zGztFzez;;T`yN+y1k>`cq((=^B}rmQEDeNkZAkTVbzOyWdIg7BUno-LE}^Bzhq7Z1 zOp6<%s2Am_;cRdKqIs}e-=lR^Csx*GEpy>zX0|-BxsBc}zKI!Vg=-$yV~QvC>5vYR z$DoL{4-RB%NghB7I4ao?NCA#O06UO(9@GFNU3>IA$I>t=9?YblPIz(`CRC`RL@69% zrIdg zkB2))3SmV%DU3KlxByw!yZUIF7i1orOb%+{N>Nvn)@7=AYY#BtLx&s#7D>NL>M{Y9 zM#~|6>y9j0{{YWSRCJuI$`73VCWAhN@#NGwq7{qGR8t?4SOBc(JAv<9e*VFlgzd`Q zTvw~RVrosl9YCJnc#QdH)oumx&kfDh9{qOe7>%gFEz5rm=S0~ON2_BbZMdv4BZpuC zqD6bsjt^pg1FZ#@gD`;QcWL>?8s-EGrb&upMtDN{Rko^a^#Qw(O`D$i~6I^Kv4|S5Ge{$k^LfmQXk#u&#Z( zj+LE2p&r?7&mY7`2CyYaaiU^g}fbxP^7u^>j?8NpZ5vf2sUNs>#n!5Fj% z31UD!n1!nx3nX<^uf)Nue0!@NQw+sPYlXKf;_zoc`Eofp(5Kb;hUC{!$D+8SjA zZme_v0FUFOX5EPN1rgV;)&-xft`2nQ(J7B>sbUw*K|;3iM{%G}YNOwyyBx}Uz0?=K z@?gmV&5m8MvL#SnIkHo9c<)LAf!~fOi{*P)dDs43kt0MBeBxHbmp?Npr4lr47(Pmq=0+qeH+h}6P#k-4^U_v%lp29k z!^njAS_~+#74g~=mz&JFTXqI22vsZX$F)~~o_PtXkE#jrd31$j!7iTyGOPwUqd= z{{U~n#el*i`kYi~Vx0oW?X?$+tPdcC0gt_C-JtZUsD=&<2=iqLdtZ9vod1I3p8>a%?T{rkzgAtI0yVk#dMG2vQ3z}X+R?RN3PK1L}iK;nWl2h zY}~HWC;`B|rh)JK^^Z~2TZyMm!LoRhxtfkt8P9<(7C~{lh=?SH+(BK{*+C?MT#h<+ zWhWwP)1We94E;JRyvZ|^iSeR&7)>GD7-f%uz;M)0ayygkdeF-tu6E*gg^-Z=UL%<# zdTed6qIn40JaJ$Td_w@uS4PE+=3G&f33%Ip+ySzv zaya9jkbnf%x{O9YXq(0wPxoy6xN$Q)>`a#36tI_9I|ADhKIgg~-_O4;1sU6{S&DSO z3}j&BW%-4sb!ggk0G7*iAAdCD@kh1yqsZxvRwI@qRIR|)Ws@Hk33BCvHS+wl8&Dy3 z0Ddlyd-opwDfH%NCXEr;igo`04#hS;UUoZ44rH#;Wn^Ojtmk-bzDHopKwIxbk@M1m zQNfdD_vk=41DNYe((+NN@62YaXYf0lQ(vb|iG}6q{3toe_WwU*s=A!qjFk zMJy1!CS{d}A!3L#*c=j1t&cwc0QptBkF1(@7#xmeb{-ZxLz=PAkv0xOm5X8s$G6W%c?Z5GY9NL@z@^h*k0Uoe5Rv8N)XgGJOs+dWq*Z~tcOdaYq&(O&S|@}l z$R3fdCaH%cafqbGXt2?|;}aB!Ho^-yJ;x-FYq0IdLwPW=k!Gj5Mr=5mOu=#tamqI& zsDDprG);E|vfsaAJ@2XtJaT4DS0TO~I_4nNGxBoqrxNDLj6_66f>0jCF>q^&QU?|+ z8tb<3C6`~)`S0U7(=s44BIP!1M<(Z#rqbSkp;%wJ_W;os&r|7US;J5&XYFfKc`;_h zFnP%|QA;%-W$vlwDeQS0en|xT^~|(49K=Uk+75Uhh`$$HT{kZtNlXilkW_Gy_H*iR zdk_Fy{{ZSD`f-Dpn#y%l(a1ju-m#YmMaY(XR{Co;np>u8#WA9fW_wN z*|0}4OeF+k8!RN}xx24%@746)u)=55K;SwWV0#b-(=qU3StRqeuN7ji0~42rxC`bM$pkmS!E9xO`)NbNV1%9m3UlvBHkQ^+QV$p?o$;~bjdG`oDW;W1z{)}2v^5RD6d%3z?bcJZjVP(7M|fSu zuns@CQPlDLKLm*!k12o{YDJ?sQsGzMYi(krpMmZNQ`8^=5?4n=mJNBoKK?L|uU!8C z47qk}e3KK!y*b*o=t}pY!9L%|P||9#HIPB@_ve_S1{ovC!)(mFcw=^WWR@{Z>$`xx z$Si4ZkA8aYERH6Tt4r$}>i8Z`CUg-jE~@K6)|g1DcDX#&jl5VD><>$d+dE0Fh%+57 zY|Sf9$(~4W9wtI#RUl)f-xo)5ZcW)>deK0n!K#S*z@f~`A~)9LaU*Bq;dv%)%%^PO zY|h)@UpP4he<8fvmlf|16eH<;s+cPfwwAYZ8QxOW}<-$g*` zWf6)1ml{Q*>Jw=Vk%+)MNU_Y}7i%pBW?HaFy5MtNK9Vsq4X?2Hvl&aHt4Aam5<5vM zD2-;@wp3N-xv+cpHGbgrM$$JGeW02=O>~?{GGc^auak=fF=UZ^*~*>+iXqKj;Y|@;!h`eG4w)DNQ%_#knWAZ#a$`Ow zYh$3DJp`dunE+x1{{Vqy+js8csFfqEI)x1p=O5{LP~qc@yl2?(1&wV;l(y~=9&Au= z$NoBhD1}&B7~{m6p%b`@;e3VQ`9*BAvXc7z<9i+#c ztgMg*B~$J@LG4O!=7m*tKNsmUVrp63M-UuYh6X!F14ErDjU-f3JjAjrm-y!SzTj{< z>$=KSR(lBT}j<{avET2C@d)d06g4rrs3^a1{9B|E76A_?I4d( zCB@&s=DP#jbnv4($^%ch|tl}v+c}M^j1adCuufN9~JrE<8AoxTVPm&>xIm(c?)0S3fhTr~^ z!L!`^`}+=t2>8ki$DEAu4~(b9)I7KZv+7d9jUSkTSjunOLwf=glU(-i?b1FbmD9C3 z@8KKix{R8p9L+qBCM;6O_7#bn?XYav7D2nNE4N6@d6~dBKu(8&B%8zht1WsP8MwIPrK3jowm9xtC^`RT|6 zV}UGCFEf1y4c1bbYcyz)$NDq+Swk}^-c3+Yc;?LxD0ELWV;3M|43ozeveV^%^x|Zk`;)_6qAPyxpbp6ji615=<}l2*hp{w5j@`${Jq@Gf6_tYLnMDRC)@09- zH1WosSn?_$H?UwWEZ*V;?c(`2U51@`%;1$6&-WJi!fa`BLP*icZzM|6DDxr>>23A^ zBFH}6ng^-_V&#w?o%|*kMo2NlIe8Mfj!}$~L=b}YYPLuD1^}MIx#%?!ar0P$>6&DX z5!B>&N^_9gfN10dkxDxPIHCFd&q06!;yErUOeaUvWrJ00hQ(RLf%dAgBm-=qlj#JK zzza5Sy>xNZKuHU=aedr7T+jNfFjfSCVc9SN{V!XILtKt10bjRV)<$5{O2C5V>JsVt zq)@lhnHn~c{K(hJ^%HCfvVaQxzm8N6l`G1YxSv)TZ46k)%zr<87GfTZ2_ zJ^HC5ZAmJ!whwudJ|op7%g+*p#gXxV^Cl=I`ePb^k+pr>fdcrVxAW8#i_F?ZF4(6l zCJieEA(T%F?^|a9#NoYcLkrpqao(5mI!XrorNJx7jkOOHhQ&sN`P)VsAy&Wwx-2UML!t{XYxDb$ z=1pjL**e6tNMdYdR*%hsWHO0^0!0tp1KPOfq7;#dcOV>$nOw;fc!eZyH)HPG8a2ik zk-32uC{q$R_UY9WF&8pwHlrY}d-+WDO)Dt7PXyvPmMP1K-S%u@2&(q|BB$8Z!gcH4li0^8k zamXU?;@0}Ek}Gq}j<)q{7#-ZkJp&gGcgdDW3r6T#W%Ni5Fth-2tT`NWeD~=_kllfI z1M4{hHP3wXjj^;h({MEq?4{IiXx#&EwKT|kFCwdp@5b((MH;xTs&Gej=K|F9>2jPf zt?>i_tOA~a1`_%k#E5;tRuhZt83`%FN$1oOxQ1HeCb;?8YVZVcP(>@wAvEvjiMxx*{ZxFSa@ zBqyneEC-~}wfB+m!#5)`7{6Lpkn^c1@ zCmrFGK6#kRu2Tes|Qx_cb6>7>n&KN5A@gz53qQR3rl)49Ca% zlpYB1e3>y%9x#YU2@?7qVYD?-;ZFqf`*KfFHbu+m*?*2_$MXD3uN*^_r<5|u7oQ`% z6(9t&tE@YHRc8YK8{w`A6ZNU&RPax4@70E6?>6(Z!db+d!^FIg_3(&v>)sgApGhd0Iw^BSU+48(`JG!MWKkp9C*%&0Evh>auL7)@;M9#jgu9cP=bwY7Iulh4D>XEvys>SI7* zWL!p70FsCgw;kCo=#F_kQ&(GYsM;EP7k$plQI?P0}>9CqA47ttiSt^}T&AX{-}WsRqu zUEz{EZ#FD?PdUrE2npJZzTg6Dj^5n#rRWKvP?Z4n=@bncGEHTsoMXWLU+CmQLsBhz zeO=UrpaJfEtaUSeC6jK!esS&;(qTBpF}uMGj_(j2V3T+RQ+Em|5IOf9D6^Tyg_X%Y z{39J3#VL^-Uq_21xMIA&F-FKrp`feZfm{!J=i^FMS(tU*((Cqt$%8I7PIE+>gqWgb z5;>*`y?tx6e3tM2C+FISQ%sy6#LT+dv4&u^r`~Gz-)m5+QGPPk zPY+~fLye@x<;@m3VJx0+u9th4we;{!8vCz-eRir0Up-=bH?;EKPfwH^Pw>(3@y*P$ zG={^U zP9v&Mn5F8yod7;UZA^!m6Wk}1*M5+KKyuhJVRJY)r#*GRe$4sE!YI7(csIX(-5qOga!^wtgv!X;(W?Oy%RFYSv&4`a<(HM9P{xxQf0r#P1kq zZIU^0xbe#XrpTjQkPlp^J697Eu-W45W=;6oIdwfbvLJ#SBdAJ!3WcPR$YMx8Xa~P; zKYpjb!|OMDGOCh?q&L7nSv;8dk;RVjx`v#YNJy+R6}si^*qZnqFgO79nf<3xH*N=s zXX8y@8$pg)ap7sA$Hj%R0>inKmLLJe54a!xu6Z2*d{jEb&<@|M*CXRUWa=3CT2zk& zOp|#HDaI*p3XV$;VgVh;zgJ;rGM+8eB!`LLFB4M3pB@T?7}UrW!$$p-?YcWpa%k4> z{0^bEhcz^*=H{A*hmK~a6okOJxe+9i0H8;Z+=XDj;z{-#e*FWxaia=q5Qh49_Ju_( zQM^(>uR1_@##9X?K($*nfyMid-|f<=1jO7F=u zt(KwO?fi5=sRGQ+epe^5BKmBfsdZ@HITy>|2bgT8Wm=#s*pP0y@6}bUWsUxr7FMGV ziQ9U_44W5t0JB9PCHEFID!Hov0CCcWVJv`*K(O#b-HLL2`WF}smizI0ytd&fFHw*>eW+V1K z-MT?w)MAT7ljQ;NrYdXNj7Bdm5iaK_&$d8SZP+jefw$ki17oAs!HkxRMq`_&OE#Yt zMkD0Qh&C$B>||y}un(VY_J{>Q>bE z)_&BMPZ7+;b0IRBq=zYQj@o_@BaXfn`I11uB#TrGwB8AM!s&qcbExM@RCZYRvZf_kUkG<=Y`fHEAC)H z=>x;khLecxB#dRqXE@t!m3*>Akb9Cr9CkPD(md1eGk#paeB{Q~;aq186z^8uquvSH zzSK#(9{sonqM@%dpHS^QP7Lzo<2qwOGC>NDC<%yJ#`RJwfqw^&wDmX4Yoagb7pI7x z40*D`BzW>WLd@}j%BQR_;==NG0Yn<>h^mfMu%LK}vV5NsX5uVcScMU+QG*egnu>)y z&?2jjXm{zT49crglG2M$@a8@ThhmFnP@X;UGI1P`HyjhidaQfjtLLj}s}o{i*3|{Q zJtn%m113C_`ixj!7du&8pQch+_M?BdaYMIohKbC5B3C0n%zfbh01Zcnti_KuEYYlk z&76cKO(`KjJ-H*>{JrS($VeimYwCDxRrLJA{9WOx+BTCOINC*0rXu7hXJRBIo8xa_ z4Osl1n3^Sk=0{0`3S-50@{2U=ysT*ak13u>ixRDM&!mDodm1C;Sm{}q;L7+$LHj~8 zn`=DJn}?oef{^qOh91b8_Zd4(el2I!20Q{)~WWdU?-fA;q1s^-L#>k_3#FYPR~ zeNsG(h`x&#%*jgh5DJLOg&=afO%urXA3Z$|lRAa~gA?ipBM~2C%IG|{kVX_dNVcqR z-p4h~{{TH5v~Xef!n|Jy?dD8%#B^e+5Vx4Z(_r9|IHTNyX1+Ug?#ASosqg%Y{{Xya z9~0&6Mi}v-5kX-6L82^ie{RE9TvtjMmdvmKX^QLLe;J?m=_kSxymI74>4}PSDyc3E zfCJr43ZcQV#q{KhHh7X3fId8T%o8sje93YW7j{O*dv#Jw#YtA$3I6~VQb#`3`RTO) zJ{YU1L*8Flze>x?k1>-ZF$Pchh9cRm8T0VDb>qKT`^MVY z&D4%AI#K|eT^DNOilrbAyVGW_jn_5QT;GUIItG`XJIr0E!{odYAjQhcD3LtQyH$5H zSt?Cm4Zsyw?mAC*iV}lfkC4yWIl{w}AH`X@Tg|kQ$T8MoGQ}M#`J4+~%zIyMgDwG+ z_n+{3$M|cBsbxzP(PB!BQ5jKuz9@TgZkSL9oA2$_j+r@W6YU@iQec^JthsZHR!HK= zWRtmI#5y2irl@c`d${e@L(r)%X`A81{fC}3?8$W5oEDl#Ss_*=g%#L=TSt2SdXaK3 zGUNuPs>gphzJa8`bv%uwj4Z=!@k%=#+Z)>WubKn%)VZ=JJGBEnlN3QLP?TtcP%c>X0;u;EeXFIV!81Op6LmO_Y>Z4s*$gg@S|Ty_ub%taR)_eWY=O;J9l8Y6 z;1;O!G->hl+`L^sAtQ?AKY5Z7%V1yxG%9)Zv%R7|fA~ z<9Qe|!liv9@;4E8`}DPu6=<&3`M@+U6hWox2-!IxM$t5hSdxEKMz?%8*+?uixA8~1)QHGlABJYpy z&U}-^7*Zx{D#;8nK1*(T3?M!2Te0p1kB|1_rW925^mRj5q%*_b3B))!`4O?p)F+i* zSkhtu+8<*cYTDS?w)B&K6wuOE;PWwiUbC*D#Sh+7L8Rizu5Z;d%gBLe81U0a5o2sm z6b%(MT-Ez^&Y(Yt`N=9XFaB$a?055>#;>I7I)o=9Pnt!BL4`CLAfSa-5Sp-Z^~f*buJw;$NwNCPep6H1Ld79SYH zP0=NaJa&JIUtgFyoGZKnIkWVk|CC0x0o*pmhVM%_^1h-2oAu zjWl2>re0JYN%s3k$ml(jOa~GDl_(ZpGtUoBZhf_c|7MHF3jCwC3 z?;gdkj}drwZ>EuP@^P`#B1K2qa#RH#VuC*I8pZQnK9C~STE$EVAW zn>GZ77~*3(8H$P})X@UWiODy>Bj>G}r)vf|F;`38BWda2{{Wx7BO4nd7a?ZNTxR-s z37Mn?hpE661%gT&+DBk}6U<%Bi-mMmm%;M+M~$W|^WsYyEV!aM72rxQBC0z_AU_}* z-%w>?DZbv(^}%dMxkV8wcU zX85g@1lSmoLW$<%F`X0?n`?ZLzysg6HS^M%`OOxMXQ$#d@upTPnDK#+5poe?wT)^d z197wOL%+v79=NF6zQ5TW5@?f>B3zT1o|0lk3{gb02N8)VOIvNg9fNc4*bmQK$xTC~ zCBgC6GYu_srN_mGO#zV1t?o29`xVtIp?P+0JF?hX1i%wrD)i?iY$^mIYgFN z)t77zs*#bn{%nGO{48{V9w`TXr0wa}3#Q{{=$V<2nBdq{@vtCq8qiu(CCu7DTh7v{0;Sp%_NeM$rxk z?8lbp{Y0KS^^heo1WReq(lyD3;UriVlH$g5EJlS7n;I4kLeKdM?ryB}U0qaFNRYtU z96|H+ah0ZdaIwM-kVHYvG@JlJj@;R?@NW47p|Cz98eb9T;g0=hdasA^vpf-vr^pCw zVr6!q(nT9FQd)>Uo4Xv+_8mK_*dKWy+JTE4-%n8-=uwXi<>1SXu}2O8BOL|GN{z}( z4po`gy&gFoO_s42-TTl^p~?GyllF9Nt>xvZRE9K&z+@E|%9C|~N4nX&Kd|U%X@TPV z{{Rx!qN*%9xAy2vEM0PlAxhM3C^CBs=hAMy=wE)cF;SBpL$UIVwRxe`^w}Y0AEwIE z78_MfSY}gxn-pvIk}RB=@$zZanoXb-B!F+*?V;~}{=fh(Bbz%Q2&=Iav(@v}ZpGAID4pl?n*9#oQajdK}TuCMFK-c9;?Bv*fAude|P|4lBJ_>2?Ef`@je$ zVFqXReKs|jWra3Ot&?70a2kUUYnt3UckRbk8d%AIlHEVZ{{TA%_$}4fNY#%20I8kYn`>l2ygaf= zlK_oO&yNvZo@GfCCBuT^i7cUjAoD;ThSI|MF|AY^7(G3E7v&pAfHl2JNnaE~^E{vP z94vVWx1GYh$*LAR4wPwvD0G186-K=@ zQ)J_`O_!8j7E)0+dZi@s=mWpG_}kQ&jo6iT3;-OCvtJ6zxS3F5wwdO}LB;&0@g8P!g%!-Ea>YkWIf2FZY6i1`-r{`AG^0oP?p5iq{D90&-ona*im8W zzuXv3(n~h>-zj+<0zj{eJGkSxs^pr0E~Y&~+qU%Yzut3`uMKf#$r%W+V`Kn=WeRq& zb_at^$22<G= z6Naw;02$-2ex?g9NQgcjSD5)T10oay|$HMw{p&y7c5TO`z!yIcl0mQNf zP^2q&^m2Lj9aCbj>KU2cR))jJ^UPxu_?f!H7Bhj5B!%OQ4cm||*W4^o;7}hu02Zem zUUCwcmt>A590l52%(Q8O!Exed5kh``f@`aP4T!J{{VmDh@_3e4KbaK z#{w#CLJYlIBOXZn`Jjn%lt(3`dr20)=W_o576&}_LJMLL0)SVJKC?raH=0~X*v^S5 zjrVzmHSb;f%}w07ThxZ1=Nd zRaZQ9#kb*4l$M(Nztl1N&)S}BK{8%Qq=;XgxP=RhpmLS&Zs`8qi8VV4wJe$}#0*#O z7wU3Hrpb>s370n*Brr(xhGk_INL3$gvkziDx|%KILhVMiF@5%9oE!*Z)6PozCz-$L zEufSFpdo*7yRV8L9QB|I9+7nbEyojRMqXB}D~niK zw$m895agt`9%h3gDC4DD{Y5K7+mm1Wo`szGM+l;aT>k(ue~Y!a^vzjv?;Y99mj!w% z`Qzk;vt7?w{xf1|?@BrKl$vI{4o(CQ7Tj!Sb_laLG^et#6?Mla-{Y>_1=NPljg!`+ zCDY_zA}5Y1)=YJTNTK%0UZx-x_h4vy1K;2Sl4C1!XPzj%N%lwPM~@V82~|ZIMeXGG zp|b41$lh6Ge=LHa zt1TAVPjB|Fr9e#}(F93v>AsV!uZOc`&6X*@xnxMVu|o?&CqfAY!Q~r+bU_4jeDvh4 z*OV+Sj61`nJR5_k!Su5oKL&3(A1YwZ7TEcMx!96gfY<&;s*g@oP$1ly8=E-(XYFJ9 zk~Q6OT|HTH-xBg-@`x=C-J;Zk$Rq(r@yB7*ww_FHaDZYllRG~)M9PvGAdYy4oLp40 zgU6dg{A_@G)!()C$O*tWlVXedxrcvggBB?@NvDonhm_-pIr8_asPj*_KBd2IRPpa| zq!ihnb9+;fv3@^(K9emkE-w)2*uyFehL0*hHql`!l1|otfK;A)8umQ^Kmj6ZZ)YwC z!~B?PztYSc9GpCue9V+$$ixDC&PXg2@)m~g$m=U83~2S6w7spFHZ=yp*l|b%EKetb$LW4(% z+M2DdpfHL~Qp>DClDP8*jUAFH3i-0}Ksf&ZQMRj~I6lXvE(=^bLBbU5e^ETY)Evxq znWTZEc;;QW;sDJuf=N~td@~jN*!~o1klrbv`!Y3Gmob*JtjVNgl*fu#aiWS@72%>M zCumYyz)}w3Uf-Vm26iNLhf6_R4c|ClhxKETr4x@MNiH<|-boahXsl|!gVXy-`WQL4U08h1>4A)J)jMtSB!D> zg@hANjIEZQrQJ4Q(Fb zwEVFoj(Z=FPfloKi6N|95)H=qnncrKXXar!k|^RZg^fZm1$PgS0JC-Of8HTEK3(Dy zss_|?lQcdZhFvw8o@R>@0T56I{C6O;D+9x^vN;32nxWO*tN>O&QGm(-eEbzPCjuM zrjs(Kq#q+DeOJUd@Zx2CTVyDaBaT9nON=*iPhwQB0{H}A$4RQL6cO;1($!5X8iS60 zFpm^!tC{5~#`4u?l4ztw0yl8Z%#3@IN}l`+?0vL_q}pbCrrr;ATzvCAI8f_4t7Zm` zAeR1>mA23nX6ie2tsg*8MCO(`Svu4%gcM z05{UuB<2xk6%O#kk!EVKPbBQ3MDoVJVp_s>GR{uG0M!I1e#J+BZ{Mdk=v1N zc10WR-@i?!(CAVQKrh9j^=y{Ls9$=Wyse)rNAD~WAA zHPui_uZ&@h;aoh;EaXVaLm3_zrG6D%2pj7CJBj(bG7k1 zEReU=d3D5OG@{&gB!%Fb6bBrhssK5X-V2rnx_;3TXHMHVI^t9=L_R{8$`O@mdl8{`5XpWElC6IobnhC8~< zJTY%+zz;@Z_0dn6oUZcT%2n9 z9?~_&%#$tS*kxB=R8pb^jK0<6P@p&?j>Mjh59-XC>Fir>Cc6GYK+i5tQo;cN;{@0{ zc#S~ycjCvl?s_8z`aqgsni-m8X%TBWT(Yv^wouw%(5+E!+z#d7i`p;Tk8YU0JmM%I zf;f{J%$YbDSz#oOS)_k3=0?B*qPK#ydsSN+tN7^!0A`TEs^(rj!^zCkURj95oPbfI zn6CBUx9N+%-u2(ubPZL?Az%475Nf(gc$-DW#LqKhj0p>}Ln!j61g`78;L#)l!LFgZ zCX8)086XQa7-`xzYCMw_^3u0FstcJM%eh-iVU3*F4c)k=lU{r>>SF0CAHWXGAEGN6EYQ3nL4bJ!9^@Hpd+JD#U% zF*G11oMd&!cNxiq`7Vr166eg)<1EO5BU87(J-I8}w)G~i`b1J25N;Mh;7l~l8huIO zNF*`jJYG>QX^fk<-5UUNV1x2MB$3ob-V__`PGUNi90MOI3M6Qe`H+^pbL?Ke@Jn~E zk8Xit0GD8=D-xzmnwyvsS)CvtWK9~fiLOprMb_a;XpY4D3+brtp&L+A?i~3}^p6b5 z{nyQg0UTQtv>$YmHpK-&qp@t0c7Kj+(^$SDuG5?E)-}n}(dEgLAV!$VsQcp~LP@x{ zr~^P1DnUKK@9og@F|lACk(O2yc!$GLj9Jn&WNY5EWZGEm1Goi7@7}Am^prRTNf;|x zo?zv^R;17s`X?sw+)Z`0m=ZV^yVz(*3Pe~!K{cf+PA;d`J#>L5y zrab_$FdmjCv#|4_q7oZ_n#AEndQMM?LZB3h?HMHimz?>KcT(uJC!$%Oa7s zOCxDZ?nl3WP(32uhUpZt5Ks*F#NSiYq1AP$po%P*-0U(&>Ql>8N|x2M1GoY`fcCzI zuBkN+hL};ALb?;rfYM^dMp`&cp+buShzv~{?fCiVRw%)^2eZTz>LkR{V8)SI6*j8O z+d-VOf-LZ;Y#w`8k2E<6aY#80B)5)y11;t#(%h%$1}}^t|1_w?n$^q5?QC+`i@97MR*+7rq6NH zwxJhhHkOjOr-|9+)JF}tx06^pRE%>gxQH9k+KuH7`t47OdFy%=lmm%Q}(ft~U*!~Lnl;8VYbJ{$8R$gAJozYJa=~Yjc zk&g!KcnbhkNUJ{FQLb;bjtgTFN=*`fx%AB^#IxZ7^GlB|QFe7kA*p#~B9FbA_B?af zBc?MD`#O{95_qS?G36byK2abGRscpE@wr%Y@ND+y+;q!DubFhxrK#rJS#|N9G(!?u zqXFmgY4Z;6vDBa2_Z)jyT1cR7dE)3)8&=EGbEP=>2#pMZnK2Sj zIzpZs0#OSC&Sd7AS(fvfQuxfWB20FyN$OOfr`&T!xE{pym{`Y2xPVQFr(f|#KZKhO zdG#It08uhwwCw)?sWQBliSVqnwOm)XJyBNpfD08;FnHMblN&A>Al~yl?#&+w4H_kz zaS!e3uKvK?xKa(u9WVtBJf@x<@en$M`B|m>?83;)D$$WrGND3>P(ZVM`amB20x?k5 zX?T>d$(!QopCwGV5oO?}-K-dg1XN&mTB6naetMg7Dq}!4k?S9LOC16TwGyqJ63DMG z+qKK7Mif8R00M^<)wbN=Uy+ z^ zmWOKZL%%Deier0Uv@ih>WOahiK3tl{N{m)_%!J93(Vfc~zH>mZ)SKj~zVzA9*F=zYuBOCDHRF#C(`>V4LaWOQkHWVnWA}xB>{U2^ZEE2FKUy zJ*LwkhVjo3O$$*vMA`FL$4PwQ6s@$y0x9K@ZtkjqKjcOB>W!ud7c@4ICN$G@T%A)2 zCc!d91d6-)^3ZY%S>tN}D!s=&`rtancPrtR{umgZ9nx0}EMH$XENld4g>b;NvE#4; ziR9Vlx~`cNeCMC6H66Eq$hdY+j}Ee#5yb>D!w;F1q%B0=t2}Z`k7L++x<2gI>X90% zt#{5Rng%r5Tg3w`CJSj=Af-1kLU${B3KnaRP#(jssv^W~L%7`APt%0cwD|?{VVOZh zL;>xIqRIZMJo^9-@6x&f;fjrFJw1G<8F=z&`B_rUJdj2TD`Z03_lITxMh^mwgIw9; zq|zh+#us4V4z<_$>oJQXBRX}6$moeWV@U!4v|K*rC3}OlsMq;&1>af%xBSVHfMj!L zzeuNCT)eGqqQ}ilxbibgNfb)4nA9qgj7aD5N3b5`^zWj;23*6Vs=H49pE-y1D_0Wh zMP^v%ow1_4b&X?=WZ7N8AL!(f&0jr8nmc%@qu7uH4eRs%rhWp_@$lVp=Yvwf)!+%0 zG?O3sc!HJ{U~$6!L9zSv`!xcQ)4GYNs*Xy~Adg$=aO|C5HM1temnJrcDn*pMr~^LN zC3cZ}R+`T5#a~foIr>W`iVyuOjw{r45zf8h1CA;f;nVV4DZJPq*cFq2HvBHqy}3WJ zHA6hHkkb^)wA(1p-&X4{FMS41c!jmG%$Nry3#aHB5XAE%MV z;+|PPX6|=UQO_N}9Z{DyCT1JFBfrEVZ0Kdvq|KDelAs8;g$02?ZI}{l0tNo`I-@Ad ziV+YU+agVKSbaxZoWUriKpYuraW1V`s~RfZizP)3g05^57>$Zy3epS0Qt`Lmj#Jdz{N!RW(#8H zvNO%7Pb6`(%pY%{g*}$}Bnu$-JoG|hrlF`P5IpAoCGh*{_z3`;3M4b5yzUFDA=s@# z{U87Z`|>Z2xTUqp>9|r@V&x8zg0lF30kq-}n74Tj2H1&kr1F2n6Z7qTx^`YBb=4q{ z-Qs@H<{EyXIS$z#xt<1B1!HexVAWASaVF4v9v7ucIS!)dT68gCi14F?OCX)+c8nPv z+KKfW;89a{1&)|d7AF^@MlQz4pIp*Wjx@9SR!QOiy6jmsFfm(k*o}vTaw7Y`hB?V$HzT51Y#o%{G3mp_~#4F%EX%u zG4gd8WRf}OHlY+TYB%uQU&rs#F!4>gVC^G_XNPfewXGI7r;%SBVvOVB&gC{h4e8>S)mPlxQN7~O>BP&Yp|?|c z89zS$5S)!3c<`W$9&B=rjTnH)7`$jM_XEqQy9D<&eYzylRN#QMu&5?)hZ-zQ2((#u zN0pG<s(-`S`jAIU5d7zOeg~BCWOhBVWeg4|#-@imC zBO@_N(|UL35qQrf(<>H6kjp2Sv6e4u11g3N;Q_te9%%A8=~-jxmB{EI%*o-_#1lHs zvMS10$O$UP?gSnWJ@4P}dhNSNu_#-3J7z5o^2&LF0n_(oZriV7bimUwh9G-}) zu>cs`QlBDtGE)s*4l&8KW!`{75D2qtEW#hd6ON5 z)R?_C4UtsWzygQy@OrJWphUW~xf2pkIys>YF47}Hrs=JTBwsCG_^zbF zh9;$|v)|Hfrs~?4mh+r|@dDmzvNA^!f$1an=85+w_UHrBpm4bcWBu(jp^q2MB6nje zM>^ipNVWv_769b;9Wkrh2fIJ4&Em%Lm1dpMW@07_DupWEp8VNU$RCcaU<#S`gPG>J zsLSEJ*Flp4K&Y=PHqZ+NJI+9My0+zLE69c&b-RRF4An z{kVZ@Pzf`9?HkX=FO??jc2Tn(O$sVFC;(amzVE^6-p;yeYNS1&>Yb|DsD8JJmo{@{ zOS&bMeP#d}y-(=`o1iy*8t>bwHlBBNl+n~5pmt*456=YIGs%StK745Ly#n4}BqHBAMI zwH*&x(6z`0EDCnWsK!}0N06p7v~kMzAl=s;&s6tj?DIIXFqIl!oVZxgppk|ul@0(d zyt3~cj%cXw>_r}^r)NozRZgG>ugrWW9w3i5CkUA(fmU~UOrR1}C=|RJG-!A3LFhA^ zx{jJaU|u48-3K33@t!_I&hg63Bc3Ri(IT=1qkXLIV_yT>y3XheUp;1p1Zixp`{ES@ z2)SUFY#Ej-Q5X&uCuQ|-CurQq(%fT1KG`T+fXLKv5%ZMqbDPP_{p6 z9CqWLnS4Tsi27g+#6k{@hBd5@C^WNX*V1{^GDJzQ;pC(_L?TA=2`uBj(HXO~l&@|@dy4Jc^sHrcmgvNqn!$o_ zwHXs7C8dq>7>SxSDQ&@`c>>su_04q>zEe;(NHPOM{@bd+7-}))V@T^HtUy<`^$H}u;Oft*2&9QRq^Bu!P#YE-li31kw?Gzf4p@T#dQ)o$Y>SEA8FT% zyfZGL5GxiUx}*8hNf{xRYe>OYup?+A+W4+IO@IqQk6EkP{h$V>ChPf=nnosGt*9pX z+DYM=*C%C>G<^DgMH?UO!0uzZvt1_R?)1Sy!Q(yhXVY}8W*ue>m~o=t78p?T$r&u@ z+ndWBuWFCDQMDfR*1Zx1nygO)+WnJI3TEf0^B0{rGep-jonu^#M#@;xq+;?;%OdUs zci4)}wTb4(@m)a5{$u%&_EEeY=8w}I{>CJez!7+Z8!kO2EKDfn$PGKAP{?3exZBv> zf%C_)>kht+8v>`V?7rQxt%)FU=`qCcWZIUCl;`QyX6K`$?Ao*m;=Ztb6Bazb7)6r# zbLE*7hutrhkn&FPUY2Vl0rT_j-7$$>eK2&ut~yE$YgK(8#8}Zuk0f)tl(8Xaa0_x% zj!zwrvH9y(n*m_)JoQ50wenyZ{*#RPSdWt|az4?z76imX?hU!PEmZe6<>=#zfR!_~kba&M`vzIcu82Tf9|kI(lfGWCp% zy?a(I2kQkYiq@wj?<2PxLE^a}UGvuvc$Qs10AbAAP{+#5$&Ni&0AxziO75I9H>mAk zcn7_nc>e%yyKQxqL{%OS>NkB(+Z^fGc?ShzSmk+DS@ER+lYCoQf8xJxrU3+j*pXFW z-ZP)$q#qL-`(`9x+nnV^6oplj*u*s!i{ zCfVkOfGy}oV`LNB!6aAz0Ae}-8_b`CEvfVROmTCkg(Zn($d!gbZID74qm0H4vY%B} z(Yu5Iw$~o%dC_Uu`AXs}Crz#haLGiT%*TLlp2T1C(NH*?RDPqxO`oqv z239AT^suy2m_QPDLQ0W$w5beRap#YofLpRUMseXLk9~ir-$wCjXj-mR4n{0u8I)s|=Pyok)@S0mAfF;QvCM~b5pNO7CEK-`_&00D<9)d8 z(6HP@(hQalSXQH`$DmIJpxX?uAu~p(Bw05QzFmvjp;vP8T-{$>j5#^;^y?sW-MkBd z)8*c0I$oEJr|V7R$cG%rRbEPI9rrHPChKV}&mYL?kx&X9{AFKLRg`o;)M>9v{mV^r z8sp;^mvLYKjyD7|fyJnz0R6sCPTF@9+1w)ld6_1I{kQsa3c#_tuatHo*?_m+tL{iV zk;M=>_UT_s!dOO4Qrh-$&&+f&OzjH?y{y)^(&BJ5ulIurn-E)NnAsttP|_|+v7@w&%Av1bWJ&5H#wsZj;M}+x0qR#Lr}fF zz&)>;JrXE$B2|gw)+3uki%^d$1BzvLg}>$U<+pZX0d#V9f(icsX6K!|oJ2cfP6@$|k}=Eq683bop~}-NZYeB1CVe^9Aiy zJnS|sEpdLLJM+=9F(Mma%-dUwO~mq)Z<8HVkY;cK$W72B-rxIAxF0$z?Cz$}UV=uP-CNOBBAbPBDI6V-SFl3*?-Ymsh3s}OEWp#2NvD<1hM}B)B)@|Y6dGV zs-41lr-=05H-19n9zv7GHeBtKWSbj%NZ_{OtND}S9xhRwlE9uefJ+@#h-)Jh4JMq zG;z5^SK`fYAv7s93|!Hblo8?|1%YGbiuX0%kM0LbYVXchPe`8$#2ZJ<)baHpD`As@ z+nv$p^ANknOMuN=NNWLo_Y?T*u|kX+6eh#Wrjt<_`ZAoL*zx(Xmzr5bZ;xilB=FQ! z3LpFRMR0s4nUH9dViSt&cg)x7q>!wOoFbKpiZ-hZp{R|k!r1M{`5uYGUB?Sx499xR zQ~Iz$Idinq%pzhVDnMPJ^Fx!~$9kjBT)>P((!tzDB-xD14lL;$D9<9uazvctyl7UA z;z_b7pZj>R(7-sC)YIGuGbkQBts)sCiXw~xMAEmRr47&Gh%N3Y_UED~;vIxy>N3Y@ zQ#L#ZQ2BF6q1GYl1o>lXzZ-|(d;xZP>~ZJyl2u>}bsl_2I@WYJ`lQehOL-uxlm&wY z`&n<2q>k0d_vyCTpkUKdR{eXZ40$P?fFP7cHh}UZYC=)_FXQK){{YWZ9Aa6648rt1 zIrUvLD-|Prc;PN$^Nky`XLZ)nH~{m{we`#|nH@&=WEqgta5AJUKBcCdP|7lL3dIGJxZ92uXayi$bA5-%=|cl5s^6&bKYwhG z!&v_SOkc`lCOim`5Y5ysK(2eooKB~D9pil=r#{6G%26IU^en9e#$NWvy|t)%Us zer#QL{0ry|=H<%b>SYFG5nzl5+|8J~42v58{Lvm@6g{}UZusVaVVuQfZbmDc2vkABNB};P z-Ky@tJth{6Uv?h%aS6r9#TiR3c*n4RQOQmw+>$&Fu8 zk4}#Wq;lhFxmgO+NetF8h(5$~M3G=|d=A9)0a1y@_L}4gS>WwRzmg0|lDSo}tJd-Q zSeBz#v^PJ$#dP~u^z$<6Gwm;AANEeqkt3v&Y5STijD(6|ETvv`;@gk$r95}(brcG@ zuR~Q?sQ&<82xR)yIBOgkf&7GtB2uv^TyhPIYCDDPHC-S;#^v@9En=-BA=|}ko@Goe zD1z~qV*db8S-#T0;yDU=_dTnsY@y6+v0Rz-O)nxHLMDPJ#F0mkLn>L@xB+1M6MRx1C;$dF0kSI3tM>!*(;{s=<}>bdbAJ;$W8qB> zJWGv{k>v$tQUf3HX9mvDMHB1@G&&ncGb#hY%vY`F{U3*kc0kNK{&`Rl|k-k zalz~XtKVNwyqo9 zUE$MjyL*ZhK=$v`1*@D1z&yaTJh6k3BTsn=hOIZ$$Qj!!X#}IMBWJ7pN4MbgNEJDd zoC_bkwbK6psQH?Qg(ned<4=vTmEoNCmCpsJeWz+Fe9#Ea#hEfLbYT_U3UM@yX zsRm1g`j4Yo8TZ)Bu(X7O!!N&nMSS&bC95ar@tS>+$xx~=PCNDKK4IbC>E?He^&E^i z_F-TyU(%ena#AoAn3ZqxCt*t`jmPJz7H>HI&{cRANA*6z;6LeQ!J7i+c`q!1;Bvua z-c{(5d9Xu#fES-`rZh=E8I#(5qre)t{k=T@0C}&A;%pesRIo)BFm#3O{L(FU-B;ho zweq9^&rC=FgXbyidMrRIlV4im0{DOMMw6%%K6XZ=KD-|;o)Xp%YW15IFZ@^Bb(O3x z!!~XA%p3}=SN9!wPXa7`3lmb59GT3OIF*X_1$@;4tCLi08@_tDMFTmReWy{i8*kDU zBZogSEkI2alTQdo#;Q~bI4#(oR>24TH`4eRkXrp9{{YcIQnW{2@fB&f`c7`9V$*)3 zPMIZWv7z%yDj}`U$EA%I91G+gJ<64L+J?GL)zQ||8?}@XK;M5U)Y?WQab)9%mSG85 z)^TL9450%r`h7%#co%<;qpPQrx@*y5yI2e#KfNE60$kV7HAs;E0LtP`z1#=9cBKG6 z9g7PG*Z@9yK-ru0^vPYz{ru;-YcGfi&BbMpOcJ8KdgM{E+DOHKPdtu6qkTGQmO10j zN7^+#--rIES)LPp4H2T6agmhKgG;te%wvK#Mz=(Q!Ufak?@h8C7pE)mYPW*i!&o80nqUl1TT5tBLlORym5GCw1{c-g=4QrAQk~v_e&nv?5-zKfJJs|; zy;&0mjyl1|2^ER4Z8e`NjSm z#m9#@Rzg=u>OuU>~@tDXA zZRS#2fot6lz4pEcpbtfW2I_aS>NDw!=7;w^lSS09H0W{hvL;!i++=R?MidWSp5XEb zzT>VY^BG86+9Mnd2U1-wWyqTFjjXY(W;cigQeM}y3sXXkg}%qCd!hPFi)vZiMsc6x z)>!FUV#AU$KBFDscZnAvR6{dIwjy6>B7;x|^JMqopHFRWnU(j@QPbn+$%5*d+)FIO z8W)vP7A>|fOjJhFJJ~J?F-rXrC@L>Xd_^;nTB?!m!;sztlokw@k75Cc1?96O3^Se zE&&38li7J#k>zAh1~wz6pUiVRKH@}-#KvlkHy1>9>yZZ|6G&HNsQVWcG8a(Kc_qo0 zIiJYhzo`foq>gzN$@dgJyFSA}`OK-RLHBiAVcr?=?9q6WQ;uEE8YuM$qF1u$8J5Yv z{YTi?t}2ambiqKC{s&s5K6e}iyU}tsL3;sqiBzWyWc?aI5*p? zK9M7zKb)SPw#B;V`+{L%#C0Xej#MnauG9T}rVv}l+wd%kxyao=z6)`syeI!Ni|fFqOl5k#6)^Db5zEO_{8 zzHn76s!K8e6obzopO5!6pjD`p+ib4c?DUJU-!=@KY)IC8ovJ}~RdfSy*vbvjUCI@? zJoC~e^_t45wv2|o9-8W5Lmuh;sDL4H=Vb*5Q{8!CeD?(Vb<8Nm2;^tKj7{PlE%3D; zOsSKHGe*#$WEiVrr8%~VoVoK6MGRYP? zx{;LSijiLc7AJ80^(Ii*5^Oa$ZBvuhQt6pEZJN*wM6~m=UNvfrf~RN#&m@H)cI5O* zoun*|p>+WK2i_~yJTH@vl@?K&a{JX0<4_(Jt-D28DgY#3z5H}jOQ90u+6EL4UyQ~* zIitlm^0%B?AJbji9!_{B&!hrBiXBloRGCNsIc zLXQ>g!MeVfU}VJB1#HItJMkVykBnLv+a^OBk>xn_GP$$`jSdA5pPK1z_=DN>ivoBO zPgdd=E-!iwj zkVRGZ@SEydNt#?#%E`)=W01I4lVnEIk`&#F_x3%HJ!U5IW{oxChZP?9e*!&E4tYj4 zpNk4WS^)&x14+oYQ&d#@^M8x$nGIC$c+7g-=L;Dy9kEzXsl&0Q`exX%6>Hp6x!g~y z+XR1jydZru+ltCT(7Hl2AH3-a($^o<5fb2OoP4w-I z!K8!=tVMnq)u8^-G_yu@^pGJSNV0j9+`l|ft}4FJ4{nB@MrAcqHZuv6Q^ZG%K`iJc zjI^-%PO+MOssr}3-jBfi+5iV!&KhoV!{I#EGhb4~c|7GwVUVn*C*0*0?3MT+4}0%j z`sM~xO+t8U;S}l7?;vn@}o_ zSxMTsqQ!RP6U`5Q&rYdWkp~np6Zn_Ga74!^>N2QYQO=Q6w97;=ALIER$LFb(093N- zl4`1Xr1)-ZUkyhFY_Y)(6Zx3a7qv*q4QF?9SP{wWM@)!DWc3?s5(hkwIl$GHZxAl% zU^_~6y{2--XTCT&F^Uw(6)2gCkezl>#Ey_ney=PPg$Nwp|Y zB$Zk>f9-utAT9RhQ&&}vncKme>+s}%YzPo}Svze&-{{}DYVY87?_S+H^DU+ji#ezU z9*>imkg>%1NpY$^`NJG^S1;%z+>0IfG(EaTL;9D_7b!$kJ5|g~rXmSts3dPN$Z4Hg zG6Ig_O^X-o-7~4%bs?stJ$KBN(!2>aMz16@9JuGmDEsl8u0NE5{XlVcE~>acJx6() zhPc~!mayrt;bF~<5t>5+Tt;KHqd*Bhs-s)DC%LYwst;L_nXr0Aeth3dj$ocNnrRyw zAW~BrQjWK{s{4{T=bpLfb1$aC=$HiY&*BM|9FHr_z;I$noUS`L^pXCd$UGbN2dR1) zLR1`l=Q(;L`qq;ll%Zl(XeLDkQLU*~G2X@5x)wXvNWj;IA`rTk+|N8JGQ1~+1_mA$ zQOSeOktT9w+=Q}-%AR>PZBMtqTC|GYk(m!_(j@N(!znZkClV|JD!fy+TSitXEkq!W zM>aQEKl*|GIy#C>kYmkpd6S>j4MQhQNc@}^n-Qo-l4Jh>^y}#*_Mh?~dk(|5Jwa~v z)Z3#*i*qEr84Q^Dxq6FA$g>cNN2zBUl&e|$EO0>t3q4xsS(;flP@i7#>7Of0kh&?w zDJiYMLvdhj0^iR@WXBN>ui^bWFGBhma15;)vbHe{ z0)kYQM!T>D`}}kYiD<@!tlK3BNGN}eP=F7fykW}N&KbY5D-$SK|p_q1oys_ zSj5y5aLL3)<9s=F*kSYZ%rTWSc@avozT&Qg(}g?Ug%fpN-MZ^Nd6rZQ`c5LK{1$W^ zO_;fI7n&vAjHo8^WeY{q-*o{%cC*`_oovaw0hoiub0&TZkhA0DBr-^jjD~Vcngu~1 zDWThdKO?T945BFO)?WB(K`({yVi785;zk?k#Ogyz0+8|%b-`-{_CF)3m+3scblIp_ z1l{Bt~ldD1IyDKbA;xow71&3e1n1HZ>rZL2GxYmT_gJ3-cE)BFan zr$dgJI9TCgSp7(VdP}L~lVDl*-Ve7ymvWZ)d}HoGt?u0TbMQWqpMbTPGVvSxiZRMB z=E{>j%3|2eTm?UBsTNPc@6&jBJ&B*%aBX<+@995lgA+f*8Ht&VHe+REv(!?bB2uQ% zfIikL*L)Q{$0MTXtk}tiM^LVqAkY=^zHh!J-YZD6C43n1vgMKElPBsHD?n3_mQQ5AMA zdPugQ+)Za3bTXF@z}Ul2T}jbIxS&Gng}jh9?o=fAu*zz<+J6>w^i@bL&y<6ETYviR z7k*zj4rG}AA;51pPm9fhWoaJh#1NVvzVri*;Ep)xGHuGQHz+l0gVT=wKPWecb(o)2 z%gXYnNrnO}whH-VF!cWb-AYA#1ykPomYXSKN0BYBrvB|mKzlv<$-ftA?-sQLQNuP; z!xOm2mQAQ76ey9$a=?Mjo@{lG-H~c1t?c@&+C|UWG0xC3@N}F^Rb^a*l^aS7XK?{{ z2+169K(_e@y^GPN7@9r*08=)jDZNqOsP&Zc9XG=`9#iJT4SCG2%d#=K1EJ>0YgFd8 zQK}tjz$amqNCQp~2gR zp?Hd1v*gd_szPE~F{lKM$W4G0UD4-hyYJP37+(Hy{igPFUvKX+i^hH@!0~3cortB* zR-ZA9+U$@*T2r#S6;i^8`7~&CX4MZ%UX#rBeLYPi8n@v&uDvE$xl&+jQp94FVVVc? zA(lV^P@4%La1}@fh`V2KNa_U!nfpo&Pk0M@^ZZ<41_;X4vodj+=AK)F5Hxo2FD%T! zA6PZG5np$1-A3$>DXnz>0RI4K`2PS=c*KhbQAygQpJLi@#zxwG48UIjdvod|^Vc(G zj}eqrZR;rXbkpbXzC>#Zgt%A{{Sk#`)j8{HqnuNCN2rUo$BKTO;Q+1 z{aFZRbcuwL0*W~|M3N6`y}i5jL6Qtj6k*TbzbL!NhXtZcly;gB*tQAgm+by&q@Z$3l`i7{txW-t+{XPx&AG)%DKCubPP3L~)+_MfezlFC#DNCxw2c zibfc2Sx(mF>Vf5l9l`54S{X9#2m;{VBGNK3^R&!}8f=(RBUguiryP2Q{!IhT*B8O< z)9IVR;zaAN)=)V6{39Rknyx2^(rA3YqLmmcE3uLwrQ-$Ej!&y~)dD!}#*?XMZA=<^ zRyQ7c`5q;N*gx5GBO)nATuCC{?a?Mc+{eh-PORdWTNVIQm~nAE4&Lq322@lPx32HM~k} zF*~V;Wx5y7Bf0AVCWTLU=^aojfgI?5EQ`Z)Oo&q`OQYNeDs`QVGvsKfo zlpuM3F*W^|YA!sC{XVTMGUZL@>KU0bs0!`5V};0!>`*yiFTHJ`2<_0`ZsbOg6}yi6 z`o(%?8fbaB8QB>V9IT=1DUh_J5P3Di_CCLp@_J&|nWT7!hlt>6`1w)i;W3XQ9h5f2 zS}0kOc@IO?$vgw?&qz&*5en`h)(48Ycv*2oa&YI13n5>8pqbSX4%LV-JCt%Sn)c}m zlgy@~2K_OXmEu*@^{j|Y5hG(EhatpI%BXi>cXkWAf-cSca>S_^nb0i)50y=Ga=x1@ z%fV<UM4q@848Jf^0NM*Kt<*bip^ z0N%a2o|_uo$ddOe#*=_P^%TZ7XqfIZ5!)cFaw9jKNcobk_^wX?sN>Z8^pTLcMhK>bmDoqVEO+2PsGdirfV1B0^xzuIqY&5vGt@JnZ67LGGo>1Oq`pkb zrWt97HmW}EO$zq!(XamiiNui7JFdJ@SAum+jNL|g=9DCPL~k)D9FzfvtL>}r&nCUk zMHG@qkE^G&RLe)v;L!YMlHq4VMOvQOEkTH#o zH8l$E8rzHS$3#hNDo8aJYF-=3&(yNsIpoKPP9GFos^f~GM*dBOG--!C8YAJv?Zh>5 zOtU@;lUN0#33Dt`MI#anbU@@2z+=b%03Et>yK%0wKAA;PxZOeZT_5|ZW2R0t7_tfX zc}haip}3LzuOx^7@5i*#=tsIEEOEZ@MeJ^BSn#9(n? z@hG(42H|04;$=hT8O}PNJ~lg)7PUtWU8w$jhg?@^kZpE7E+FwnhVyDujkya9Y~%<* zRF9MB4k(%+RUN*rgD%l#S4U9cZ>P(@yjQMi(&@SO+LodtQMgj#73%BjE03GY4 zUrD3h3%@?`1j&;t7edFE7EIOiAxBM-)Ur13N-(Mdz5T_Hew=y7v?iGG4bwlUn7F!x znsm9)CZPj7%L_1N0FiQbs!M zssM0VM$^DOtEC`a4kZy%y58I+n+w_Wr5lm?R05Go&<6#V~xMEqM%ULLh zg_1|w#>V2de`^P*uaJ-J3_!NzclU?tf;@x$x@eiGGi$m!3E zrAZ+p{{T>N>k07m7Gf5b&(fUufaqsVRdM7b(H9NTc=|+LTgBuyb;2R@5VlQp;K5M#Y&DIH#FK@^}%NAdR)pAbxr}g@-b$p=t`8!*MnB zSX0bq`euvjBazajRA!>2)!yC@!2bYlxDYrs9kgs48RBP^tFC@V)QmYUBwr%h1w~tC zE1c(t2qF9Y}|T4MzT8{weQs(6aWScmY2LFlh^I%_u^r%Y6!S;$s?SYcZG7X5+n5* z+PqmcRz6STqM!^-8bhG_z%%@usb({XAViCAnnwAirX>NT@9q1O)Jj>X;I(duCh%To zhP7Pm%m!Jbie;8an1_ND<8KYf*jh^Jh#j*a+l;ip$r6yjmRh1alGZ!jbwRZH z!KmfG^KK4!h^5KP!i&tsU9IOGk;(r6OM<7&CcVz_`7K?!=odURvgx7C++X4?dp8Xq z95$gM;(-!I>Bw&9ZSz!a{iqL~q|HXjnsgNjzc>$u@Z#2dJrbL*W=*qWB(jiH?e5ZOG3QxQxZ3jEV}@J6{C%`8}(r6ex9>b<@09Exuq>aErxgZ#> zY=m5leB&-bnOWh4c_dBA3R;N!cNR8#f^Xxj>*qE2s(`7JZDj8a!a9* zP{;oO1d+D-tZ)xC--FLo3L_($zvd#*a&-+x6OAnFUKz2n5@dEb&Z^9XQIx4HzzYYD z-nyu+lbLHLHx5YgA<{B&^CfINrwfX!l^JPD8``bMD^0<==eRf0@YZ81Fch3mBhO6( zQq0C=mMmQJ=`G+7Klk^Ro)5@}N5D)eU|1y2!kSejsbSop@&5qs4|=Bu-WypMhQKs12fA=hPXI%zTE%f{J|@}S)jjS0R$<(BMmbT8mr-dg~oGw80Gf9Wf9 z9Bim{^3cNgc{wM@4gfKd$lFhDH*Fv>9f7XhakV%TIAkm1S^tK{{Xn-yhgq#)-yA_A%dnBmrj~rrjj`&DI%leutFGEE$Jto z-T0~!S0S#fOv#|9TO9qcf4YmpVPYd>>NyQGbEzJn}hqL}9tPlCr14{bw~Ayssut)ra#&rIOM_ ztbbA@hy_kT=iiOb zlh$TFJ&tHeogxWz0G_wdS06vL`ObNRU)7TeC0W)nB0TI);Lcj8azIko`5+FoGAX4K z(9>p3&3WnYh;kQPfmsiTj z&eS85e9ybejuYo1_9Tu77Dwj85!<4Qz(fjA?O)zM)jU53h-HcKjLTv+dG* zwV`mns}|xT)kK)SBaxlCmBTq-O;d2fxUvB6&tg0Dc2dm>yOxJYM!Trv=sG$e#+~KE zQzUSkAo-8BlmpJt+lVz?Dgn*T(^frV?-b-=;AUj%lj1BAM*xy078KB-Pwb@K0bPOo z^s0J6q^`$kFl;Sk_?|pjrGs=CD-#(OLaP_tX}SA>s=Fh%W6d@IB=!Z=In4Jn2w-XL z1g)63v=%=-e8i4gR&ozKn^pt3C-OQUq;n{w@9_8DV(eT~t!WCGc-ek*aqWvH1Y~@J zy6Ev>5_u=se0A6rE_Da$=?8BCXGh{3X=PPmimoJ*J_O~M@W5~wfO)P6BCK?t?SZQQ z03=^s9VrbTjwLkFPmUxjzalmfh{yyyk}B9CTbio<_Ve%6bQA`_sgaKA+t2aoD0Ht5 zM4u3UF+V9b_JDxts`cyAfcwPS_7h@HEJf)@;*PAJ0?P0S3T(xvSZ<{pbbwq4|k4-ww+TL>VlyNGDCwNW*lYcWt&xpaQYy zkbTMO44B09w}li2L>5dRFIkBrSmMTlS29I3URZG5?2%?ewy1X>z4gcqn(GScZ$Ns+ zIbL)rhWSG$BPclCK*r200D^}t>93BJ-AOxSfCkqSaT5%Miy|fx$18bq*8Aj_S~b7~ z0e44>&5F;%v7| zMLmgbI3~Ndxc2YY3TE15w`~{6@`7b*SQuJ#I5Mt2N@fk;^6Ov=9ffxle ziZY0WGI)%2T_$L9;SsD6<48)*?MpW6ENoZc(H_M7^&zKO5^CUGK(+ignkge0F%KqJ zr9}N1SlOU^fn~WL?0Tge#N?n$9#4PdDw|Ezv9$R_nQ5?O1`&l}K+w7*Du8I!kiU+C zs3Sf4#6SN4AZn#{PMe1ek=|Pm}7z3Y08bNS8=Po%zeN=9@ILXr=j91l3T{ zj0QZITOcaDs|y0LWI1{@w08uMN53DQq|3NXN@~jEq+c`3rDaP7WYf!q9zm%*q)Awn z6pO*%MVq&^4vv{Ov_e<@*Pi~6PZi)JX>FW|kn_#X_}s|Tuc<+=@~+iFs>i=isGCK@ z?E0Q9nD5R<=J-wxPZBJ#i;i+)REk*^Fy>TJMT-H691?lE>Hq?2Y*uYGD!;sC;k_eJ z$HB>u9}~=v92AhKCS+isx%F^BHdOY%$4;ws2UxAF21%(|nc?k22M!ozXqE`2R*<+| z(=bv2C$L__{rguBuz{I`YNnvDAVW&?@uO&9j3WheG6gDH#?p#-?gux(KE(CKC`xJS zmGIOvH%}l;$9$g&-dMfn)=~>xJzA%pO%Zd1GMf zAzvsE#Dm-iu6gap&nz~I^D$UhqHqTubJdOvjaWrVwqf)D+vecOVy2y!X@F?Jkn9^$z_zg%ee zNQAYqUn$>*bcrF#Ie7VSVzfCsmN;xc=ok>7RRQf(JzVq~90gueHSGnly9b`+20ZwP{9LD}3@Y2PM!g&IhIPA17c7b+@?3^~_u0xekM-d6{$NW26qTMzIDk{W*Ief;jak0)eA^(XOwi zy-!(BXd#@0AKB?Cd_k#6li{pP>^-t$=04T12P89HazSB2y|&jKE~2=yrxJe8w|BeL z;-}slJyE zG^qHf(n%T?g@R5kj`qHITCZ|QAYJuZ0YZrbMVhnlFnw3S%c)G})*OuDjpc0uK%l*$ z6hQkx7CqMJbrsY90QsI{rmGAL*I&fPP0%v2^t3U~vB3feM4K(|y94q7C2#TjbfIWk z$6~De$jxy!&zL5GCL~dutem1N^!+1oP*Huj3s!x>_~_OurvxPL90@g>;f$EIe0hGN zd5cC%ZWiNdpaqXmS|hOi`j*`0ZVbDAf85tcc1=jHmeTK*HA$k0hqxh~YLuVP9lEyc zXRIV&1~tjnI^fI=uEW1zIg1D}EJuto_fU3SMPrB+15*&wuMP|-*bvsFn`c})`5Xu2J z{8w(NSIC|)@`z^9=gbQ`fdZ835H(k;*#(7$wg|n69 z$y}o?!_89H6im@62~3y3 z^tSWOe*U4;C8~c>rSYGLG446B@$w{j zG1*Y2J~rj6Cipf$_7r*Pn@*IkKZovoy$bJH-GyjLfMHRz?4{1AJ5M267^m-5q#q$GF*; zvSQ}sVlS69EY3HDR*g^@76KVJV?V*hc_5aksK1m zkgK`V>X<7k2?#xyHE~-=0)_R%R5J(ik=6E4qh<0vF*eK3&G27}XTsE6Wm@`F!?l<) zvx?)8rinGhP_QqqEm=8-OGs?9wbir8IY-20RFWB__y~!nCS3Iw!*wB-!Hl_Xnr+qaTn(6LQo}PD~u@K!}7R$`Xe=aP1 zm?ZO^C6bFTlmJb_!R!DacThN>OqfxxtnDUJxAGnS@dx}tKZbDN#*R3~Ge$h+l8ZzL z17aU*BI>^${bk#^u6iEe5-k4!aSk_v`Xz`~GX8$n%3kRb4?Jyh}cc*!YVnh1Hr(o0c%l z4`77z={}QZiU;%60Hlf>m)m_l-f`|WRz8=Exe?;yW6imPDmgLAn-2i;F8kH-@6`8I zik!&L*A*2{5DA~1Ai93fPxEJ%$V|5*L)klb3diV2+HEg-1 zd|g8hSW-#O*-#q_<}=)+dU*Hg92&%~G zHh+ocO-=GKn=tKMUeUW=-N61x1GS1BNyaG6>#BYI&l><{GVk3EDKrpQWWLl1;8j=Wu3E&1G-0?gK5vImrheT204g~b&5=Xn zt04|wwcA-Y+Uwh*-VJyir0 z!4-a0=_7C@pFp2bll59WsKX&dFEl2-!*)<;5%bh&aHe`nH;O!o-kah1^_(pEUNe;* zGD#~%U0@sqTma7byHcHbyUqaUqoyV?rSa668K_7kqXc zaxb@jfCF_AGisnZWRAX_^BZ_u!x$3NA1$U%eB)!uk(FrIV17vAtG_)zyHIEuEl+61 zSGu2btO=huXfl^T7UR&*#LCK-01@r-nmv12#$;ECqmC z#{k$o3N$_L_zY%xLtk+YI&_ZY2Nx+Yi%!&`WSND>AZ`Nz*gb(%F2L>2K&>6!3>FB? zE*vN$k~v_+D=bRx(h1wo+IUm6i}e6UV59NV6g?o^NXd`0w3eGsc<}OMGRn%koNtVc z)W}}0$l&)Thh4L7WNwaR;nL#7o*meVBg9xjMnMs%4j7d@5$62 zD}DUs2C0C$o1EK|A>?S}Bn4+s3l&EPiyf=vfz;2D%uPK&v^a^TmOQtfc=H+|0<(QN zfH242tieYFmfCE4*sjBupm^y3)SL)H!bcaFcN%*E8jVr) zlU~fe!y zH`Db9yg!?m5)5~lgph#>T+r?WGcfE;@+*Kl@nfoQ3MPF;-Jgfg(haG^bxajMP_RVA zrq>`VR_*+Id~tswxIHOxA4^WS8J^;4*|-{hGUCAcn|f6p+$f^U=u^efuHXv0KHVz= z$c<`A_n3x3u8j*&m0J%oL6aMhu6I5$JQ8Zb+jT;RLdY1D*}jJA{$hB%PCQ82G2+m0)ce?3$NUM783Lf3e>Z-ump@R>C!nj@34SDG-a8bVmm0{H~6C-Afh=}t_B zsQ~RAd%sR6x~_#TE~L^%AuN*wWM0!Q<{OznJbm1rFTM50br3j?u7zy#{YSYvY;b8x ztb^#{3OvFD#J7E_J0ITr-&PA;OsMwOc|R#F;;l0`4qQoD+0p#OkU0HcxD?%8>;?z; z=@$1~TaGD+o!H(VY^y>$h#k|kSXFc-uNJ5k8P z$%D;N*@bX_2cxv|U%a)0XOl_*(;W6GF#KUQRoM6T!`Y4Y0CDGf_~$H%v~P0|Jgw%82$OB}fJGnN;*Sx32|Y>sQcNI@dNg%D&8Vy_g#sQ9N&RKUe}XM$B&nV1)qLxD^P6|}eA zRw&husv6Yvfp#vS4aZrRh%j^U^dBO1ier|~3e6mfVjrb@_jV_C;4Z%do?A(=XXz)X z%3By5!~7YbY91fZBh#`Sg!OZNxEqNLTNsMFAe$fKUp+F43{AynO-Bv~!cl2@Oqynt zVVXCOY5hsmZC_6x6;{Xx+Q{sA z;P3}Q6cLGVMOd2XI7+%q*-B-fCm<{BjE6|r547JUYm9!u!^z(fFJ&$f?2N9H2ureAvEkDB3YOut!Wjf;#DaxG6agl+d&Uqk{U<3Se zdZDrbF@fm4BwzI##hBPLV&iFW7-oz}@%==8TvCNAXVuEH4Yp4t4n9BuK%q40f^uXY zrKx22gHdU6^DxqUT)3C$-Xf5^%*Fh~e~q*hjyGTDrv%rAP=yD@1;X(zMun9;1}FwR z7`{P)Ln6xM{LO@LSl8S~!0*j75_-U@B^FMik;N8R!Ny4z1w=_P_;iu@Vg8b}TwRvq zj-vKP*yy*Is~1X5LIj9oJ}OGYs|6v0lWLUJ{zHS>ua2fks+T{g4>;-%4IE6U=Z<7B zJg^xQ3z8)#{{Y$!#1>FE0`~*krM?8usJLJ{3{Lzj;Y@u?PRfkp415fDTh$*6xVGd_ z0Pkuj9tPvU;=^v;%$NTFMJI=^coXXW6vf8WA&1WyPz-s%ntw1_p?$$0y@G5S`Qopw zE2Fpz98V8lR4HIO&NV$CK3-@@jFKZ`i7d>`C=@MQfMRd7^=3#-s@Hm3_#=ZSO7^qL6wT#Sh=G?fH>=5JJgrn#95Itwb+1OJUv65`8c8wJo zP$t){qDN}JLXJ5*tLFO7&wmNGN7?rBKsS$vG$0-%@fg6zGR=pRGGwqq&JNZLyI86% zgufKR6uWC2j-{X#vm=YyX1$;Z^ zHPf`gq2NW5w+wVsYBu5KUjaenk!%O?*KM=KNS53@M?bKJWQnq}l1a>Eq)n{GO_LQZ z$EX^$C4YPBilhsZ1Ov4?LLz^y@VqaQf+*G{j($jur5n{~0xVLHFP~8S^rQeYB(^n( zT=VqD`w?mxM=KV0!!a|uG-~ckL|24R03M%kN&J4@a3E2eRcul3&IJaEHl3?v&SI7f zuPR6KWMR6sSw03#KT6t+G@vc;1efgo93n`u1r9ePD5J^ky7=r@Ka)N-T@clnaqe~0k! zb$Ou5Y}r;QC-emdOlKsUBnvHTedq!B>yd0q>a!KZc5&mLcbT;eT6J|`9Ej7?-;g&S zQ3QchN%!fLk&_j2xfzuB*e{oaGd5$#H0Xrdt28`<0v_~8{2ttMT~lsurZ;Oo?DvV@ zjUFpz7LidU!U+i*e^xn^$4NEg^1{{Zb@3CZas+k*Id{{S~Q%-2^^*HyfQcrrnk z*3_~VWme<3CWs(@dR|4&R3T{MqBVmjRMlr}cUUEnnWL6Q+BcwJD4(@IZ*V(%q8|}i zy<7wt`Avo)!jTqy#%^&4+<--{!v?NFqSCL^fC((`AZ=lGs#`AweiVSc_O!Y5W~NHWa3 z8HwC@1hIOrkbQ?kXN0LRSuMFm@!#$DiFC{erSc-ox#YwuttEmbLgXR$4?YIsNCL8J5^}`$qZhlIau63`nxe8$?l5qRSTX#dc$01MYeKx?-eW-mnG?Lo}0* z7g9{6`grmYOy)FL_PnftcSu9~lShu`@2LeR1EkXWhy^grpzuzoHh!}VCM=1XJa%@K zlgslMgd7kn(hCvpHv8E`RM?~c}usnDgZ?9U+_#1l_U%Fs|=BnN1ghC8M`+YctKzv zis%L)WcDH^si`HOG;OI*nUy+Y$2DUzC5Y9)9mgy?ecbX-@6&|@P?rRZ&NSa7Pmhlt zEbA1)Ik(QlBLxgrH3V1$?Ia$3Jf7WgP;nib{<_L}b*y;x84JrGjFnW42dFm`s!s$S zPd`8G8=iTQTdVS(jJVrLk~!p9#Iif6f-r~)KVxnCfD|~di}_seXDySsL|!t}qmNW+ z)=8dO7SbkvEtAo?6f+JAsWtgGMz5}|t8l3IhiUstZwp{f_VuMn*@+{AIZD-@)k{Rh(!Y3pARGUMXoV@mLsc>~6h!i=vR$gUXG5kT;L`TP^n18K;Cn$29= zOzdWNi%-OoIMEA904NAvFKIt;HhXsf(CGBCB?aD2V{EKESY;84NvDaLH$Ij11uEoo zR>bq{3G1&Q7yxD$cqSSxPV|!Ssx0Nan-Go5?8y zBg+ED%1kU3mL?;$dWxO5Tz0+~ks_(c8SgQ6m#D+^b7Z`cVr5B=&a$$T45~MaTDk-I zvcD&;TF3$xQ(zxBuTjp1XPL3aMADjDX+#9=+*B3;Ci(V0njG`jWd4y05P;_FN7^@t<9$=;V0^isBq&#r2x6W0 z4X4t^j|ceo>BuuUUorm8^E9k%dDALP*~}6k{{W|8DQ&czi&ERJ&+XFfTJaubwDpha z0(0SC2V!WNwp744GdnbrMw`+TV9-6tqPBnSm;oQQTYEE&=+P?FpQJbPby>Sc}C z>nW?Frce&I4DsZXMiNst>2flRfznbbd2N)v$KdxM-%F~*SnDV3sw#&}Ong0;m#NOb zQ9I*G(JYAXAU;`O+erh9+x%Gf>9n^HD8Z-|O;#p(kT#^*3knJ1XK|4sa0-Ry&G)(k z^V6GCLQOy`O~;qUE%64U=lFVa9$YcOiRNxm1w$K(v?wo|@3inf4|O2b545(DZD48- zrt0wO8Z1-JfhFAWD3U)drm%fWXV4n2Y55oUQf^S`vORa$fnzpCGv#HY%($x(taG>u z)(9XK`#@Un#r}Hj#EZFN1{8=Elj4QU!izbjXffGI4ItdS5I)hx@_swyG_`R~!WiA_H0UEH3GYC5@ES8rZdCKI*e6{ljmZXvb z?4xYQjw}IRkEO^ml!~w=JGXTMM?%Us*-F){JEMHW|2NNh=x%uOW7Oxn{)pMuF zLej{0w2$iZ2MVyN@C5**S8h93Qq%`_AabIsRaT}uoXwY z1HJM(VAcUL40f1oncv>zhG>~l#zROXQMo3+@!3My55Tk32^>cX!s3jD5kZO$M29G} zZeolp7ONt!fnMFKzg%Sn-^L`-@Uc?`!lKL~RaHdW<|+5{9=5+Ej{H#`_tiHE-XLek z{{W~uX1l5Qne`^k6Jd`vB7va?%s{(#1uJ_-+8enXo^OhR0IHT#h`&(&oI&EYd39Vh zf_GMwGoX~l-MUtBdw3=~Uoa2<0En2QD=H{5W{XzS@z)wz5;SCHB+{y1CxU&C2l--zfJ|(u z#}daz%a1Edi9G3K)8jj2#xVlU;H^kUbs(`nl6!aRFJSRAYd?!`Slc%}d_@x(ktOmR zNf}s7YK%BOh3|V$Ep$icm|bE4iYFI;wCnn2zfq)WqD*lljEa1?TlA%J01m3hvhWGM z4r?y^yHgT=DdrKaFtnyit>b1paP3c`q&-ZczCKfe3^BAZ`QPfk(GajcuOu z5xtvGX@_B+wfUI%mtIXb!-jQeBx#*7dx14xKurc^RES{5?pG-08bG`66D*nvXF9+UX#8G!KiCg=8DQa4|eu}sMF zaMKV=E0n~QPp6q!H=({k+f)Z@_B1-;p_DcGck`G*b>wyXclC}R#S!WF17z`Jd5H{X zBVbEVls5`C)(JL0$KSU~#Xu|P8&5@;-$8xXmq{Dq9}up;l8YQtVl#StrbGIwC~j5k z2s@8G{{ViVo-CQ^=xH(xn6E+7pA*DBRC7s@I?5z678_AGZh0HqzkbG#VbE|m0-@C- z^xUV^k|ap7{-tDrWiJ%5x`lv&V6yhGK(p=t0G^*{0-ODaH*h(xC}d^)MS})7kf|<` zJYG<_D&2y&U=5DOy}R+%6*nMRnaR>}$B(RIr|M~`#T0T*iH{CFk4O|%_M)4xSnlq5 zub%xW+rv!mSxI0sf4q^KFC$Em<9QilbSiw**m5J@$bCJP!FyiftEn=8^k&6t9sFV1 z_KA^|3SzV-LmO`>-lt_Fn>Te_*B!^dOfHY4Z9Qc`K|XPsX=|GfCKfJUEI5DylQUFI zOT7}L8zQTbSKRjMlud3mB7LW2u@-(A9Cjj2dFJrk5$Pi(GUAR!+}?4G=YG$$ngCsU zasKr-(W8?zXg=ZZ2gARx2;b_N z!jrPr_FE0MDv!(9DEQlM8>$HIo@)2~fbEK)NTr{PaPo zJzY9l=A!=q6L_g~ocR%QC6Tik*<=JcQ$d7bJ+HX!&nEly}E8A94=^x4=C`H2@^aA7^*M=lrPWMARn9gBv#vc9MD5YApqcH=_f( z?D0Sj)XhMfJ!#W#`krR8?Pf;6{1|tMC&|;{X<(LBks%A_Ng!94xMN!f1JYOmJ^ui6 zT+~y@MbQ?(oZqJuV0xP3u9F5Ip(2gmNb!e9#@P=o$mPbqCZtD){xAG?j*~ z>buV!KQK?}mZ&uR+*z{Q{#-uzLygTHFf`10AQN4`_UW|SX$7VIuC**D&QWU`gcz*P zGvq~uEN*dvpaJ9~?VxRM)%=o0^zX4xjG2j5*isDt022tY;Kb3*W&XPXFoy47EL4TA z&9olpu{}$ilL_1(j9>8y&~R~|9uU(8T$mAJnd9`ek!o090*Sw3qvx(96I@(fLfoDQ zKjcB;85TJ({IM*iMOY!QWe8{jLh(vL7i3u{-=rhOMs3j4!7zP$P!s4Q7C>@kcwMF_ z_R%@qfNmr0Cads1dTy5;G{|e>cc9HIg_?OW<#bDh8N$en%G?25k>9_yn?2YIYU?Me z03Kg1k*=fS!pS^1vw0a2p~TB_l!$h>#k-83o7SvJKiuzqZ>lZ z)^SEs%IJnfhBb8ZCxF;vy_$yAS_9_CanjK(clV5S0OBylh~oHG0i4rGk(o$UKKaQj z>0w+)yRjbSha4WcR?QP88MhW34@`fvOuq_0i1YyMn}*UxvNVSwJk9NDyH6ks0lD@c z$m^L62Dtiqp6#lpn6W-Cfx21Yk~jlLGl>=?Sqhe+@3c~a2t42JXxey@U1PfMpGc-n zcLydZ!})j_AEo6iz(^dD$9)0^tI{|C_U*{%d$3QheTd=RfBwV2+7+Ybw7xHFS@U6m zWm$arHd%r|&AEZ*tn52aJ-ZHivVa(=lOc|gb^ic(k9=FMO{PSXNj$MUY8eW$sztnS z;VZE=2{rBf%-;n7m?6MT-yfo9_C4dH~u5n>m}kQ{xiBaQ>TxA}**^Vvx^ z>8j-QnZ;nu9?lnivF0U%BUQ-PM6n2&7Abt0cRXdPFyY)2_i>;Xq{;^>0ZR{}>-SW+>Rn$M4pm*UJ^ zM$VTb1cIunN0}>d2J>7C91qDSsgr|o#+{2^M52c_e5c2jd8UUS*AeoWytx!zF|)&Q z*n5xLt{LWW##GEFl3Z;%eUmWDS0l|4mRH+s-0(wy%YNS7`fxgl!Ms2iM}_s-H2n)R z86gv_Qa0yRD4T#ggHR=l8msNe_v48ScJz>OP6_YUW2)k1Wa@a2EUt!RksyvazfFGg zAZF})P_EV7UqFg6lTZa~{l1f37di6Gx?GUQk8(81j(poto2ZX!1pdaj=-48>;}KNX z3)FHX`Us_te0*XOJ?{ty%WK=aZ+1~bjyn=aWxrv0;*5D<>9N z2@=GqAj=kcUB8ph?eE*71qj+=&5yiY;!Q$0bzzMya19LXEs<^S&)31@5_;)zs_?8!JMNGKoGRY!H6+$2Y zxdY#6B+%x-KVL*-{ENfDL9MkjDgfnRO072CKxiU;x23>%1= zWUs^cp5^N}**{Y8Wf>HNutf!A+!dGeb=%k<;mQ91_`tenlK}C?k1M>nk{D#3MT}10 zZ9k|L*gcNw_8cE^)SF6=#tj`|fH;eF&k^HjIQYBQZbb0BK7P&7My=1Ht$}VwBZ7JB zwgG`OQEc>&PP-Fj%G;XXJtaEuvXD+^2fLx?EDU>wNxd@U~@auv+;4{ z#$=dfdYyoF*s+@AbIVa5aO1EYIC0RxRlKS*#CWID+Fj!j@)0BLu*xp?06QBU{pfz( zImxf)Ce{be4-Qjg8Rw2P!Z4(&6$v~|E&!k@N#v1ztEj4yXbGXSz~X-X>zujn@MdA-%3ZwJW2OzbDBK)g z%CGme=$}YcdN7IewPe!EV6Dk*H4_G8s|);d_x(&TG2r!%r-%vO#Yfk_&O$i#Vm~L=Cm_< zp2opJuhhKrT=3rgW@qSn%>L1$%txV@m~%R566WJc9MQt96#i@m378g9E=H3`+^`r}n3~FM<`euokAacM0t6t~SE8M9j_&r-xEsHoG zd4y}SgI9gj^TQqi&B4o(e=>3(bgdv@jQ{|Z0FrFh)4=23kwuj3VR@Q0{iJIxfn7g| z#-X8Q!IPS}x%lmqFq6si7uSu;IZ!Nu%2?g^y8?)*5L+kl8`-_9NoZHZ{iQdB{1cS~ zFzML=L^2_jou?eA-?^^s4ah+G+tqaZOGnCP)b^b)#lh^uPJ%RKfhBTHw22xzqhpkm zpa{nI5+CE^_v$Et0S%M)nj6|isJr668HT}=KAEaTBzRx`vl)X+B9O&UI>c@lMM`6NZNQN*qUlS#GZOntKlFEGeW6W4oxo? zC;UtOJ(E;u(kPknwhvl`9(LIQCz{-V?L3RK->K_bWqp2APqX`4w})4o75mC>4QcU> zS%&FbDI+iR*TAmq$K257zia9N$Xe+RvfEuvrq(g_Xwp@A(8iJE#W1nkFJ^ZB3 zFP*09b7R9KIZ6_oQzLp@fcI8;S~hBk_Ug(_ZfIWGiuNPzL%|3zWs@9Ea#4401K0Nt zv;#tqa&PS7`Wy*V*F26U-WkPxKUDffJ0=l%Zx<+q#B?8b0`G94?cbiAI1x(j7cuc4 ziDkpqabXw}ON>NQGeS*903>l%%uQG4qk=V&8nG);9aJw^hX;|qJX%9D(K zVt*3&d;UFT&yf;Wi4?qX@EA4G1opKyNH@UjdIgDGiK|b+NE;pX{id1*3^dU)s4@r#bjYcX3 z9-j})V3?x|GAExHhMIY1R;?B~rh!t#*0Vm5K(5CKh+KqSXGvu0{hMSNBUVOhW52?%2bFno1Tv;-v z%B79kGGd4l+X1fL_g()0_TX)Cx@r#&ocLoJIRu0NTF2ac#BcpH2tMPQ>Mf`% zBE4l7NSk2RJLYqz&6^%t;jUSH9jeVNXY34A*-`!*Z-K|hw?SF1jBQOlG2;U!5htCj zX&A{85GMoMlasl^k0f;1n&tx4sxT~%r(EtWHGxzrSKeJ7i(HUA5ca7Pq zNl5@PqJ2CT=j0E^UFTv|Zp9qMiv~ua;o+Ty0Na~V2&60wangc!dpB=@D~<{3b`R;7 z7j$tKd3bVcg%$>pXGUo`B(*UfrlPDX;NNaaw^IYEkVifAl^Ab4f?SE#Cv_f7 zGO_as0hPiIYj`DWcB=TkigIj7*&@EZ`9d_$=7eys6P8i6`#ge>6Y@_~(kshO)o&MoP#5;E;uYe573v-<&X*qrL&1x>IdXtg z83x6x5-;3X=9lLB3~13Y^pdXPO>k*9OtaP!u5O)K?8&p>unkS?LlMeAjiSuo5 zz~()2L58jjsD7SrB(ke6-O3ZafJnT`f2f!kIkID%c~>hGjCWQ$ z1k6DFP5j&5*Rn~g5IBjYrQjV8e8pLMY?+ZlnOL*2$B1QP z%@9)UxyucwcXgp+z6m1wi?!FB)uMBQh${FT&6|veCm>BDNM*@L8}-2jm3TZKVBh7> zZknhHh4n1tcXGA7G$z#(8DWSsuvT#xiBsHJ;<>B*(dYthgo$fgF=nyg@2k}uW96(E zs)NrgiU=Y7FU=bSb^_0P_v@a(qYjJh$5~I5H8F^BqLooRxdX=Ozv?YO7f0B7w%4`w z$&PR&wJNL(!evI%VV4P325fbXNdQ2?Vn?aL>^;4&x8tWaF%rSap3aR7OC)O}&ZQ8> zSc-574`731(xiKi!uaSlDX=-5fRUb(ODDov^BJdhi|OH9hGjOW(w1uhFM(k4IRw!i zPdl%q&~+7;Xynu@3kN4JUXvl78N|{TlVTTh={%AT3`tN&df;_H{u4sv*#J-mBV2z9 zW*tf><&>O=)-{lDsDxPu^SDsj56|t?{{ZUN0jf3-+(7(AHlg9%0g)yjo920n$&VVz z9{UQWi5qNjW887kYpFy~NvS)K$*JUJNPN5#5fu-q&h`V%cK6-E2Y@&|=us#t;*CBE3PXkEgkz#R}?0h&Cnkg6+gB10C?P#3>`R2pTkK z*41n=0Fpg7#ou%D)e}(EO-1qg`9tQ_jtP!wjAd|guEdN+IAFxPimoh>Px_B;{Sl}^ z#zaHx;qT5W!NiNiFnv4$UN~Zv_qNA;g<@*Cr8}Cv$?wO0skjy=i5CSi&B66)W$^AH ziyk?I-b+s!N&@T~SPjRwHbo!6;=0gv1!upMkV~V|HqkPCxL#biAu^VX+ZtLR@M)-R zHC$2W)AQ2;a3KI)UnWraW-M>*sg!YqL9$u)72ouL zAoPH?dAlD!zfKQ9!IB|}uFNhhIrA{!iy4YXk0254vaW!4Vtai500XDfB>W`x2ws!( z>Cj21m{u<$S#iMI8+u|Y))+qS7@9T5YU-hYHzVRAjEnI`R9QN+!IJaKiqXu`{VUtE zsXze^cnS%!I0d=+0YRzT{82_`s}2m=7`UkmNb(kv6iujDp$g^y02T-T09AY*g=Xf3 zB*fBB9-)Wi=OL0L+N&p)S)ozQDC2{5#gTsf8aHvTGxn31bG$svGFR!bQI*(`*({;Q zC;;GI&^r(Zw>@zbZYU>%1Mx;v9Ho+D3{B-7u!e1r63gY;@7~GwvVFQmK2o*jWFA&l zerBzl`3kbivNzO9=urWsrd13#Ee;1D{(b4RMjD2&aqx-LMr@oS&xE*6pguH-BORr{ zwp;&ni%$lds7j17TbXvxg`8pA0w<pLo~it<{ZdXNo~qN#7sNYu%wZ%+>cl{j2dR{J5VtpG#cT5kE7zB`wtieHV zWg8FfJ&pA=e-Q_XyH^MqaAS=tF!@tufa4-JGD%TyS(Wd&2hwd@_alx$=rd;e55$#M zgU{r7>j|4GNOgJSo*42I4l_5B%688hBLlg|-NOT1@}t=F=uOl*ne6aM#=7xsr9ct5NER&HUvaq2jz8 zZ4*tyf#RDsbn~Wie6`xjtVnw_2msf&&&uf_xs`PF9lhs4A~Xy!sODtKXHO@|Z%~YY zRJY@j3A*kNT3A@IDs?HgoJt)xT6o@BQCbw1IU-pmATVM6B!At&;{O2J&r;iBjP2oR zuHm>+v}(|uq{Tb5xX)yz5=mo!p5EjiAuE+7!G{NNcn6+3OHcxdIWMhpFPQ-Ot9th%HvKB3B%nX5t&h5jFe;vBe zS%LZdq?cncB<48L8Dz$mWy8mDGj7_T#~N_ONEiEd0Ds{1zz|6%y2NK;K?nJmx5Tq! z_=Y4?GfLpfnDWaBD==g%;3@lf7r?FuA2fH|EXC6SLEFc57kFzP4-e{cJ~nEYl5Log z1m`FP1&a>Aj{g9jemcUu_ldonh1$a;XUcPf;}|h!%#$WOVjx#o8b;sAEwuB?8aqes zdFzASh<(!qyRIYL&k;?NCN5?ej(Da*+hjb*yihbaYvzrA?bB&67?UJbaZ}8pyGJQ6 znIVD1ViIgg+tSV6$)GQaW6&k4%uvhF&)QaFY8ZKNq*+mvjbf7`GwFcX8&qE`R9SD| zrr~b+g^!31YtnBS%G5Bi$JD$qW22$Sa9(C8NM(@sTe7?h=DYLKX}P>Zskdpaz5f7k z-C)U-xa})pv@N*pjSJOXkSlUf>cb2xGXODuAH3?)sISyV=d%`kdEUdvJ(Tt|O7Ij9V&2BOATie=6Dwk=1je!*?IR)J@y~ic>Ao+fDqF-NBNTnCb1<7k zhYB<0Vh8$3EhEPy%_hJ>r#-kl0d?EosRagX4o(T1)OwblW|Ao8-R13!c7~~lub$rB z&reh_BFAnnFN#?*1Q23Ek~2oJkW|DN2DPr_4n_N2-SyUZxm6^1nr{}Pk|34{@u8^% zvaDi2%9Izy#u*w|h(zrkTeCDl z6a;PG>b@&zJp0x32bIO%Y!lLDhxGbR3mm1A7+N#td8hSNXpN@7Z;sVNuCs8nUsza< zDH>dCXsoDOB15&6e>QITB=CAt_HhL_ok{N!VdLiIGtW;GAlVT8HbY{L;p!uS_#0Q; zlhRSI5s>#Bl=ZF>3}5i7XmkmyZM( z@y5UfRx3%c9vGV<)E@RPX`$CC#Aj^oCMfZypFV6d$&C-x$>qYS!6pMmO9OV`fCV3t zI_=z*<}zLZky%=t+O89niZy6Ns3n2fOH3mGDMM7YHj_khZ-dhN)&SII_GDlz{{WNc zIxqC+JYh$hK1mVFl&tuZ$#EGr00)?-a8u9zdGFSR_L4@zIEwlTkKiWFPod~A>R5U` z$K`>MNeGrpP}fcBUJZb2Z@qP&Qpv=wn<|02ePhFOwl;|rSr}zy#%T-4El$!q?I(fT z^R)Cq$E-#c#DmN~A4b#lYn9C@;(A5`%(Kk6Xd0CRj@_U%M=@6n-GA~jfGaqyq8 zAWVpsEJzWhjH<8H$XOv5w2I>Uk|>TpH_+<{V^?!Xw6TMky^6a}40c-%Cvaj}7&+f%9oLE`jT`=Zb=zp>Fx5N>j-focb2KOEaOP$rDJh!xB&(?+j@lx*qJBEy zr;|CgF^E2#Mg&eI^4XvUE#PsuEq&Y$K_d9DM+Uknj!aEfB-fvLjsCu|DS8nJ306nNWLX3HVPpX|eN0k~2!<8mj+RMm*x7x&-?#8$t!;{bg$A)tn zY?ywLn08FwTyf3;eXL22!kgTCu>$*dByw-07sbbRHR(5#Q5g_M%FM9GFRo<;nZV-3 zRT>q2g?{}u?=uxgoc*1h8)L+F0({7XAFwile z!p_J>8Ck&3C}nUgFd)Wg`zRyZkrx3MST{qzJ-V4Er};H* z-G)Dzwt?WurCe-=@{F2#Iyohba-&#dWA1KGa(nef)gv+*inp|J&&C(xeKA@^mK;)( z;MwP2`e)3{vhpzSatye*_~t0pPCzOda+QkunU7+jYqfvk zja=gWNsTb{@R1x?F|j9`D9mI@oFk$RLn-d`D~tE(Le4tb$&z`0O{Gn!OOvN&GOWzr zag+^=6js%`B!US)j!$Yg%&;Y>g9Y%uCMvfa^Ip&Smt}-2+uS^KrE7hh5TK$~FaaN}%o}o2Dc2@NcdnurD&<%~`BV{Ra_W z6+xFJLAH4u(?`cN2PAP;D0_Z-WIl2lx`cfo`MxGhESPbTSVcfUu^r*VjWX($ROsZ8P0NG#%ehqsIzMB^ilT~=1E7$x-ksi0F%D#MS zm*>Wf9Aju!QDMdKi$=*DfI8rYh!VT98otxaeMUbHXJA1-Jxek&hK<+tHjo1wJP~7& z?k}#hQTfCt5>?c)+-FFVNfRfQ{#80Y&{t}9V{|X^`*aAQLJ(M+slK0uCX98^r8har-bJ}zxOz~CdkBH zj`_NNbjz6x2h5Qbk|(uQ9huO7jS?=q@@t;E)=-Cg*4S)iXb@tb8Jc(7PD;%B zqQ*x*m}iRoS2TG!co?3Hgp5d_I)e;Cm~Q_7S8~Mu-+|MTLCj4LW*BPg@`CDme5Xf` zGZC2=A=y|NceW@ekf)zfV_Ps2ot!Y^_v<4vf2bOUuj6c}{D~sPSw58=Ar^&H0^<2B#RVSLeTPZnW~$GW-r8t1 zET5bmaWxrpBHg)J8B_xyDidoPcd|v23BEgY0@fzKc%JUW-84z{Z5~mJ3~*;Fym=;G zOn^H2)E{bKK_ifO7D?!vx*a4mwMv_ABTU^b^ldFSlsyjuj2x~yQS+&}5C2a4@uy^gaDzz_#n=&q#- zQ6A_T^g5PKNX4FLzM?b{`6JXF6e`gES&rJW2OJ)#QqQ2Cdv8($QO{UTG|pgLR*39~ z86=)a!AZ{xxNReWRu2T8^?fM1#H(pwI1sIS7ECPTm6xY6id=(_lF?2d>IoLosqR~7 zHamX(5v0bfK)S*HhwFqQs71*j!${%C44~)xmh}f3}SU~!51jK$g;NfptZmk z`&qC}bu)ZTh&XDTE~A;IwmfM7byhK?tc=k>RX_;D+2oJFw#9YionepmW^2yodi>D36H~@Dy>Gr;eDo=`L z)zbkFyW#^Tba05|gB0V)t$8vtR`nIi(d2{P$IbNg+*Sm22RpJ46R9#2PSe?7cyiYw zMe}0X6@X?0ZYPUx_oeO9*3(8aDJH<;72*cS(hBFocbDB9NLqtGr8ii<;1%tBcRe+W z#LNhARO9xqC}r_eawVg1M5=La(~8E;P|~ z9DOzCiRY}qyJl6V60vf3HF|AOu>kUW{yLa*c$YdRw*ij-0C;Axn~NS(O%CjnFPR*L zUeEwYRs>)A$)nsFu9b~^<7taPfLEmBSkoiOj(Wr|uYP)= z1PL``dsIajxdtq$vO#8mh@r^ZcLsgtnStZ5Q(*T!&mAyP%|+WpC=#199W!*yLn$6y zGI>mZi2^A;ngjfaKK}qK*z?k`Vq&F&)jGGHKDH8)?w#>8DNRW6Wgoq$46f`nhM+%ES%`t}FNW z=q`F@D=Y8ZW*J)6EKZ_FRE9zpNR%HbK_75?_Ury5=t2c@A3+!>cH=RKHVu(aOt(4KHgELovmr}XaWgx-LlmrQdxG-yozJD*bYDU z=b?QJRzh2HiOwEs>NwtSHCz%1W%doQcOLCTcj-!35%;mpN}mk)LkC9F>MS^++)Ehi zbZA(MtK-r~@_F_>9}qMIOEoGo^ICYMS+Mfg4diIDCo(8?<8l1|0Fs06+r4$!5@2W6 zXN{@jV@M)^M?Cn>3c^nDAqI-M=blIcy}Il4gK68uN8)W-T^}YGQFqCeAW;}&wHVnO z05ofoemL!Q(%x)|V1>Aia_}V)Hgr`PfI-_+EPWmU zfYM0#@y<)nJ~U1l8b%kiIPX?C`5yOu0evGE%~Vv{+?o36f2^KC6R9}iO-7ceq;fs1 z@(pp*4b_>%ft3?IK3Pt%&}QQK7_TGjm7GZ~Vl4s%ovIj{3OnfXw%JQ;*P)Q^xPwK~P1HZSV?KF5ibQBT9IN%N? zhL&N~=9!dB=$2JM<{u%Lg2aM5b~k+4=jWnD3#lez1x)jkFDo&d9&axfdTwb4>c*uz zggwDfq|yA>ze+QR;E*%SHf3+DjkZjzyGTH!DXrU!lgL`4erOJugCa@e&I#fu@$xjO z#fb>s8V&%*4Zx5vtFTQkBh&fmYXHVw;{bnhC&KS0ILKv@;5a13D%mov`w@ML0mpjz zvC=aVW`Lk`nOhXmoVZvnJjnRr9X#uN(K2fky4x9s5IJZik zYI?`eO7OuW$27OFO)sY)5yG*q32MLF{m4>yjk>ww9pTMOGF&`j>lSQ=HE=x&W0C(xOwNye)*`FWOKdG;gt)vrV`BKPI7dY^=-&1|}_GrNr4{wg$SKZL# z5y1q|IS{dhF1I8Cb1_s5(McBXCmfdaqMm8K?nyt-1EeGl1|<|@)-&+$)M}a18D+@= zH(-*=`&@89+C?4PtDZfs`bzYaBM@w@QE@fscRZO{Sy7|p#SCF!l#VF1iXd@b{Ckdx zP()rQ={z%q4duLPkCPa7Uot{sgb783pa}++w{m#zL!}wOl{O^Iv*hVH>Ez-0nbLWe zBx=t%A8RnX0YU!&9_OCi^bZlh^NDeDvZvN$i!4H{(WAvNZNgJlM3wf73_!oZ>FiaA z7!elgn$%HhvSCVKmQ6iiba|rN8Yn;Ev;qL_Uc=m9KyiN<;8?O{pY*9D)TA#G@5oOs z%OBDqoB}`xg`h^^?|%JB^MMmogj*(kdr;58@KeEsm$N0ZWesf1yVOUy$RJT0iuU$V zefm&_=+7y`>Uh__#NWcOE}UbYNrcBIAL+u&ZdIfT6|0g(xBe@&^;J%UL9BOjddCT; z$o?jm5-4MN87^(EH%THC3Y`B!PVoa-C z{{V01ai?O!*?Ew@PDUxrR!L*p6=P>4Irj#=G;7pAC%*~@h^Xs3S4Gq=p*R=)N$&~h zZHM7)QhC~3)iTJ=lQzj@i9r;#VYY53*a{}Pu7-&f~AOWC1`$ z1K5BYx5wkCl-op!r%BGj6xjW)ZL3U~UK7(>^(4-gJZxy(jzW&oG zGnw#lC)2@(MpC7P6B$q`M;~yuyY6qb^fh$G&}uf38<{l^e~IQn&4xyrS3=oq8pg2@ zAIr7@Soc<6Q6j9L{2{@rlmKj`JWX)?RQl#F49_G}r0~eEy{&NkxANIX;Dw@V`RTzY znE;3h+tcsXX_ev^^D>%$CFD?#7Q`xPl#;8s-xpWhZ353!(^F@6PU;|0!jty;&NS_2 zJf93jy;>+;zMR7ZqR1f1?pZ+~a-dlDaC;7bvywd_I!E3GR`uc)jjUqDjguq_nF2%- z#Tz!&a204))4*0e$u_>+bv6f~nh_Z7-4NyK`o!ZSEwKtB5g}$2@*ykB04m7hh^~L# zan@}hRSsnaKD{=ntQf&$pB>yfNQ>pmeAQKM1aN<9KEV_dBFV8$pTL?OcRMZ&pec+C z`m#AFS9az;U$q0kt_TLZUqFz!B1su=s&f$PUMy{UM#Y7smML(TW?3>BZ+rXB}R)I0O0veyg&U!O%pFu4EZ^m8RnD*46<@VA`xJ)ZNj(~IqXM6VBpSu z9|Z%)?+?>8EVHHg=+j7Ae?qweL_(1g!(U zOlcyo-loeFx3aJt)pNLfbekrE0PvXa#6Bd-gGa~nGg5e=K;|hu0x(eRWpIAt+~0++D061gw7A^Pv#>(a)7(s0o7mOM zRSO>f03Et|qnLp&m<#GnJhC)1$>BKl_FhSjKrwF$lsI1QudPF{<%) z2Pcl;Urg2IAgMSFJ2g)!|qWa2=EYqswvd<*!$_Je6S9%HrG6Fx- z$K(T4M@?9n*(-rO!qSr&Rh1=2g;=On1*Ij=1PdTj5B~rwptfT$%^buUrmom}u_8F} z_sbxN%@)X{ApvSU*B?CoN3la>;xR$A5NBD_>{ZT;=59;gV+JyI)pwTt_htkB*WlIc7UdfMarr7fKC@WHrkUxI7 zfHP7-4N#ivJ}G$dru|47NLiGKwyLJ!NM<`|5%|09^U?!CFiAK4KmMcYy2SHml1xy{ z;yg()%w<(ef+KpnJFkv7t~uzi+H)0j)t14QS)MDGR>ee6A&LluLL6Rp!aXQgioOl@ zAR9kD4D$-<@+Uqc$jN8_0GFL{)*-Y)j9D0M@6S7`?3??2xa+9S(?Bp{7V#!Vrws8x z-ngnb1i&hSSBC_PBrxuMm*1wou$0bYANZm?9Xn0NI)bd&o}7hA516HmdY6i_EM1DT z&u*2(?JW*ZNDEBk#1cl6HYO2AjxEd_$0q@#Ganf190#j%l^Bm}TnOL~S z49)UnyQ(wot<~Hh9sP+k2M6PxKL~cH%sWk;^sET6u;>1NM~f4gDC3BlJ$YNkP;Z&D z1P!>sENf9;a*k|}R1P~``xDZz6=X+6Vlja#a&>c$qDL&bl15rHZ99R;JA$#Q91cx? zk)hLO>_kmG)Q-v4j-b-zeN>r4DhD#f1VdvMv;;Q{NV?z;#{;fjXi7NRv|^7AYq$eC zV(mK;>d?w5CLgB1V6IncfJyec?bTQwv3BFb_m8us&c^XfGEJQWVdI}VH^+l=p=Bdu z0ei2DCWm9sTnOtRbc-Jh<5JDe!;k8voWl@s!UGoQS?xBgWLq08y6AekK|=&aeKJJ} z-+;AgHMruzokkoiT69NJjfOp2qXUZjT7eypz4g?3ck2{`y2Nd);J&4bT6q{WQu$2k zcE%&!epxgK-Y61#169XL?m)yUc!PiZN&0yv#l*w&9X!wZkb)STDfNo?Yv54rT>850 zOBm}oX_sBV!h99u1fNxsWoeceLq4Hf$nOD-J&ofUE_=Wr{ zn=Ix{Q#O3Ij%6-?NTIW_P;dY=IsA2@z$?VgiL_h`LGg3yxY4{y>f6lavQP-!cYo6O zeaC>_#1ZT|ivTbs8AXo~Z3W33yctc&v&P>$LiacD%_Q#JL zrlXCGvpUxdK<(^4eY$$-6@bAItgS{}3T&xlov{RE+?66sqv@ulC$(|%00!@%v=<`a z+q(+|$?*w%MA+sQNf7y}0-{acWF_4_ILAA zJ+H|?-|Q^+J&5U;Q8XtlHe~0AH3Zc($B<*?y`L2LLSP%!!Oye(0%FD!DDa10!u|jQB z2=^0zr~X9qK-FK(o|?_v7#N#)cT!A^ODhUhlOHh3(CwhD8inDw91mRDd3*m{B>*&BvjgfBJ3S$aP*kUhslWoy2ons zDYLg?p5t#jyYP7J(AWu;E=G97d!g$onTDAXyxRg2#xb&I=erM%erVAhcG@)3W{y%} zqH4xm<(?&w;YO0eA@bQF+<@NaKVh~sJ5`J8hZqqZYX_LqJ1kA3hDCPT=*J=@0KsRC zifeM8Rq@X}j*VH71a+U!jihOd{X)&oju@raog&{ffVxQ-EyKA1NZq*5Ja;{6XJCPP zK&rcm12gCvX1KUegO1RFF)DVUvgMZD2pdNn5=kHqv6PzDAB~kZ9+V|IKODRA;u98K*SrZkG6K0}reuHp}uyOOua{{Y4D)J&)u#FFv0qMCHMGbvnb ze1((9Fp_c+b~i74Dv@UE+}B*9IbsPk2e$(M z0G_O?W>As0G1v5`!+NH*q`@504PyZ)OOYUGWD)`Y0PMw*5mX-hSpeTjs>%&31h2G-LS4HGRqA&mxBqPY_%(j*Uf(LAQn zTp=D=71>SxPq#f=Oz;fJtQZOhJTdVda3^gV$n3g|KWe zuEL~12F$8iRnx9&=eU~WZLN~#81Y0B1eO!}a1Q%L*&d|}yXL-nJ3!pRQqItyUs$jD zhpaxinz;C|v=Ij;KIXWN zRHT8qZL%7>B;Wg=YwNZewup`&Pz0}1U>YW58Cq^soMZVaWGiQ3EX1fwJnz|8--AT^ zp<<$dj8Hq#_)qTMRx-3}XM3O3kZ>K(eh!i^3E_R(9NdpX%is~_mX8!;*BKf0q4>mzT zMu$O7{-Y%7>0x;$aj9zhazL^PCdY+xL@FduqH0AeC077lf9Kz#*}>*lMfCu+8UFxr z^^5e)dml!ZE=+?mMIbX6i{F_g0sygUHmPd6zixU^+eYe(s*J>KGCdnL@GCNhb8*M-$g$w=9OJ{!q%+OG%rRm;g`8uW=BKYmkNCCKY7@af4bc%dGP2n%l^~--Geeo01pFoM3C2c^)S??4t@NC?l0&5vT!pBv&MN zB=LUU-2-4|FkZDBYS`x^M}SQnIS(KJ#VKgVF2zbcaA*n~0moy|Pvna7=O@BvCkBvJeBD01okcQ6G9QuJ3XN&F9mCj_Wh^xb%BF56Pn;P)%RP^LT*?h-@u5sNx~11^S&$uj7tx zi0JJ+$51dMD11i*IswCuSl?`5A{QT~s!fy~%MWAjMH;TEp|0vdmpL0}xL#To3RMcwVC486DB85E)pX0rf{+VLFFr!Q{JoGeDu40Cj)p9hM}oPG$$dma~@qd ziCnWO^Ovv(jiQM6_#IV29VCxIALxD{haF*pHG-t6{N{^f5t<^a*^d{^*yE{{BM{Ld zR@ZIJBhmCdRDQRb`B~q@aKlj`lszN)%pjKD~$ z98Kl%#Cl(dGMi9oRkC;aSk})nlom~Lqz12k-#sI9h{%}0fd2q;ST!}uZL-MjvJwiF z*vse-#S5{;{QPtX=pny9-cESa#90`!BsdV`@5zy3*n)x)>ise}1AUG=FFkP;JDgmU z@Tc_?R9$N`A5xMSvRwIX3~_GTxvUaEy{F&Uf$hgnsG|{(V9Nbl$J%~2qYSytg}!Dg zf;jf$&tRRlKkl+<4o}5&fk_n@vFyYc9wB`15R43c*jTIPDGXiN%`*ZXsBT~Z9fjTB zMYQ}kC%N}jsna5xOwzuS9|BZ{cuJ$Msz~JH(#QQG)DijbT=a!H$5yj9(!5KHCasmG z#gPZsfU>^#zq^Itb}Vl8-yZ!0MynB==8s69Bu?7aX!97)EU6reE1xk=+W}2iA0xQ= z>8QfQaUW_rKyM8fnjDz&Bwr?Z6;pb#AgGgz_X7RLxc6El=5S*qVeuXhhw)>JHKJU& z<}oCZqQ@RXS!GT)8Wb#=Hg1PZ5Rr*SX-yZ2XH-wBwaQ_+q9(|L-GkKtemgfjS-zKU zXh@KG5tc8Av8BgI@iJl)7}jWz0t;Cie8Nuv_do4_EwqdoBb53X8bcD9t2xp45{5R8ngUo4l0qGemYmNJWlz=HnvD@GH=m2Um{;LD;Cfg?$R?yXQ zGBGjamKI2)lXRHU0K()X0Yjb#+-twLOc#hrJFG$?(qYh`D;(v18j%bhCVu&pcS|->Gf5gdRYM+{HFo@>|R?A2KqLfhNOz+W~x8{8$5` zEXFBV5ba_ZhljFEuCDovj=(Dn=zqdUSrtt!&l=DdN&OVQ!O^otGHaxiO z`<*T`BR2&&`+4k0B+=*ETWrc%01*h%)UHlGG_1{#RfKHGPTNIO5#E6#`3C+dszLRG zQjUL^H;R)ZQqM6XK?G394o}mMNsgIa7`M43o9$$A$5mm8Ek1H4+Fm61x^_NIM+;)c zJh&!NBIDavpaWckTlpiA&q=n-qgNF@@b`>=x8s?2$BmPdBT7V|$s|RMHJ@_9Kpx+> zJwLl+aTxS4-8(sRK$WMH9};H*+AWDF+xEWU+@8nS*YDAEHHa1orAnBSM=8f>;K&rQ zvr;P-B86Bs3m!jf>U(pT>zbZ3>d_fI?=cz1_#)jn+xG6EL?4s+vEQcKVltXF zUwE@x&Yvw~o_H{ZAeCW6j!_Z>*w$pR>TyTk-@hFluwe1bobi@OmqVy$)6O0&0J2E| znH9r>AC|y^Qi%jnzmZ(9UX==(w6jEl4-{^z+AV{{WbZ4d!r=;!BhmNA!Az zL=o+lC*1BR`c#hVyVxexgg12!Oh42QCjUqgma>)~ekG+gd6oi0Rb#i-<0k6-) z?1-#Mz?J#&<>BJ`!!^ahBtKF zvWX;E+i<(sd(Z-byXn%d;nXDjU^sFNeK8||Pm2rfNu+{NZD;w?ZAxt|Qt^*J#yqKX<`4%-G{5?SNPzDr{0H1H8!aru>7#HdGAN9AzRKNBn%Aq%y;1(Zd^PFa&qyXA0|V%tYM1I zT!mFy9htA1A0W`_NIS4(_4O=wiCy9U02kwF(88JdW(=^PIxCMd2VzS%$J%RXt_VEW zK-p87pHob;LSJ0Lo5j#XRpyHt0SZMS3?pEw2q19Q+y*tx{{X9|Rb#}Jkh$}Kok}^U zT!xhzS*4R6Qd@GCW@h^Ut6HKs=C8L*$Uq>*LRbK~sXv?I*zol!X3By|NNJ>!Mz);^ zwj`dzi}aEI0LMz8-QH%#0aIzuh$zNFq2#8c2B^r+;lzLE==WdsA&vc2aa%ZPE-pb zjJzYZaDv`K$L*7MZ~@)J9#i<~La-r^5}Lm3_zBP4M|w|;G`y`nhUncVm7t8pC5hj1 z0xy76dXN7APv@>>W;wSkNv#E6G(O?G;|0-1R^WlhP?uwxW4;9Xgog)B` z>olHRd(a0Ef_DJJ?Wz~;{{Wu5-HZ%AFN}V^yMPT}TdDACy zDQ095gMZ-sdk{h3jx6;(rtVaM%%a0+wA?^3a`r}3WYM$*QzCHI3bmH?U3TOD03B9~ zNRvmHRGutdMmUm4WW~sZq(zR$n4s<3Oe@k4`;W&-vpJj}5mrX7x`d3MQ5@$5#0cav z#R?BmTCjO<^8EAHd$Y_w@py!IgT~o-m}c@~Y`l~$6nSBM$hlHuKsW&1i{u;m=zFpw z2Lw@=XkH=C7%}4N86sF^1(rC?Wwk!_CD?IBxcITfbiq$qJwh+RHvaVy$t9%5nkgkz zW>Cdr0SPKd7sobg?~&IO>jL=*&q>x2Jts3!S>%DFWQ`hk^8?dgrAJ}^0Na7jQP@PN za543gdX~99ymKMSe2K#rpKjf=vigZoI3NRD{1aV=O|Xib8i>Rr`eu)%tav#w#V#7k zR~RIK5M8-v2ZG$4rtiPcTthbz*}&#gYVyU8ma^ll0yk;^#-z&Rk=pNQ9P(`5-kywx z__lpwN#sK97Bsl-%e%`0R9-+s@&O(F#dhha)kUx~4o?=tfU{<>M`RQmC3eLr3IIEM z6MTX_!5sA43>(E<^9#l}`B~!|6vmkLe6};L*cngRb;6Jjw>C#g5cQl4-%Zz|gZ^fC z##TR;v8y5~va3;G7?FP8CWkzA)Od!+Gu;oy-%XR}kEd9jm^Y@y0$Fz7V`K~WC-KzV zOq@qnSpNXUvn1Lvl1zh+xFlpv3rlZ3D-xjhDoYRC4%Rv&O^B$w)lJ3Pe~i;e)Ug7z zazY2{NE?{!HQ29M;`lsuMbb4FQ&coz2Z?c~)G-b|%9=GUB#aXymLw!2(|oq4~Z~W4MO6}x?e7T zGzgNBLb0QJMU!Wac;xgBn*p|Pamj+?c%KtUFeE!<#Pp=Q;@r~F3auY=M5*KR?|nGa zCMkL_Shal@I$X?`kib#4nM5E;rC17Z06Tc#k8U~#Nrgf+yyuy@Sh|>^G4dK&*u?IH zBrE=*evo^1?aw_ZLsE+BY{s4y`hTZX$jpwh9kzoCmX!dbuy#^F{Qm$w22;`t0D429 z)T7ffStpSn9TZHj3X+kFwgg`u)0pXr#efHW;qjzrZiCy$A;23|@%ng57OguO>2F}MvlgN0ON{FO_H=Yd=2j>3( z9TiQn8;dflK=GWCWVQ=oK(yq-h?jk)~;BjfpG@ zc8}B9x;I}|-JsJ8HOJ4$=<;z8fdtOhkR z3(RWW;M#aquq@HA)nla~;`+`tRa0oS88P4W;Y_AwDKbSZQtsiN#rF0b3h9X*B7sz_IX};Sg&#QHq8X`W!-oV>M0Uaz1c*(5=G$s8`*!XG zpWnZ~1%sX>q?*W#f#fbknCQU5&QYT*O|fBI63Rip$1s>k%yD@i^TCOnLw@gA!dogA8! zQ^(~>PW2_4HQ)x=J&8OIjyn_3P)XWn5};U(w4WbAs_7F)401xkMaL||{$d(hk(BlT SkCWW+E4s1~lQ=r?C;!_UL)K8+UhicX#*T?$EfqJAnju_u!DA!QEYg1W(WqEJ%Rh8NR=}*1dOT zt@mc;)gQG!y=zzPUAyX>s;;j7yZUzHo<7Q};hI z*AD<7aPu0Q9@WwTHFKt0~>rS!VBI`#Rh%R`y=@t}YbzF8`|${y(htUq1YU|C-mY zfL-3ZgFX&y%M|e)z9>|H`lB|C9gUGH}xC zN3f^8EyX`#X-#bksJDmDKm7Vk{FA`~NB}y30}uja05!k>umW5FKOhW90J4A*pay6I z27oC51?&K4zyt6Ff`D)!8i)gufeauQC<4lWYM>5i0@{FXU;r2erhs{18Q1`}fdk+K zxBzZ}$Jh55JO~wp4I%`QgJ?m_ATE#qNDL$kQUPg#3_#`}TaXLL8x#bJ1jT_;LAjt3 zP&KF#)Bzd*O@O|D)<8R;BhVG-0Sp17fN{X2U^*~6SO6>uRt9T>O~AHbcW?msEjSUJ z4gLWB2yO)rfTzIA;BD{;_yz(%kRf;wN(d`N03r=hgBU_=ARdqqNGv21@&Qr@>4c0y z79rb^Q^-9G91J!L1q>^UFpL6>4h$5=9VP@O9wry23Z@li7-kV>2j&9i1r`;S1eO_A z2v!kRAJ!Ju7d9F;6Se}j1$G2>8TJ7777h*$4~`y=A5H z9^4H)JUk&hGrTCg8oUL(7ko5)4*W;>KKKRr1Nb`xWCU^qE(AFQLj)Iu2!u?88iZbi z1%yL{M??%nT0|j4HAE{!f5arjGQ>{AIm83RMOeoSQ#wgw>i71sQ{U~cFzfn<9=};w54N<*N z6H%*Chfu$v-l1Wmv7srVS)qlZ<)O8rEuj5EM?|MZmqa&34?xdEZ$_U(KgB@Apu>>H zu)qkx$iwKsSi!i##Kz>rRKs+}jK{3OoWT5v1&>9CC5vT+^%koXYY1x(8-h)ZEsYJu zj>Im*9>G4qfy1H4QN(e;iNpDXGmCS9i-pUBtBdQ0n}^$jyNw6Iqr+3gbHYo)Yr^}A z_kd4|FNtrBAA?_qzkvUTfS5pnz?vYIpq^lv;DL~WP?pe1vp$d{;) zXoTpL7>8Jx7)l&V+(f)i0w!T1(Ig2ZDJ7XExgjMZl_zy0%^@8kJte~7bCYPPbcpqKc>K?kfd;;$fg*kxS%AVRG{>xETNpGe59hM(xHl=s;AnbMxqv= zwxLd^9;CjYA*Xpm6GT%>vrdahD?n>Un?*ZD`-hI6PLJ*#T^rp`dIEYy`T+V``b`E@ z25|;=h7Sx&jBtzsjE;;2jPp!jCSE2xraY!OW-v1!vpsVG^A{Fa7C{ylmJci|tSGFK ztUj!@tUGLYY$|LKY;A16*lE}e*;ClZ*k3q!Ih;7kI5s%3IF&dfI6FD7xR|)0TzOne z+^F1g+@aj<+?PDeJk~sgJgdCeyl;5l@ecAn^YQa}@YV4h@zd~|^XK!g2;c~)3&abI z3&ILY35E)G3*HOy33&-M37reG3Ofqd2>%qJ7qJ#86WJ4`615O55#1J}5HlAm7TXr5 z6t@unAigU>Eny{5A#o_lDCr>iQSz4*hm?m@i_{-!A?aZ0ei?|2yiBajtSpwSj%=>% zH#sUfTe(`f3wd7oK>2>mzf!Q$uri9WmU6E0t_qWihf3!g z@EfH!X>T@FX;ocR+tdIxMYS}wEp>Wzcl9m}I1P1;JdGckoSH$JV_Mi+W?D5`x7t$L zN!lAa3_9LAgSzOt#=6zIfAnPZQuVg=+4Y0zUV>KUt_*e6YB&RJ6>uynsqWv!Ewd5?1L} zN7ka&sn&-!qBf~EKW#;A(`=9I#O*TePVJ@bbL}r36dZ~i{y3^RRyzK5(sQbJMsPNF z?r_0!ada7WC3E$2{o=;#7VWm}F65r!e&M0)QQ-;lH1TZr!g<|HO?xwVM|tn~i23CC z-1+MIHv3`vx%f@{Gx^8(9|p(;ln25DLIVebD1*X-c7i2?OF}>)mLY?o)S+)f55nZb zs=|@N9m8iLI3iLbt|Rp#JKvJN4STy6B_CBAjTY?@z4A`@UD11(_xA5+W4L2-VqRjc zVkhG`;xgl&;-T@A37iSp34ar95@(b6k_waIl3kL&riiChrDCQAr0%7?No!4~NRLgw z&M?cE$mGc^%0kNW&f3ma$!^b~$w|(6%C*Z~&XdZk&nL-`$^TPeRj^PfQCL?*S`=6G zP;6hkS|VT4`ho64W+_~$Pw9^`-LkQAf%57KqKdeR=Sr8#?JCWx;cEWs>Kc-oq*`#T zckR(fps(d&TqkPiERb7`nO)R z*|lxA8?=AvQ0f@$6z**4V(Y5xrtHq^!R<-vMe2Rq`?oKk@220a|8&51U~kZDaAQb+ zXlYnucy>g2WPDU^bZAU+tZ!U&yn8}uqGM8EvTcfQs&$%ox@CrUre&6Iwsnqwu6gJv%Zx)4N)`8+*{blYP(qr-QdYP=90|k{?$8`J()?`PcdH-@hAxG=PkNfP?^#jD(1Uih_)aNrHumj*dx1 zNQ6VeNW;v;KtoT@$|b?i$|1@@PcNV%C@L+hps2vir>3JSr!66`Ap1`vAQV(oOms|2 zEG$Y{HhMPM|KI6vKY)n zctoV);Y({n(|A6V((>w9dA@yZi|Bu>{I?!;evVA{jVpjm(H#j5>Fp;U;M3Dsb%@2P=4Mb382y~Xt#M9 z2(ozauvWz&HJ{V|Vc0vGh4MMn{_g4;52Fy1kmabm)61$~7LPz;l%}4is_VQNBW!uI zI8>WTjul+9om!R{xp{DKSQgJch76bI4n#UXepfS|b*SIW&4y(OtxXwnt-Gtb456=1 zM6eDP$}x07ZXwbb+d0bH_p%3=)KID8 z9_G)J*7;;@sogg)XcN#PkD{mq;o7tx5p_tK+EBI}3sLcYz`8nb`FN4`hu#Wp^$>-Jm)PP;f{=mJ+>Q8JnEF}lj4WG+~6ltA{}n- zYw>(Hy|FNCgw%FMz(9cn{K8GqJ&II@RT_vWXwz9dd1`v1pJZrJs{1n6QuWlo_2{0n zJTO-iDYvbL{thRM!^RX{U(C!{R+3{lD`MII z(0zaH&4AZimX?OIML!(mEYm43#tggJrB`)+wgShHJ$|veUwyLZ`t{1h4E1uApd`JR zR#DHiclmxVgt3S-+JFKFC6PEY6(9*9ch4GFb_yZuU&t|t#H9`;8>5$ZSe}=Y{8r^K zCSp@=3r~o}bCJVP2&G@adZN9nrp!pw)<~Aw{TM!KWAtgQS&tFU9+{X_kg(@0>FpK9 z6%eoE@YBn+vQ?=xB`2LjeHz`cb^y8Dp!?0()OY&HC-V@0)d?gpTas{X3v@;d*(aX$ z!-XHzI+L6&YxC2x>xOw?z{s59<5;3}S&mSg+Y z<)jLu7@o$@Q7vrDg|4m}b+X#I!F7P`x<7oPzzkHV#4ELKhs5D);N?>v%2)2j7W$`( zzrgihV3sTQ-EQtDDVGFLqfx&5U5Ei|Sqh6dR@RU?_%pPqZG+z2>TLow3x)7jv`DJs{Xv1$A5-6< z;avOjMDJE_n2ZwJm$d8a>%nFBqlKkW7}+^SUFM}rgQ!h*17hKZB+FsdMS47mV-KB} zuL^sM9~T)o!w3~2;U{yRN%;7@?2nVAG80Ip%)C(|7{RqG_zBvf*a^!eDIG8=BR1_Y z(lwdy4b6oZ)tB!My3K9!l)O93(YsTe8Ce*6-nFuhixm>=EFSG`BBo0IrkDH+IL%HF z{;F6}+!-9i=34!oJlse=MKw2(YeI9Go~i2`+nQ3SM%6SC<5FW^Drawr~Uaqhtz7)%81YgrP*btsmT|y zjt;^W$%^q}q@JDfRSm+H6)|pTmbJTM`IH?bs)9UBo=uJOhO=gKT zx@dxM^3vnUUmm|6FAbO=G)UeXl?PwIkI=?Owv60M);z@Lw)3hFd16)cTJK(h8i?$v zy=)P6C7K9)yL%yYmS1A7S(;`1avAYXefM}fHf`s0$g;MDWIJ|>NwBxGKGRnh2iQDs z5dJbwk`*IsOfOP<6b!FD87m}#S^L@urn$K2VZ!9&#*oRu3 zQGbE&oJQup(h8HcdXD4Nz3}V>MicF4JnC2MD;pFl9!l#wyFv<<&V#axDY`;<^sJ3E z8X`<~<08v4iJ&JBGi1bMuBuHjQ}kY5L!L{nh;5u-Q$y&z`ZEEB`Z`q4g+CfQf{DLx z@Qb6Y2q76jk)++06c1NcXdiVrxUQ`!8hg9Vs&1y3^cjC7P*NzWsNqzcFUGfCr}~&B zAr;em#Y1J2k+>hdJz_cB2fo{%d{X_rrm5gKaEJ{p9orV;(e_+$O{QP3_eFaCJ}jtH0KGALuWN%PneHi5B1 zDVr|Iykv*r&)oVhLiSZ(+-80XPS{gY7V2*5Q<#peU^l&&K2(=dg12-;xK>1M8>PiT zXJWn(y_4YvC9f^g_1gQz55T9oy8x48v5hQs^q!Ih5*zQ8yL23notAetd zlMRZWU+qlpB-BmNrNg#JCMWwDddl)df_u0w%cBSNQ;RhVqib1|c4>5Rlns8HsZ=i- zjmGFoOfCV|45&#*86@7W-8gT4%KsvBucgNP;XWnbzaziGy=5ASEtEkzS4mCp9>AMU z+gNIOB&UtHe>8Cm?mJ81{3b*j@yYvW)MR*sV*;&sA>pH5Y$v(#Qd6@JW~ENf+qd8& zyEmRIzbB}^PAcEU@dU2eQTiX^J*NiqOkkRPIuLCi9b%N6SL}qN$!lSid^f-Uz5Ka* z%@WSiheo(_(QKcaj~`ozhlcOQEvPKu!Ky@Kt})I@6dl4@ z*7IAl*iHEl4(Y--{X?x{M5$ zf@zSBA(hAb!llaWP>%p|@~u7|XvVM0aMqJ|4H0t2%Dma(}6( z3#xk(*)mtmu!@zx`1*$d_YePx-<|eUB^mM>&2qxbJmhGD&dZ)@X#~3I6KAstTU0&X zc6IH=8U1Cvsh021L2HwQyzF~b*Rcp#B;Pp9qqGX}6@l`4-IvAfB$F->(`69);)zvs zT7JyU#apXzwrQ2~q{Z5>t2(U_<>qg>+)j`mvG%e~z?Br16oZ~;>0v#I5!}#5`&ODG0snNZz}9_Vk>rgO$MBv-&Gj#WP!*MMOjo#Ne3jGW_*H0 z*^g3H_zfC_T$r04eaFit!zawp)+Bi3rO$8sd19c6vABU(f2Lw;MpLF-tXrw8MY#_6 zh{4^S4e{qPByFZ1cRk#J1-VI8IUD9EEk^G`oqCogM4HU4QxPf*kv6tmPT8-U;Mn~u zlOWGIIr|yw6zH_=ea1bm_TRk5fed2vD>%_ag|>P&2OEI(SFa-+UA%EVF~8JZ_pn0_ z-H6HC zYZYzrfrrw3iBu5_(us;7jzo7WO*sOJf;82Afci-q(}~r4C#n@k zG}JEygRoQ^RM8aeS6dhI6*z88znJ>rN&APHvXf=0fwEvvjiM-40z}KCD#DM@Kw0YU z56Q7Ly&ZARUK6C{?_4uYq9>?h_f`*f(~qb&k-6x;JPy{gDoWJExHSrg?`?d$^4Md8%^B5+Q5N%I>~Mbu1H3nc_R9GSgafzIdL->9tr28(Ep2w|#pO&r4Rp$TJ=P za{%$G0TlH}lHon6@}AHkhG}EO<*?N<77LzX(?wI<2BEL5RC5@>rhWr`iq3B} zZERl5cG6E{8Ur&977@&`L!J|x!~}U85zbn&ttm!EC6j_YdoL7CaWiS-grb%0t2Y?K zQJCGbf6j9A%Z^yu8eW=D#c%f)v0V~%30C<>17c%drgUa{MQI71O&u(U46WLt*8LGz}6l zVZLQt6?k&V1VgnE9wGhf4J{4nkS|1-GdJ)L`^%@O7x&jACRWzFQ>;3mg-2_i1PwW| z5J^5{T`4;rF`iVB0B_U@0WN(~39`cbgpCbT+yNxHmYJdlPY)xc=SL;*pA3;klUB4w|w&D?_>v(qh<3Ov^i6A*w2Iq=5rwo8&;o(`DyIWJ@Bo^HI zv?R-x(Mj4R{%>g-HJm^ZNtW^sWSi$6`0LRi;wx&hmL+^ls_#g|g@K98Y-Z`JZqh`N zO7C(vCHKCwzr8wGpDyOgft~L=h~kp~I|~y@2xa1D-r3N}XyJ2AOyOAr0-~bgnKph7 ziRGw0($&;O^kx;pLiq0wb13XGWSd*iasm~T$P~M!rV|=XTJJJ`lig35aAfzA&F)I` z=T)(dRT!frsct~+)_fx*Xk1E;Os>@W=}nw4v0h*j+UNPY!bRB|M^@9CVZw7vkeyvk zhkXR@by5sa(3u8*{dUi_;K^k8?$nuzQQQVAm5e~~XPS3sKwpUgB9$HR%r&4Mg&E}` z@43Mn|1(o`sF?0f&>cOoyJn|N&n2h&-X>j1nif;ymMTfG@WVYzv~2^)hdh9hH!93- zIpr52+|EKo!qDblpfv3T|3!5%Pl6CC=Tc}fa6N?;wIuV+1~gtWM^A=t&{781&1WtE ztPrTdzUMV>d^fbQ2<2@g%SW2X+VKg>4By9Mc`GrN%pN5+>4E=tHiDag$6~| zc{i!*&zNV8cVHxHH&af(^$XkH*B&_&6{j~eWuFaGeeO-Ey3GOvt)I%D5hL*%h`J(I z$?i(K1)iiIH{EU1uEz|0!!j9u#FsLP-VNpBjs6eFAX==Rbw3Az=mH&cnIQgk7`Rh-A6i4gXl8Fj=rcZo+`1Ke*Q4_5bZ+N;#lg*D=Z+BnAG z>Z_tHmmCXenmCf^?t>(=9kF}X!8c51SWpkh=OnHGtDcYJR!HSbtk}kpN4YVo7g=|G z)X&ZOqrCyVj5Yp*Px+8Ba*dPxQ?HEU*Rw&@9Tpcr=e9S;dSM759?zm9!TZmc;>Pe@ zSg=@)1ca+cgX9eN`|t7ZsY?wg)C`lb$!uffnKI9ry(}nZfl?XPe}T85W)=7)?`fH6 zxqFKfac0|WH*Y6HaGrR0TpD`|u@FQwc)y)qCJaqn&JZ^)j`q?m9`-8TO!F3*f4$R~ zs7%z^azfNLqAq?!sovkR8Ys>+l_F<)N0J)c!_g!bJoLF(VUX@vLS$tHRkS{G*kZ9u zxmy@m?mt;X)c$*NTVhHFLK3v`5IIh?Yu;rD7P~WUN1;Yg%yEvkQvOzw5Evetbrs~}$I8%o( z0!fv1YKtnARy4CsHP?7My1iTOE0flD`j>drLrCnY!{5G`M7t7fGBFyOXc5fCk(g>O z>$;14$^q4U#j(H%u%|Cb_^1Ml?y+QNwIF4tS0Dd51TAZXRQ?3T=UH{r=t8k41$ovg zYb-})vP()PFP*qov39yDe2JTMgP`i5ttsk{2(&LlVaGc##-1*EM0+r4W09+p9FF%n zHVaAVzOMc#p$OhNicI%15_!WomNXEO0b$C{$d#paxUIyWbISfY+%QR-VD&yzdWkn0 z#z&B4l3krJ?tS~~B|2i#NOZHaycwHoe_Q2*?qM|lCxnrc57ws+@f-TADM!hgl$HVN ze+0XsR!%9k_33#Ui;MVTh>keSX`hM3dyd_O&B)Y15fN(AOYXVmZ2O?ksgnENBehWz z9De6R@b)((P_JqKMV=GBYb2aP;y{d$e)s&7GCF^2&S71*RIv7W(s+OD$wYU^&j5#; zV?062g%}~Y%T=@Qu7scNZ06F6m&cn4cmwnzJOYNLnIEG+x_IUE4BcSyXv#CAqj4VC zh@{LtJb7$gDPEYzpTi^{`|HBR99H&nEV)!A&Va|KiIeLc*gr+)wDQurU#i3&m`(cI zQly+22rrKd$b?dpE2FwA2=H7PPlD&Jr)&E(6K=i0vDwG-g2x?XAg#NX&-0#s&v+JEc7pLUNb{mhB8z))V%1GB>g@xkdu}Em0wQB2X z@tKb3`fmj!u8=wVRdh{eGHLMGLC=u=u}7&@jwKV`T5X%L3r#L;bVO$%VzV?sXYFm# zXkX0hf&TrLF&w_3+ilmU@Lu+-X`VEd&f@4`4$1a{$8@ZIvaM$i#|rkvAcfQlyDd_^ zbdt3fKbwlBlORQ8-1T9T%!bmltO@KmD)TT1Sjc;EP0h_8{U{c1X zFSri7ea5o>g{*B9bwBA~Qv%gwR@^ciOO_A5LfzcYKQW0rdjFaIwAyUst=48p_sT)63N(n0R3$~lXtp$AxBt)Wj6!CW z_OmV~Qne4&6lf;zaMf~CjRg~9c?l#dXG?@+f8D4uiyL1r6Me`oZ!1=!?KU~=rLlpZ zs(=TUK&Fvw43eako%p;Zpt z3<&LIw7VA^Q@oQ#rc0+xN%)-TT2vV{msn~Vlz}~iJ2e@Yu#8??qxk zX(E<4?OUrAA0*fMhnuleN^;e3sSM>8GPcJg478+5G5#3R%y6{$9eZ29)bwoYxZL{^Z=G(?y)HLh0j& z0i_v^1gJ|0Ya~ezCX27My2ceTfAHD(4X24noJ8nMr8%uJi7{5SzG9GY0`*gAGSuG+ zMi50`=~WKkZm?g1F++us?EtP2U!Hb#8eB}abpl|-7A?o9=?AXniFH7Wjyg!U*4s&~ zj&nNVoTgD_Nw-)bi;n92E4-tJI)$31)6HC;H6fo9-&O8p`IgeB?iA6tqh_|s!Ddv6>6H#^{ucbXYl2Jwtnm6lj>6coA7;G3zjfJp{$NfX7gT5$U~ zuY@;Bx#@#?*Q9`?i&5Jp8p0^WIz9>?BHxO}tZ_w}h-yC?h^(|u8DAc4i&7)(ZW3u*K14GC6Kob#L6NV&cIW z9`xy4Z)`PRHEwl(+2msgF(--1L3d8R6wJ>s2v(6vMbiD4qgxftbBTQJK3%^H=w&VE zz)8DVD_Nc*#aHKMHnq{*>f0>Q`|X6vJ`xgp5qj4743w5&xb2Wiu7#0Sq)pVp8I#1d zzA5r|ex)ytFUSchPa>f){O_+mgl#ZNh0BB=-3T(xQQR5lVSXq~c5h9Z3hw+1h-5F< z%b9RZUiSk5f+Bm^rUFvAqyCamLe>^FxOTIiUEO*O#;APmA^bQ>o=1f(Ka)9nKcV+N zWvLkj$9ud7kts zTMv^ZT>Vs1(+|#4HEpnnoBs6`xW}@XRv^QX zFNgUZ3-(<;4O|$o?ojgP>qYDcLbCCn9q#;RjS+BvU<=yoRT>ydH-KT2Hsc{h6m}B6 zh_yN1jgvHd69`Sb29;;qq{5GvXHIch^~aAO3{ycCr^w7QFO4DRj^7bFKmlRabe&Of1PABuNR7M1b#}0)GKW(q@)E{@KO2+HHZG2j!6}o3&!?k z@t;%i;;IoJ{{rq=^=Y3U3BT@BP|`%1?W@}2WbcN9{GCg6i)(`#`E_F6JBXifXIkla z4%QTLJmmX}FmNc$3u8NN!s3S}a+e1BCza|@d@9)%Y9I}k7i2MzXwYyTIX zXJVVIVA}9c%%F1$tlY_**=#+F(v6lH#9zI2SHR+cTtdyb$1leF>ldZtBMRM8IVstP z*lp{1+I1{Go()CR!@#E`mCR>U|0(b={>7Zcsow)6fg^R@-!xw7Rua|O{LyoTyQw95 zf*A%@b!Rc$ruXS!5!s%g89^p+@M_uY&s3EaBYd8Z7wq=D;OnT4Lzfi`R7Yy zSS~DA zw@g`GWF788>c^yhu!ORac{Z@nl-VO<`?|uuLpnom5uxavmgt@J2C#xbq(K+H-mHp& zLWDH-TMzO`nVVt{)y&&K(Q;N!NKG6yTLmt6GcIL#({P0--O2?{v0d zN{tK2m1&>99O7CaDK(H0UfqfWk6O!!86h!5S{`4Os(j%3*ae^4>ET{MWRvK}s-u5H zb&~iO2>N<#1EPY-=5M=X>JyLV-hPTP(OIJ*0sY2YyqHW^Chn1I_8gFW(oYLuy=NYD ztGvl>P1!m=C%o(wYz}BpKQ^p$~Z__nv&Gz>3s(M89BXN zK(t6@XS5t{(fyuoV^okGA(w)oH>vug_4XVBH}E6O zY;J{_74xG55~oN)v3vVpfHG@fzYj@&J_|}suDX`TVqlGmE6&Xv%;i&jkr~(3nYQrr zn~J!qUHmDyP0~2_iR(vR6v0}N9dX!iJ(342q-CBcI+I?;51-X0#aEn+^e~1i5MV+( zVZmGe6VCT=8~d^sKh`j5H0xP7YvXXKFyur85m^tw?T}iM75zCI`|HW(h+uIS?ozgB37kU+T0FEF7-T_`+_L!QzO>R`gyYi?8grFk)r`8o6yF-8`Y3nF zKh^M;HA|}#XiQ_AJZR5^q>KXz?EfAGy}r&7!vY-cYI~>HAa<7qZsm&hW&%!(S0@Q^ zc63yn%Gfo&HJ9~p+u9ykWy}9~Pg5l~wL9{<+P;bL$ltClD4k+FFuLn;x2Mj;MuyuO zz+Wu%6ijew8`S;H+{_`)09X;dnYTxzFaI+5o?0bJqm|}A z)m$`-LVP)~FSNfjK6+gTlPS7a2v*dSl>s&f5vZy?Y;~Oiq-!*tp-h6BE8eLNn;Zs? z$r`l{f>XcOL*i3#7^xmG5J>XBa<>4M7P_t+qKNy*=TFU9L#5E~q<#@mSKT27wzB6# zbW}PZoRX6{_)8MYEtTQmmh9)*z|yTDd9Axl%=!I7xNFB$G{C4e1H%ff~`Jjof4`bvH2_GFYcN^(zQ zsVxcq#!zG4pDZsPAaIYQ?aKnm5S4a5IZ12L{*t~rFzi8DD5%sub}7g zFXdk#rDV+Cx!13iIWGmB%l^<;R>(D%31xpR6IT89@v-w!S8kU9GAC3wk7K|#nh}^w zsN0iM&SBsExhLqVjoe~0*loDr_P6C?PMHCp-;xs{P)@FNo@R)H(RKnV_%m+TnAY(S zN_jnE7UjxQjT7HMj!}h~jsv29w2FCKoxHl_r^P{)Vuc@aXSNWDRU%w%GQuyS*J`zF zXjzMrAX|W+P8HrONw%DqCT#gfKap~wln_r~OF7zIR!zCLvTcKXpdd;0(71*$lHt%3 z%_k{nr1joGrCxiw7IBj?5Yqp|6~sPnQQ*zpZDIHmL!p?fWUefp4Dn>?(%%)!P(3Eg z4Tyq77**Kf8^53>at`n=*PI?4dlh_Jv=1Sp1Vfz^=;naX!Vb>h34I4zAD=X5at2lA z&B8-WR;@}b`3n8j6rx;>5Qhm}QBq-i^;pCYY;`s7AiRVX5pZ9mI!)~yFj@Tq6HMGk zg58BLvg&CG_ zfm0YXHOfvHgtfMxL&GVx`v=Sb%75aIiE;3?)SA~b3mTH4%da@cNTv}?4}Bm znCjpCR(}-BYXBo17Uj=tHb;bL`bMi@S`#f?D~{}t?I?B!wKF0LMqfSP!PJ3UipK6n zSLw6kZ%z@234AZ@@YRT2p(|E+z=@9Sce7z!!_;K|LFaTqMZ~ODPW);E{Y4G=lY# zJv6bBf0?aA`isZylPzsD)DgVa?huuY2j^ z9v_7zXmhBDDpaI^^!f;_P$_Is0MsRKZ%8)osG}8-l zK@B`)h5Jq`UhhggJyGDNr(7b9WvP2>9sI*drkpcppG{ZcSXM)W{0i&Ir0Ns5NA8-e z!{{4hHchCiFD$S8r(pL0dV9*Pj)*Us3=yH3mi%vmshx-kz@KZoQVeRDxf<*@8yW&M zs0%$*`99S|7vkbFZ1wLa-hXx96X`fB&xsAID$gqaRmb`3!T6Ckh;L`$x<0q*^j^hk z-CGL97`azCKEM5$#C6@{KpH^X4M0Df^;l7{bl@w+-Ed-Y&(b2Hxh&nJHPG!5d?1%z zycpzAB7)_UI68LkVe`S24KDsdv087Ojq?~zDWjnnV*ZQanX78g-;kpolZzSCHd)@u zS%uE;Pdm*ST~hKFvUex361@deuGW=IY%&1eO}FpMrw?_9D+D(-l6I{5mY1Jde{Q?aKnmmL_P$WrbJ~v}czVL*J z#3}hZ@`d(KuW#m%y=18oEEEFJQ?rC{{dLiO-8OHU6zwRro<&>Z#3UZiCV^qGA<~ zE}mG+g19fJLf|JA=E5h?lBto98g2wTr>*Svz5FW5w9_Ng=Q2;ZtJ-6jPca zhTHwi)Uc>0yT~)LkcioB_&Oe};pyS%^|A+_;anGz5e7WXH$J4jIT}PyLWnJ(33*!^N@;ljyNlbVa zHiR+!);~Nqt`N03QR`5BESIp>-G?RhBzbBX8*s+r+Z_&rO@)^boZfddHBNbHW=uhL zI{ml>-*A>wOUxwMA$_$4X!wiNyobK6=JJch_4mlPPNfhxT9_Q5Eb>kn z6=q0M?N?+czQ1Dkyt$r{`DC|@^8wZa7UF9b6mEnQ8=vqzzK;@Xlgs+fMcZu>;jm!;YwNgkMDu79{ zb#pHG3sksFcg~(GwvND+rL#0;Y|X(XDnGj_3r7(Y&|UiSLe_d+FLU(Dv1ERx%BimW zMjfhjTJZV8CATEa>#ZqX@uq)=Mukr0!Mh zsChHv=D{9$(OgV%jJF@#qvdxlbQE|;;u{$?Wo|l5N20-zeuWRUi4wY zv*C1V>JawLj}i4#TC$yM59?^}l##qGKNss$tSBGiwHtJ3 zrqu@w;iBJ>lH1P0x>00>YjMQs^@vz^52m(*_i7HQoVu`TMj}Z;v!9_H3E*^+!XA$& z?kkm#y3t!<-bjw;ce@`+5#!`(jaU;V380gB4T>mTd&H9WVMlXr!cZ2IbTwp-HVf@g z-}^mmDYEoYM>`TMhN2cr(=22$Vs2ay#QpI3qFz1}^&d>-B5q@SE7<+3`<$q)uv@Ej zob5T4V@$ckwTY1>Gm|sXWo@s=f5(2WS5d!X1{=K|C%mjKjZG=?7$(Rl<4E!SSbun2 z+2A&zY4S<+Ni{%RAIHFj?en`nI*Klq`s{_N@J-@&{A13l{c4V;z&z=+UD_?F`<2(K zuABxnJzG%i*RXT_iYF9DpX3q*NC#wFn2Odr`=D3c@vTm;j+Y#J* z+zb-H^XXhhkI!ug3CepRj1RGi_kObr-_no6pJQX2p4^Y}dbow5T~e?s*;k6U)3-fv zq8rK>B2&LH=dB8OH5|OfxKTxvKJ`?k3VnUUbSA<%Mnr)ioGSd|gMKjEiN+85>Zu3S z7yVywzgQwSdf(764T>)aEQWfRDdZa$mxb)*HXAIVU3dohy6IWISGdH1owp6Z22wi=oV)HX9=w$7 zsEVjIu@-pD^2y<;-}cc9M7n{5Y44$qbszL_EOzX zzpiu7w)O-@v20sZTIhP8Tx3$aHo(OsG{T7rf2KwK zr`AHq>mW-j)`jM4P{0yK0a;2B^4Dw{$aIBT;bR{jU>mQ#F*RI#a7B^TkAJzuDTi+H zf zjg!}q<@kEi1O0v~|uUu{WPdCGaj->4zo`ty> zmi#qjVAe#^C}SGAxL6@AK@0PRR)sPW&_~x~n4vY^G zfdcx1Gp80g0f>)K$ATN5rY+7#m{h7nhNA>EFxo#H&6ir98zR(*r~x4GK=;M-FrF@& z` zv8hz=NT>axc$T~i&F)rw&W-(IANgtcX1(8reYfrK!%&7LXhPd`D%F0b&&`q21j^eF zl^IlV!Eime$f1R1)w-<)X1Wwqlj()&nuSM{K@_UV8v!FLZY79N!xWYNd}j}dMwA9J-stGV^hdJ9SWwn;nC>?-R00KRR zHyWLQtFn#lw)rEjXTOoaDz4yYj+|xir)`T-2@(sgJ#(ziQOfMSFhJ_zV=AfGFBg+J zOVaGIq9urLk%6y!{Bq`ZQ+KGAIfS}^&UggSJxTg!KXkXY^B~!fw&@QnZm*_GWxGky z52>c8!6X_4^vwI3zyKe6vWB75Ta9tsH7h)wGsyBNBIsFO!!5R?k_Ud^ z5;Mr^Mj#>sKrB&x6b7%N4c>_EKe#tH(3k*!~R!nkf;hI2m!upvCMv2YU+qI;QdE&ms1Z0 zCMRh(*RE@%BTzuPJ+H4hny~noN`O5E1Cn^W)Jh_uSScz+a;<0lU=GMamPD!~am8aH z+d`>NF|shORbV`hX!feCpQQ3MW|2T(0}k1()X5p(q9_~uA`g_Hu}9eU_Qptd63UDi z3Mb|VrTsE)HJ=P=B3khvy5(7_hBkdAl%-9q^2C4!KeP+R;az^CBwC_6Q?=;Wut#z0 zmPDs`n_rIJ{c}^6R(-lN8tM=@G{d3v`sVDMqcYws@MPJwTWIz;_VPA1DEuHv0`BN~ z<&!+8E4~`9ZpFB6!_yM{(#HiIe8Ig&XRj;U2=Nkwds*p^F!56~MYv)v`ere`CxtIm z%10pHMJ`RYppDij7CnCX2KfjIqiykE^!#$5WtKreatA%l{us4n3Tha#0HMuvZVC3r zmNl!FRBH{&xdSQ^CAi7)hX;Zd{=^K5j>I#umOvtN=VRq4eQJOzc*&DZrp+9hb~Rj! zwlbR`B{p* zvJmdT(w{&FVn^RP807GkM+lDJDZW7bILWJnYA3=?Lm(ilfK8FGKzU56R12pg#2`>Te=NS}&S4=66EkY0feE3xqf0*4F0(hkhOg}gqvAie z5oo2BR0IjNaxalbbV>sK&THE`9$Mei~)p}4yBL%h< zLVFq%JN@!_X7+nd9NDpb7uPPcC(`W(sRYii#}(7QYE;a6B1k~-I8wvcla`~zl5N_S zW6G0!oaeo_ojoleRg6m|S>ytG4AiNZbGVbs3}wA-wvW#x@5EWxkT@4aZK2a6P`R8( zr){?F-B9yhgD**RuQSG;B5gZ92LGg3x& zm}{RYEnc0npnM@)i2O!O`CoBnJLlB*>@rx?p(ucINv{3!WIL{Mt+Wf{o(D|7qdwc> zv_K8c*VNGCFS^9`%AJ|at!%qLg}RSi&E;)ei5dR@XwBC61J^LnBySLvw+Ig|M_;~5 ztlqJ)QGbUSJO=6i0BKY~40?NJqE+flagR3poEB&)H7IWNm`!1T$`77|9R_P2g+IX~fD~+e3Esm_!(34B9pqv3^*6pHE+u@d<7L=)zJBR?i~(e_Sup7 zPT*{M9@%0V8^l7k6m~wpOukdXEk&R{U^*Uq=4(WFi6B}giR?ONdZUzxnAY|}e{^2o zS~(PD`3BDi@%PK9sFUTUO_#{3C;Mj6K-%6?tN;#PD{`Wu) z5C`7|Cy@%uOKvgrEY)ECCm`t2APX3q_FYvh(w}4L?V1`^GiyrDIud!WOq&dBX~2<7 z0UK_vwfN?wOMVZiKjt_7;r+3&$IU}gM4M3^*jN?7_pH#0S)!I!mPIbeNgb4&s#cwJ z@kSZg84oO2nzMWkfMvFiM@urSWzq#Pk1Cb(0e?f23M4_NlG-h*r-dBWMfez2p_Tz!F)%Q+Y4jP{!0aK+r^v$D)SY$FAakrd>?? z7}Z|y5+h&^lA#=9VrS91aJq&zWKcP4qsL)m{d0?9m2h>PHX=&sM$+2=2iA^dtz>Ar zcuY`5Eh*X=`3LFRvi_5P-53!wR3I}OV$%L+BKbx&EbQeOSVl_lK<4Vr{{Sq@PHj}1 zk79p|fs08Ei&vpDb+LSXMsI65K2!}z0-KBP z*7IKGeZL|yD{y}J(=fMXj>)?{sGQBnvuJDtzK7f!$@yQ9(^ry@zB2qS&yr+UPzRKb z6&S1$Raf+`jz2t6()eHEQ-&|_imqTyY^uB#TZ)#`tS*_e02ks zM0Fk=IX;|bx9ObwcGsh8;f}(u9jR@8A>0AAG~T>q&dunlHcJx|9^@;?Jw`8Mqm2kx zQdEPqvT?iXlcnuTL^iW6g2RG&Kb~tD*PW_)6Hy(xi1l9%J{W(G%x5~+7oi{R0Vau| zOg(?Tb>rJK$reTAdDxCd-lN|&b~7*~)kp0>LFi59KW+Yq@gb0qIV5msfPVR%iq8_p z)HTO$$0q$QIZ6fnsAhE~u0zC-ieR9r__=B?%<=T1@F1>R|YKIF?(02oj zxl>_-Xao(6@CqZI}kJ#w6%N2`c{BWJ<(G`)Fk#9(HxFUOMKJ^dtK-x5Jljs-QLR#urB$g^U8y z794z_8~fs9FJt{+01C#}edJue=$_hGnnnyHi59wfw*&VFChwC13YH}pS8!j0lggdq zZItuZt>(T^Mp|_?q}E+b>CG}2{$K$Y^Nw+`GqkeP0!vc%U~@J#r0-QBgY_Jq$0vnr z?gWrz;(;yNGI^$_K^5&4-8lpBi#D?`(PZ5CN>asqkStLYC1^=ghzq3Q_4x; z0q=McI_c*^ECWT=Wad6E99-R z{{YB?@ELRPbom#Zq_$S%a6qo7-y?Vv4M(}`e4Ubgi%APkjPgR!C+@r0E%o&mjb4Q$->QHJZL7kns66|2 z88cBSo8oixDT!kgNHlBf@0R;Xql}dRv2v%WAcE)63(T~(1)gLIk;Lpk`Ri(rf5WCk zwkV57GLj}l3)Wefc|i0AxhK=MYBO)q(JDH;u|D|tw+59(*Y9=z02waRei;i#xt!Tr z^GN*e?fo-4z5D=3(gL7>r0yG9kJAf|GncTIEKy@ZzWJ5Fn_@b8d=m-WpLZ$gVC zRDl3+2_PQ*voo~4F7QGo-Ni>!#~G|-JK@q%0G2%(&mU};rSh6xe~EE|>}(1m!29+Y zEw(OUS~z5FGBd3++Zw7CZ>CH%YPJ}FESlI411u`Eh>)yH8Z@JEq4v!(rZcj(s6pSp zYf}w&QlU$&wVdzNdnZ-NAD<06m zk<#wJ&TD=dku3frN9AibRK4>SY;IJ=oe1QC)``qCD5N_`FXrffo>o(8B`3>l3H}x} zlC>jLO0lc6SseiYvHR8r_>&Dl1wbR7dS%o-wJx9WA(5N5&O!U0*?(-7x`vVO!kui= z@DJbt;Cq~kWI?=2RGFyXE&w@UPW@?(+-#0H=jHrHH8H`Y*}dm@oSWK6V0|d|%kkK3 z8l6(E;TF1Y-Nt;b{3I~xb{Q5pfGu02i}`|cI@E>3G|H_NN@$&hN~r7K zjFXiySL;o*7mbA9;f=?8ur{mWr%80DaS%KQ?!4xm-eJ~ZKk)wKI#l76tHy0MO z?T8Y?=y|T!^v%{v4YhmJjtKS%7RS>hEU#v7<*syQyK#7s+q2JW6up&a_+7O1Bk~;`sK_#pBy`q!!kJPzS*e}!bU{}*m1|P{@HgK!+du2 z{Dxm~kA+#~(_YXL{$Di;{{UUHd97-Nn^`Mvc!3<$ipSHb<0eIvFBEU5J{gx)v|YlX zK>q;C&*pjd!guA+My5T{7G8vj0pNNce3f9HNkIthd(8w5clZ98I#GVKuQ=1WX()5- zJuk4!@O+&rmR}7UYJqH|)%`On)KrZ(IT0!9-Ts3js}Z{{^xlfqdksB%VUdN?qaP9# zkdBeLW@aSu)cz+DrV2esn6{z7@ZtbQcA6}G7Wn%6<5NBYvaZ%(EB8g$Zn>85DY&M z`77D+RP-!KHZ1qctl$~EH!>m#T|ufm{ju^QgT|QzvK_mx%hV_LIWnrnSJ*sPQo@R| zia&9HYJ?kMUCSvP_QGj}UY6Rx=YhfdD=LNlzpOH^AHbqt`QS zTqx6liCLMg6ydUKUR$P|jNwnc1?`~-3~`*k=0 zriiOq-yvZ{-E)x^c_C48fDiDId96a)NZI!lcR|l2^Yz6Xiu>HEi#*q-*99>iRNWkc z?YQE?k8F23Je;v?Q7Sxc2RnG<{N|_IH@=%2#v^T{2HpjOe&Z)tz37PYize%ws0C*% z2mlrQaV=auCszf9p3FUR&RWm60Vn)AMgrf1*kj|Oc`1+pOCh!cbsx_qjTcdt1+4Av zdi};_raQjF6hwk*nMGgv7`@DhT&UzOCesVa;21j2qeZz2KMRq z$kAnYcHBKl;Yi8k0a*p?WbsdS=suN^QOuHv%Pf{u5>DE`VlqgoA(gcW43k76aJ|~k z{j*=TRCs}G5^td+^2V5+Y0_6AcW^B6S6Pd7WFnY9AX)8+F-H`Rq$ouMpDTWOVqo2y zaJ8^GB=*V;rCo&fUU6xHGJvTv4pfAG#17Z$KgMcana_gT!IRD5qB-D!YiFn;k4%=4 zz7z9CLaJ;D4Uzsbs&W!Q+dS3O9;=wD2*%E>NZ+~-L-)skrk!G$P!^0g%U-`<>4-G5 z?kJ74k2PNze?yr!De+pH{+??Y_A^f!2z*9a;a2F<0Mec&<@h{MbW zIXpD9PIiSSWmhD0=Q5ah)PB%VF3Jfet8MhWCNw&RU@LNv01bSF1098|5xT)x+OG>5@(J|8op^l6W`ReQ>mIKZ7ZfB0(J4 zKg$?B%_hIbP&TlVzG5$b`S!@lvaBIh+Dovi?7!zC;Dq{knD~q?#SRxmi~fVv9D`rlIMZpOm+J z4Wvt@JKMbr#kxqIR9}@#BOl%z5Ph>1O4PQ+jx^lzwewbg99poYj!m~H0Gqn#P6MJP zLFz#~pX-QF%7IBNr3Fw>dJIx_TT`*yV~(d&fp z!6xa3#VmRfF22JX-%H{elRRg_nH6GghtTER>a(9PB@_Z30BYUE3irS@P-vRIpsC|1 z!2S%1!FI25Imvn(6p`@E;fG?s+b0@P>_X0zHa~Fp&)=c?X4CTLc8(yAWOUt<+>0k= z_&|?88a71P1bF|C!rji$fz-4VeY}}!Oi(V3XHAU zuR&uZ=%%Wygc!jzPmuorE^}UdGozH+l>mSU;`(K)2x!=^m&`@q_sq~*M{g06QYu}y zy1H}F982G8d~|$qfW>5Ikl!VZpT{dcJRXuFov&%`K^L2sJf)h+l|mL>x7>~~e+2xc zky#i6CzLR1UX^4U^&j6cdQxGCI-20_JAkgEjLhw$!UO<`Nb~>#b8<4-Hj=Iww={2> zyi#chg?C24hFhc9gV^3@R0_?s31eyly48Mo{e^hKNAngS9z937$>pa^;Hlt%IuVMI zx_0qbXcXg-T+qu3ad7Ge?SvX&dLOPRS%o6ul#1#vwlL8KNcQd{%2&N{eQ=HOD{8vz zJ9dWa)1b@0W&x%l*jkmuZiY)M^W=q5xRe zoVMdbI$&gMR)cwxuD~8q_Bk3HdXYRuMF__#l}t~mIWI{Jj!23Y0TsdR>Hh$HiY-eC zKjDMCji9zg5^stcDmNMey)Y(dX4X!vU$X>lu7@tjE^RD=0Gs14yMhl)&qSuh99m@_ zDQA8SEphLWZqp0AahW28!#8H~gZS1n?Jyd3i}iMQ@=Q&zu0{IR3%Yie2+$qQ6 zw|#s1V6G~_0ZC|Ya`eFSHBBV)J1?F2tFi#^ml~Ae45Lf}g2`N8ueW@Qy^Zvt*MVV0 zbvO3LqnpHu(5kg6f>?2pdK_YD6D+P5%HaPKt1t zDJ(kl2he7d3i*jF6;vCn%J?aqv+WFa^t$|pKuoH>RXe@AoMMS%-U(kSDCMs2o`Vq@ zs>}OLmOwifgJ<6v@*b@4g;@sfIb|b*?|pM!#PY({)Pu@7B;;S)B>=_A93M_c(-*)6 z0I!DonP~MLat>oA+JR9?HP2y>(fcvbOA(4h90~+i~M01uDS4~VU39dSWgcj}ODvm#izqV;SCuEV77f>WoO~~_6>zMtu&{{H~WFBNU zeDXNKtU#ug_JiB}-~nSCn?p9Q=3bm;wJ@nX><#cN z1AL3gRth94K{b1J-tMCiF{DBOAhQn1{f<-`x9rZqSDyU=%kj`+5hc~%pdE4LDs5YM zP@#2Y0BtwO>wnub%Hr|Qf@3lytS-ju1dee!TCtcijuWNQ(9N+5X4)AeWE;DL=yN}X zMEZ9DLXQxIK0@4|VSUD98KHooX=bz=4LCFNWSyT|c2_467 zztb3+nK#Bk2WSS>h53iRFxDC=ubhK#$6;zVhOl01E^aA?~6JB=@V&~5({)u zU4I;Phs$GmCXe>9wT{A%<%zWEj3S&>GBNc7oR=x!nDp`$b!I?#qEB2%TAj4>K{=It z!}qaH z1l}NBfT$wuf%of;Ffhzxkf{Lo4Rl6WmKnW2kN*JTkME5~#6XcON>s?UE$^y<)BI<2 zR5v_j)+4ZA4bJa!PXjX3QfG?%R6vKF{=?rQ>AHDhzuACPbzry7N~;ynuw@+IRUG6; zJlkVFBaq!U72Hk?B~nd8MgtIv30{DHSXGh)h9xRsO5nVR8~*tRHm!mOV2Y#V+5m5< zC#TVW9J3P$eR9U7brHr-yO;Y5@9&cr0=lg*R4N)89C(&N_8#AsYZTOZ04)`GEG(~4 z_Ul9IlApBqB#x-b;UOG`Kb|}a1FU5POgu5yZ4ytmX9&UZQ@AHY7t4?J+ckz2B+ERj zA~w=`Q)I=0qbMvv70E5gKJ}84z5NcEbjYsJqRF?HzcBv*T;_ExdJt;3D(e#k;b_}s z<9cS!$&yfH*tS6GJw1+Q)qz<8HI=t44IXjeQKVw9Q3r85$mj_`rUT zJ`3>Fs}66|7`jZ%5Z54j_sLcj;#$xI6VtI7inv%lbGgXlsUn6YEON+0S!)FP^~)$W z^U&xIOtvGHL||Lrr~@Wp<-t&LyxH}!fJRRxSW-ysjWMLTlpvSGD@2XA&$d2Kg9K=n z+nQO=9wUp}{WE=k${MllTV}hUH*x&2i02o!iR)H+R!bHJTQnR}@lE}4NB{|LDD5^m z%&VS&2VpD^UtF|K`f(JSfwX?N&>WeD>wt5>a0nc3j>qGdevAo849Yx3uc7Pq%<7n9 zkm@aCR3z5>yw;{GGBF-|FZ@HH&1*Oaq$-|mqq)42^tKOjx0T{HI@Un947SI=9eRvi zQO11d!yC=@%RdQ!EmiZevUut-4}lo$aCsh`b6A=~BytLnu#qop$|(KoCtoLJv2>c6 zb0+RNU*<+;`DvS|GO-uCr*V@{AYiNuH`LLgfwZy%Pq*0g$B}?|bUL4=Uk8vglE#T1 z*($Y;?X@8!o}i3UL5DT9te;a^17eX`s9!$4vvHIBH4D`B@0B!S&I zkq9Gy01VB$7EJ94mw2}n+!_MAW>jl1SMyqf)b`3KmsAouM2r!^-f4*ZD>ZLS$=MgX zZF$n#dMx@%PO{G5#e+la(W=>-WoPBYaTp z=0CC{ka!~?LERj?V*$|e06lOTOp-hw6t<^=2sP=G!Q{xK zUkngQBY-N7YE;29sU*21fz^jMfQjUc^1y68%Hc^emPHV%vi011R%BsEC||?6><>Js3bXGP``OfU7)#}5ua$UL$KQGf5 zmZ{Q7yf=mx&n>+0f4A2qjY_d(fmkYlrmO@sPq?nX&oh-p5wdo(3hcmxkyHp;MKW?n zV8^CF-7pHr!wfIA6ZoH8g$}71_Ur_`?lyX1VK1j*PwNV@Q29?c_RGIVRLv|<5W93C z5by{p2>N%+x8||qz;)9rY7U(>45SWf5y1B+iuz)GuVulf)gaxalxia7=nJHjs+B%|(cDHJGra58H^nT!$s%@xaCF;1S| znPQ7crd>;@k_U*2BuaLcJ*y?So72<{rqJHzt<7MObzbL>$1~-g-mH4fG{IUqM&d7H zbv*U=%;NTV^8?|C)Duj@{9y@b=tKsy`3si_zp-c>MP)z%k^4Z|jNORf`&h z9%U*8n#Kk^u~<=j4xRdDx@WeQW90ykayor50ig^+gVVQsSh9jmI4nZ7vemEf;`et(t5g}-(2FT*NW$-m5WC*($&tBmjn^ zw&{IxWHf^*K#~!_76JUTDtr!ULoo_JneUWPPNWA;PT%xC4zQ(vAhIqXDGs$FYez%kQpa> zgh9_xf2K?I78l{Wx?hwdUDZ&onKG|KP0{Q;&}(8%QU1B8lw|_|Rjpf*$2cHeKx(T1 zcgNuTof(y(qDJ0_!!<|KF4XCk&UOJ&i{|{z_s5=(4)VsP!Q494jJ^*d1z9)j93NW5 z`%jlV!~s|6LE{>@N|g+38em3cNtvp`l1Iu^cgbqR=_5$Ot8iVU*ILLJnrNgz^lYdm z%^$W|H8fm8K!}}y_8l?c@+We09I64DXbEC9Wke2D6DJ{6#oDh8Jzl5 zdWeAlB*S%aM!(lMp(>L|LbH&4Km;GL83i9IfWkIG(E5HkQOmKK%K$m09r4nMWYg+b z!VS8p-G5R40DRWU&x(^$$Idz>Ude^Qj$gyfa*|K_9LcEXwL}j zVw+K})s1jIgmHvt`_(rXBWGz8bdDm!>A|V~)MG0~rNF`Cxn{A)BT%mD7DNGTpSNo%n>zQciQPxKBK@59? zmP9&W8CS#v-yjj!@0zI!@X22gT@ORlWC@V*WRMSPB;*)mi-l_^_+P2}90~Od7BCnt z%kqRj*Zo!~mK{)8ERu(J3=cm{imbF!NqhXnaHEXU1NCqEU-AC{7+risu}EyRj7{|; zX+Ms7Wpc2nLPAJ=JIu%Tix37|+D?=+_^hCh4Hu$W1fP7%OO;o{EMpG62$!+?_WpU6 zoFvsCJ`}~1vXNu#PdMx3%BxSWE#Sp0Qf}Sz0l@zGo5gkPMIs?8y92K@?Lc#wD4J;8 zaMA)#8~`iZDcLU?kX*SU&9`!LEGj)iO)8D2V(>^6g~KOJB!u{+r#x8ch@F9AXcYNW zAyNxpYV`NUua!Tm?$d^)Dn%0flk5j*7Tn-K{-zScqwvI^^jBbuqSB3)X>;1ARtgI9P z7%eH}-B9(+hDQyp4hG?5^M2WI(Gk78z|rEDn#qcEF~(bZf)B0c~6r zUVo-V)=K6dC;-3xM;-#z8F>;tA5JqlRKwxQiWrq@s~!HMrUDifM&IGt-TS;>qLI0!-PEPXL)fMyFHk+}ntUzR^Zx4z(6 zMFZ=TwQG~%hXt(u>aR=z8{z@fFVOeN;6HhDbU5vobr`|OEJ@ku4_o)gY8Q+$n%Y4< z`K-8_)$-RncAjix8t#%r#BJOUBc+UPo)f@BA&rBEU*a8p`7ur2*I*8wxkiTte`ww4 zdu9EjBb#VqzGHRB>61$YPl}_9@6?~8Bj0X#r@;C*D0I8$*%MenNk%!@c~!wgIrddX}UcL$A$PR zc+ic{Y*(qgmJ+8b6}*7@`Mc(Ewn-I+BzanmS3`_Kk~8Lr#yq}dZP&ZkCI_J22a(&c zBv8u~4X2DV0kED9(m$6T$0}*3Q5^6YB3Q~T0-`;lyPUi3W=sjxO9J?BqLJxg%tQ+u3^#a@k;(cR?cXz%t&IIb8Dmp2Gml9LC-CSpD#*0KBcxSS zUV(Tkmk^z;DgdEb2YWqlo-;mIz+sP0q*1mVKp5y0^6Zk;PlkGuF20#`bZQtDB-M4q z6sw>XT1GuZ3%{?nX`8N+RAI?qHw(1?05O)-k3UhY@Me-Vj!ndMs{`wqwWOXVsmC&y z*SJ7Go00rt#{I)yU+#u&&wm|gz>Y`7^5 zF4`@Ge84dv4_o6UBR3X>--3-^P<+gCDeDxi5F|1W;A3_@Kh6gk2^31IF9L^8zGj6D zN_e|bOoSezrZKM|XdJL+McNIwpO44W0>~zfnl{x1W!yF>2EW&~68%AZPvRaDf^_7N zdXJ|7d)`?!nbA5WpH!42OTU&*pXViN*Q)z8T2P0=T}yQ+--lecsg85Iqz004HrZwo z4jxkcn(JQufEZqyh(?)Vfr{)NQM+;V=KXq;*CyI{J^--;xV7eTp=d2DtV(+mBwx|Nlb9;1RzO|d{`-6H`6 zlsFD~E&1_~7z`Ddf!2j~^}>lo87s}UzzvlP6TNV1vP)K%;}X7W`d3_PGBxoVb33R6 zlBWWg<8Y+(K8K3S-UeoR&yfoP#V5TMh zgD&D1ABI%0+P=0rl1w7sv7X!aFOT~Q+1k_bRQo^Enx z!L{$TbsJA1y8T8_xm~#O@$Zt=#s>0&Oi9^&M%NG!}4yeLc z@e5cxjRpt%%W!ypX-yvUo}Ke9P04MRph@ZcIWGPXMI+0UBnuw z=F*|vBy0Zw`p5Ll*<*5tL9Vh?!a)Ly6VTuG#Hmc4RB4^!0b~SjUtE{Y#fbbib}p)= zSaxm?_Q<1Y!kw}qUMq0qV?%?`+!!7I&Tkv!T(b`}V4-C#NP$P`vsn%JtX z^6A`tI~<~Pj0SWr;r7@&&pzOe**aV^^&$TN+`s<-s^8xq@{fTtNb&6_iVL}K&-c$} zIc+vM761tSq^7t7hW=z(eAG#Lu9fM&<=z0%(V-OLW{L@_Yf9qf_>ECeoa_fNPt&6 zM<;Uk`eX#ovB-j80)u{(2evRvG^barjunN(VeB{XimslX`KdB9xb)-GFd`$TO_kIR z-LpAOg8f6nJCREh#Ty}hhp0JIPmnT0;JJwq3IP`AeKJyh42~5sDU9wyIu+aZ_c=@X zGG#t6NXd_27iaon`DS?9NYgH%)n$?P-vEFC_pFUd^x@KJ;i8d^{Vbb5Y#pA8gV&Hp zJ;nf?GDoU;V;&QWAnrSRbsoO_-~_H2kneKrXarr{jFzdfPMerF?8=T0}sh=ex zw}-lypW(cp3N3}r?QRa*_VvbTqA(CV$_GBY<;2h(9BXAp(t4jOO&=p~HaYgoh*JWx(@+PKeZJW-PF4~nb_cEyV@tia?;!RAzqVXW zF*I?W7;Xcg^vzBwX@VZAsttXz;%gc*gtpeOXaU~xV(Xb$p)@$>&3FY1kr-ABMD(r? z(=4fB4yHFCjt@`|=aa(u8@MNQdmZ}l-8~P}AEWkQl1UePC=1fm*~{HJgv&HatIvtf z+hbIF43@*PQGk`Vv!j8!ohW~tpS2X4b=16XC=$0o10AED;ww z6;jA6e04k=L$OAP6qt(wPnks!e%KC=a>|?7x;Gw~ep2`gLKAh3v4hB~{IQFrL*-4d zvNE6JTD+6+xAIZZ?mJm_1?W=6k4rthv5Bl`T0bC!6+WW*#fH4s-K5r0!oF1dE`M@=j`QO8E(WvJAaA9Nx0nvuj)HfjH z3TZ)C^14i)yV-}a{`j;_Jkz{R`hDA%_iJ*WvHpjQN>qpLu=-c_*<3yM0D%g&U*a3`nOL!5}TQsNaom% znVT=eryD+0Ji;QeM=KQrj|}uDt>07rb2z$Vd1VP=l=k5LE1@`1hf(HvosRD;YBq!Y z^C~pcrlG+Bqd{bnJjD7BOn6$d6eUcgqKl)kcTn^flGKO9Oe&H_OoX>K!^@dhNYX^$ z#7^ck%-uiq`u%Gd9J8!&CerSpsABz2K+WPgi}{IDwC&=n>4BqF1nMR`oH4P#`V1y9 zW*#F*r;p;guWowbabis<1!R}QQ|ZrKGl#5GIujJ6j>7uhT&c6N@uZ34XhoMMDesF8JO8ZhC=;`tOY+14x6lE$HE$X*-62Y2Js9KQ+2en``4)F26^ z+qjcX{$g=F_-lVA&!|OV4BjGv$@1Ahaf^N`N%Ia51Fpqj=cdqeTRb6RQR0M&LiQx7 zAD&I`4EZlm(r$f1eo38DDrzij@A zX$yi~KlE-NddzuhbX$hr2m}y2nt#L*(f4~JnA@Zp!UF`DLElikUx8j)U4GDd%4(0sk=F*S-)!p0Y#oV0N;%@XW=-UR|<6o=l-6{Z9 zGWKkY*Ks-!Yju!$Sn?OG{W5?WpzXFYci%#!bLdBGn@*4L=J4)WDAyny*LmAL5Yjtw z9GjGyrvCXi>2vKolJmLw0P=3@7m%#@Okc!1RX_p54sxL~A$a!&1OO_5#o5N`tQudwwEA7*spL|6o zd0>bG8xrG=7;t|0`4UMomEHSCkC*kPSt54Rx>Z<=C|yS5w#Z*W{xdqb zuS_WoyC%>94$2qpUB0;}r^D08rRR*Z9&eia5y#sgOl&mror=B>@NFu3b_T&ed=%*y z#9i`$p!}?;Y<)ofV+84eH0qmSkWoJ<=CXd*N>y0Qx`!kR0aCB&^vB^&UjkY&PNej$ z!oBdDhcrQS>_O^m2R}F03B8>jg@g+xpt+feVAoxG3Lo1vp6>Dlyt|5@62R}lAC6^u zJ`E>^zAT^!>zZIl`kag8TJ2t$V0g61fk>#EmsGoX4aCbn+f8~ zq_>%sjaT&Fr095@_x975t6`5jOUJZob)K4Un@7{Q6)QnkqG8+b@Lj z!yw@9uSytEZngz1@!yOE$$d!!j^rGH1)X~O(69~xCy8EQtWQupzm^e{oe(Nm>wPhb zaA;#SBaglR06eoICZ9$;Fu=1EJd5MsBFcp(i^M7;X(Kgkz=MBYhZ?FxetvwzxL%&! zdf^OBQfStvF`;9@pf3fAW7M>y7`)&0T@2Jiqmr20BVS;>Gg7kcOoE2hxw@*~e3qs6ZR~ODrTrE&c#5?du0Q%xZ2Z&=W6st~(N)yt( z{{TF0bx%GHk-R1wl$AZtU#@AEGjC9K?ovKrPdO=xT1SWlU)nFB{)aJI8P+6ftEwxp zj~m4gvGvXV(+yb?SnLoK5-q3?rQ&vi-0M}meF!;V@6^nw#W(nsYIk%$LyvCwO~A() zc%OL%$>a_>_4YX=QrJX?bdrEN^267@MJ)JoBFL?K8|57j-yH)YA_$SdQ^*I8wp3(j z1++BP-IVY@t|a+|1hN@OU7#mI3X)IM5ATY2Fhi#Z3~`X-r4FCaW23U>U{iMTZ1jzX z`u@10Kn!A?=?p_BF&vg)+Vtgem&3xY5KAoUhZ93FW;;AU1qX|y_bR&wt4epX$V z_dI>DTTa&K^pZrPo<=6Bf|7kbvDd;&ep2j?5MD$=Q_6vPApZc5Y>fcyKoh@t6lDS# z8+%CIRnF4G-m)sVN}npp3$XpkVi)+|0}+a4sbC`^WxtlJA8>DxgcM0OqfxL%t3#GP zQa+=m7vXpNmN>ySz_(I7zk%(Ht0)`cDZ8wj0PDPxey1YpO=rW*P7pFWk!l;S^8R?l z_aT==s{V2kHC{@L zb{LwZWckz&u&?KrQn$sC*a+Qu=&C3mzfy6(OOcvlS=jCJrP1kk>51g385nns2fJ2W zO-HYeNMmOk+6U*#)EC@lY|kXS;U3>^;7ow~S4OBvLM&kdb899lyS6BSPDhC&~{# zrwVJbqcK2B)dsGZqt4bq)5#DHRfjuyowoX5k-pgho zb~>ZqP){Q{_Zl)Z1Ih>ig`YP;mO+Z^Ec;Ljs~ls^LnKjBF3?9?8LUlgOGpS%FR|}} zjx^fENVVp@y|9`#Ql|Oa^vj02NW4X+CXY__j7?9qM*)}~lzV0@Zc!AvZKI9|J;qrR zNDHySD#csNexF>KiZvTpq2Y(_foA}pPK{0gTRjgK##~KoBTO8{;lL&bmTp)M-2NG5 zo)XLD#%SRM<SNUYUwK|2zrgz>Xl0Zi! z4=5jV&O=PoXrhSz&M-;t#FO^CK;oqCL(6&|xcmW*Ad=TdBk{`xXjFv`q!r*A=rdoo zXl40`3=N;Y2*VqQT|w`EQH$XUZ6uNf4Is6yoR6o|GnK6iM=TLPfCCHVAEo8i3coA;{F>0ICxQTUM+jT+A^NAF{d+0xsM@SAY}#%r-XGg2mz zt0fQ>OB}0rBm8latO%A!$SmM3SW*E5d;b88vf-N6)S{ta>+j9i<&xBeOCgpJ@S=jG zdVX0iYS?E~Up%97n`NLydu4&@(GqzCk^gg7TuU@Y)JM|pr9PhQfeqwj>@IGJl7om0702(y+{eC3M5F+TCd9ol5_>m{{RwD zP>wg(C)+jUHS9*qu|hH9fTNo^S@7cu%2`T~rop?T?bjiri%ua?6fROFUzeyEWcsD= z%LEbmnWK+!A38452h*l7@!`I;Ej7h!=bIGj}a2nEwJJeU=GTBm4tZash z2Xc59Kw?8%I1xr9BvJxy?y-6zZ9H!*@)jTj`G^Lu&=dLP<2Lqk<&&YbCifNO^&_r1 zLysc_F~uh8R+smSUjy4UCMM|)6_~JcQ1jE9%v+uslkGo+xrtE1_~A0J1_v)YP`}P6M&&gf_<*Oxnfg|viSfEM?=#t{WJSxy9A=X zYVC_x3k-jUjJ-PvLST|34NH&O`aCF4(arQn^sQeOIc1V3a9CSL0RI5o zKejvb6CsdlH#pqvQLgW(`;1H3XVFtZDm!>+0uDnKyp~zvsZqzM+a*i5n+C@jnO3V| z5!%2NZ+yLZ22o{j$L3MN2QQTH;S*T^U%5T<$ZItbvMN67=aPA&?_IHHTAT26KeY22 z+$~ymL7ut0KQAojhR<*V#2s8e7SrgWsmlD zga9sz_V>)=TIT|Q+@5YOhA2XarHw5pgGRX9U+8{06xiZe;a#Y-FM>K|r-oE23szME z`0JWLQH9xy0)5U|63{UXIw~_O9&D4xwr7;@BFoXmfQ$<96QetFbABT%S?xlHAa-rM zeJ}cC_h(CtE^GiSde`*KYfO?>u1V|EjG)$FfEOYm*cR)SR&3V(yAwzN)W$uLt&g`% zx|k^%CSBq7#6hz!1b#VgQfM^#m}CtcLK8y676ki{gDNff2ntraI}U#@E>mV5ap!7-BT z1hi;{6i4^Kd`ij`MoOh$m~cHu8K})?fe-xnKlhLCjQpGUe2?o-55r4L77gOKU_c%D zvz4U`6H@}YEgAwS6UqAj0E{fvaeO8XOhM<2?=`d`priWcbkwesXmtZlCP5KkRa=dt z&>F{;&y&Qisy1B5yGv%WYGZV(;;Tqq*xk`25I%>f%c(-~%#&177-KZ7V!fxHK~r`0 zABHsY_t!_}4H$Aj;eh~;!zZdDj~K<#utiWBueL4-)!kecMpgv;rtdTIzYLy8*Gxsm@$v|&=lSJLdB3YS zhQc;hB-tj99@tI$HNGFHNPr5Vm{!$dzm7{9mA*XjIaW_771N-}hJtAqSs3EL7OK2{ zI5xmVrg~Hrv~jm+CoD@>!Ks%`Dc-7R0nY>h+cn`7L99tUs3@P^B8z?UYOYYo3vE>g zuy_k-qs0p@W_8=-W#o1UOD#}a#Y(LERsjWsvG{Jc`dWb%)SC; zNl8t?xvD%Lwl-A4wK|wI;S8)1UACZZ3m*0Bma0b7>vaIJh({HYAq2Cxpu4Qkcfr(D z(-k`V!&2M>9N#x__*-jL%?*m}vx8ROt+JQoVK)w%L%~(h@>MwCU$3geV zttZ7aIv(9IpbzOUrr;x_vu8olq7xd&%e4vf0I%Ya2!tY&*&9&0{6uJ{p|RY81rk;RqqQ zRXN7W+_Ik>icl68>x~UXBa%f`ZRuHH1(b%Z+!I6&ai$a`oi_+VkV)Mcv1jY=k_r}7 zm912RR?F0k)}euwIuM}q*PIyDk%`+F7yMY?qPe1sd8Tg=lhKa@89q~Qz$3Jfd2C-C zP#B(C@_QC_paBE3cgdU&AufWK#Yc0xfyVdjiohy`*hDtDKa85TYpE zYh8UZV(0{7m5?^yT#DGCMI{g@JkYX18K}(|fxI#rlyL~Kv&*=wV5e|yU% zz7prjOh=8i_Y=`%>`&LzA3dK3sY1+X2P2Be=#Ii&D=L zZdPCv`H4V$q}S!wGpaPxQy7aP?o!3CmL8+i5_}er(Z%Cz(5}h9cmM^F?_BZxv2OT0 zc~II%VzN!Wp1$-{qZjRGa)NSqlyQ z2;dJu4_wWo=p)s^rqc&yiA8yKw;yraB0SgIt79drIp+F|i{KG%h&J-dX!!{w0rd63 zdum9ta|toGLA3t>EFZO>3S}CFY1r?KaL0@GKKPWe?ZE^sFNiH9?2T$k`*3r7Wb(%= zXH0!Ys!d0Lv={h~d|p=HY$Tbr!$}G&+x*-xeuR2s*$;IFk`tkcb`oMFl;h>*{{RfL zjgw(+`FadSp;3WbQ|p@FbYn7>S(FMOeMNDc>!Bu?{O4&sYmCpzvEvWT@(qLOlEsL% znq+wy;$j-CqH})u`4aeHP?;3a=7(RtKWy*Q*3-p59yQS$3vpjezD>bfl%}Y{{TF>sTRJSWo@#kY8)R=U#3iHG};Lj zw?fRr(DuupOq2TFrZ(GQ+qL$p%}omzL_uhrCJ@8Lbo%TZych_G`AvT<}CI&~?1H zIvaR{0ta3OAarF*0l1nTopQvbNivD875(_~pT0`68t<|zWgB`PdS%>4B0&EDv=z@& z+Y>yUf=Qx=VE!_PAG_CfOL22xGF{``CSM@bT+nZ-J@Rt?(^hqHI;dgR$oI}ojGJ2g@j@$WZd1rNneeI!Mp7u> zt>r*AoX7!3D8r#qS#UNu#A1lDM{!kvUNVA5CcW{dG)zIZrsKHArZaj-Hz_=G^vj@> zw(25}X7#`?F+7w10H-JiOJQC3Co`Rz8j&fD0et1c*GNwP05p7m=KlF9JT^8SAta8X zubwi(h}CeSkFNtNHC0_L6pv7UreA;rgel1c@WA&znDLl-^393?Dl3~N?;2x`D<3hg zriTL{a=SHvK^>?Z)Tlk`2GCZk>6c)OSbRui0ZBVg+*V@tu`=wFPKDTQ9Tf!?IiH5U zMI_pk+L3K4+^?wm<+i3zk$7=4j~(|*SK*6de%&(kf|7K87ycrOqt4&3>5EoC?l7on zS)G8tG3W1+b>%PNjOJLz!bhMS557FBd?iH&Km%7!m6tHrNJOy>iyWMF-9su6;fl*` zuyI>|m1GmHk&STDeF#ps{3Dj>2nev4yq=c zEN#4}JCgW5_xH(`Dzh|*OEG0*(`xxo`stWlfrCL3-{3gJ!<$}XxnVl@T1dda; z_`#S3ck`8z;%Gjd(^W6dF0=G#~J0WUIV^uM5u;9!HM#bR0dA@Rq98hr9%^VQ?PSffToA`&YXI= zSmoT*aLp`w$>OBj*!m8a*S2ET<5o@TN{a&RiQ^zm84W2F z?fo-8TJSPgO$)iQ$Jd+fnwc5BrhPnrs}`ah3+rEFlHnuHU0$P4C=kSs2;~EF^*NTN ze7y)hAr$DxcGg}wSL5F^w)s0ty7Nen1?G{<+$9(;iBDo$ff-U=`4kr}<_r`iuKwpovF| z*7^*ReXCw}l0bYt+j?#kF}F-jGfzB)8sdmn?+=2<)7WE7P=usm7t2C`Bep&idsA`d zjal}_B5hMUI)q*Ek;7e4`ghB0GWk~|n{>dGs^^S+A1^;k@fh`GR!H0%+5tQtwne{% z$huVEs8RdBTx3qiB!VzEN#s3`^TniuJgqBvT9*0~+t($%tOEn4Vyp>?&&}`ci_zr3 z+mpK}Vk<77!SZ=5k3qp)p$tkfBanEe7nrLYy1jzPr95rxf7|PpTrpZYwv)(3GIR$2 z06gzM)z9V75|BGlvB>C0PT4qkIe9KLeOpkGg$p5g{{UZH%$Jhe?K4cW2_7kV3-XiJ zk7Mha+O^ z8B?~b_34*TYa>`z0G{0C1VAHoSUs<%5RhCw0!RmwS)TQy1Crp~w@z}Sp380o-E&oB zU=SelL=o@CSQ@0SnLsLiPfXGX4!}?%?YfZAX;IpvHh6mTLZ(o48!XJCRh-4M)v?(>rxMIrl>-M@^#ohV(pS<(ZLY?$qT> zN0VdJ_0D;X`8YR_9kvMSr!^}rSwTB!f!v-ksex_}l@|9{Yrx4sl#PTVo`#7R^~Udo z@bh;~42+w?8nP>|r~@=?I9EaZU7(GGuoLPg?Zk4@!0)x%23TYAUc6#*MaoKsUucbbrofYU_7HJ zMx#=Z$#R{xD6#4JWz@o?cid~tokI?n_3e{PBmL<=@UQ;>sB&uK^Z5K|k&GIL3Q4`L zL9cII^?uy*>374W5m*v!4g0Q5{yC0K@q7As=9)n9vEW-jL0!MseCK*;Lg;~=73E;n zzsW-}wMqDcNu(j7y+k)mqz(_iuh;FCW$1RAWSB3{8U4^cP(GPbzLQFqr9eO+EpP`I zWp0hpNlogP@{(_#@0;O%8Rhn5(6*V($#M_jul2@WQ`>#fCEl3}#1HEd!?HukBbxhU zoTTo>_TLhm9F5Z;v?G!M`;sq@rdhx2pM@8yx8D-yWuF9SPO3Qw z@GKkT0hr@;t1(ED5#=wilVlz-NPg(bigiAeM;KS1uhhcx#SY-WHMk#^N<{j-ctvQS z1iXW29r84W-VK6iSxs<2Amb97r6WC&=1{i$cmasVMi#1wy6HQg>Fa@Y6F`ehoiu_IoM64JS&5Fwacv29OMM2@z2{#ZsVj9Bd+-FP_FYP(k( z2RsZW9IV@i6b5UwqH}ddtJ5taX%eMk09zipi#uu%7xj5ru89^w1M&Q^;PQJim)I4H z5&r-XpXr@4cw?}5jKnKYbv)N`>zTLVsSaJJ#R&kB!1ep!J7}^&=hWttOH>L?ITLUb4dwK)_s1@hU?eQ?HST^5Dgej*dt~nyttU-6Wc{KMr(T8BsQiv*U%v~=Z;vgV zBAjoFaUzH{UxsUC?j+gd5viO8E8wskfH6BSPIXAZUlAR_uDw3Ep<4orRiJyCKWqg| z%LylQvsXdVzMb^%4vF4SUNLgBWJR!oXy_)o|Oa$zY_+S43)&BrE(FUpwA=3xb?Jc{9 zEG&xYou@0kv60#>ESp506SZ@^e53KrR;N#-_->*ZG^&uv9Y^z(9N$uX^N%mcu0XA+ zEYh;tg$vw)*CNJCAB(4W+BMqCZMaYwCra}m)TvUdrz*qugIN5(wrwnXKMO2$z%nTc zXl%1ymwB7zUZC1iw(T8ms{WsbYF04FCy^KBFWhrksm(7Hel;)rHe<)8Zt{%IDPC!n z!DP6BDLl8R^%YqfdKy`E0!56*Ek!X0lkb)@YT+jHTUaRl z;wT(>Fl{0#@^<#)oLdPgYRUoW*MLqy4xGMr4UhssmRb<28IAMF$iY-!Fs943?+JK7$%~EFItg!`Ni}6e?dJPr11xb86pJ;~3|t~l0IasC7#`z-2h+Z17h4?qc{e;|B(4gc z*+bLz#^a&4_-ib;;VPpmARE&DnbvdrbN2lO^{4^zQS`CSFR2!BrI}s$W4Kq!I0HG} zR<|Yu$;q`B*p8VrEY@7OH%BT#RcDEpoqmX|2rb=ntu?Zy;&~k4xwQ%TNo*^o_5=T3SL+P58DAs!n z4%1$TjIyC(ZT1)iDtakAclU1W=_>1D&SLjl-J;`qo)G#J90D&apEFI~8n|uf9ucgp!MTpDHL7`@oAg z@7E^$E+~(3qLF`oxvvRFd%5+-p>m2~!h;Tkbj2Z3%&3FqD&M=w%-hpaIVEM6%NPXn zr>-}%qTS?`j>P?#tFCu{uUwmNh3Xu)R1}Ku+cgrWkz9fr@1Y>%gBM_rgx)Kl z7g>5tO(-P!Q>pon%5x1eNrFZdp)OAVgG2MnsUlk~bcsxQuRQzaej02~;Wp$hEQ>?i zEJ_EEM`v;sJRQTFbcD|X%O3F?ayVf{e=Jz9KGhf(P2??t4c16jezg~){&}Q)=A%QZ zhC}-yA}{Z%f~PyqaPF} zpw%?`VIys6Zmf46p1I4HSEV;oIT{&c18D+-56stmleLc;!2>@r+x0ttk=P{WEF zYjupD0mDxo?-EKZ4`awb-!2`uP^%}JHwiM13I4dLjY<4?omI9>J8rM^GN)p>&Yq>< z-&Nx!+*yUV^0gtdcm(yx(MU*;SZl7GupcI*G20me#eBSswx$f(D6}{ARv(Z#ufso< zIRUv#dbU-n1pEClY|?91ig_a_-hhsuT+fv_D=b^3wFdf|&1c$g(@+p7};Rf*_zPHseBt)(}zybQIrSn5z>@Xl!%XS4_=nFctt<2Lnk`S9el+ z6IlU+WKrCGupQ=eY{f^Q&3R-6RY=)DclF4k4guk-k4`dyC4l0=$Oim|@1BDS4Z%v+ zTJMd-z%gR>0QWVKL%MP0QdD<6@^*9&)tXB(7A@*1Wy?WCktfRt2hej^DWDJyo}B|; zR4zaQ0YCz5P{~vvsT|q#$T6CMBZGn4N$M;xA(-~mKXAAEyaNqO2MZ*8@g zv5~S!r)Xs$@(T1nT+fv%%Je@s&0_B-=}d?gLI71k+}N+N#Abwzx3r^C;P?AvX^9&H zz15qzJqXPq@q`j^)#ymC$0{;UEB6dX0~K6j+LyHY@r*RsOQ~uEf_wJM5}dq_PkuT6 znW)WYilxt)cPTx%VVc>xp9D=5Q!sD>k^D#b<}8-<)ZdUs81CkZlXQAyiUdf5Z3Hhs z53Wpxsf@aE7`%P&H4tW1vP1FQFDDj~Fu3ZX$^7xA4ddMjTHVJ_Ot->(kcQl&ln1R< z-yXkg%SJl{yK)B|1pso|k*hIKR1L$ZEtgCt)nmlSo@y;bg+T8(RMSjF zDJjh@)@pf2g}cCJVC9>jkR7CZbDdQz(zIyI7=$Lt>wj9tCF$vWA5zjh!B25u4hLN4 z>UE1M?RKU(w6eGg+pZ|VHD7P*lZ@JGO}c2~)2U*P>E@%w`}>^NYT(jIsE!!-BG9%V zSh7zZr>D~$XK4DZHtF_B9HYYkDviMIZinfZv$RsJQ?kYyM_LD-6YE`ae5tBedllU# z(_HkxOxnnyW4q=6(5y-UJ|4P>KUma@bHGj952(#1=S^v&hg?--YT6W)JYV+6YLOvO zLns%}0n-w$3@}$w=3;J-Y4aL7QVy$<@a(uv0QL8arxYq+s5wX_sfWAM^yxEC#`h9t_B%hn{g{+*!gm88j>?g z%GN+U(912}yoZ8Cb`^`@kg+O@ z>@sSBq*A1cC!qJnjvCdmO06n0qtOT-_rm}s&>yb)rwbzeB-vF0#no(l^01Sh71yxTqo-3{6L8ywk z2kYA}NY2}LR~=8LO;>GS6s#;x;mD#d`(yNWV=&3n2`Dph1VnTbw}4^OURF`|rd?`B38!;m^3 z>5K_`4x*Ib8@v7UDyB9hZEyhXn~c#juIeFyuEK^&q45sVt3|K4{`oYafHk$9tfcX9Y-$>lYYGOG=%Wbwf1>~d9%k(PtFWTVt~$Q3aQAm6zKg;_6#AJG0- zp>oF}OdG@-RMV&+d4Jb6m*hzxcy&TBOGM^@01^QQueYJhgtH^~ibHg;3F8Wt;j})Q+SB)7*B+rFwd81lni`k_JbV?%8%!cIP?syGYY9(P`u|rt$|Ng@qpH`V4XW zB_>TPN@M+A0KQPA)RRnlk`Gb$&1_j~(fFQmeLuEz)=%ByGxYS^ofCas!dVibr954tTG8 zTp^H=u$}5}n;Bt4ziFi#l%AvcoM_(=9!OzF>v+|`z07LqM{KvYNpl)i181Q0%=H@W z%wrL=iWGSm)5Bs=0DqZ)zn6>yX(;@pA7Q}CW0pl__a37N$t~25qOvJ;cA8bl5oKL> zQ9iekPLoi@KwZiWiy3W9b8ZPhiYLFPOeuw$DoWn{O`ZWg25WJjEmG1gGO6^g!~5gO z;Kh%_k8{_U@Bz!24chI#dZMF_xjsfnR1SpSOsGek8c~r;bzy!=KDUuTEtqqDnE`VH zl_8!s7OY0?zM%KZiJ}S{&l_{~v6DWOU=W}Jqz?CrVt(&bII=2YHY=#R74sXhkUBlvNStqu_#ks${-ZDL4UMBV7?8`zAm!;hJP4#qQ*3*N z@0#g51GkfF0b}#Xu#Kf2_gbFBUPWx9#YzNjt_a{`$Ot5LQmz0#xR>m$GJ!EO0!ISF z3mG@Q&yJcU45UZ2o`hZFevbiJO90`AKe`v2y2ghI;{+^{Ab!_h>+PDAoA@SDWME4zAYPnDKIj?I zB!z^C+X|Hz)87!NX4D8JVc~f6NZi1MAp2lNKBifdVL*iq4Wp08u2d8nX`Yc|V&kAD zw|(*|*U~t3A}8E=rv2Z)wlFd_k{Luwh4|z!s=sX1xRxlADUu%%kg6v(i`&=VHJ3G$ zH!u9e{{Y$ka%lO@M!!`Q4H77L%9BhFJ?j(7*OL#$TUO_Cu&`N=LOq8W+VRAkwEaG} zODwAc>GehWZjFIHmU4S)@5Aa7Mu?>KH^P(8w;9J5USGzvGcJLOqe=q?V#c`j&2gDi zNYKlyNa0TnM0;x3_4Kh`nK@aj+tyf2(z7$h!=Vl>SB|+qLKu=yhie%`Rn6`T%X^c5 zmTPyl$I!QmG$L~lGHtQ5%lEFCn>C*av<7J;l4%w~R8rHaBkDN*cvZ!miu0}cj^IC? z$n+2(Mh6;vHhbC+PD9v6{Upo-!B);1W$= z*E7lxsi#Q2%dSw)F(~}!`VR)tQm*=GH$m%uNl%Rg|9!d2%Vh_X$O%O=#dUVE^ z&A<@MK5nNX;L0P`@C|eXU1dhFtDwJr`9DHb)yw+RL{O2~jzILuwNKr&uaeF6Cnz}! z1t!REbDBhld6ZLqNEwUeVVhFCz?wJfUye}96EQStIrOua%6MraI|ljpz)ML=NZq-* zFImcr<7jVpK(57 z9R6OI#90QNVMQddBoe(z=e}zbO-0)n8_7TQf3M3Z?>n{bW9}-l9Y8Mc5Q?!tn>iuy z)5{adH_v>dNK@2t?|=n)w(077U{3o-PHQt%N_;>=bgKUVUYTG4wGP(hPfiCp11W3e z83!fujY9ffSTF+W(J=|op+2J@fQc1?o!dF=xt(YhyKIi1h`<3kWp4kzE{&&1wN0a9X{;)#I_T zPjZA{sN}E=qoKY*#HwzaORP+5rtS3gX$Gfb97P^W@GqIzCx)R47#MY8Q^>%UQ% z@5+-Tk7c(J+L-xrYU3ehAlSUI1k4XbJooG}RdR;|kgg9R!K{!IxrJ`Xvtw_TzWwu7 z(g-8CQe0>Hp z5h)cmtFe0rY2rbWEPh8{T;hM8iHl4JMPGnQY)#IN` zyA!l>MvWru3|WTa2&x|AF^!)IWQ}$x7DbM~&l8}%d6XiURaI2}(R@Ga{<`MkVW00Y zE|NqNgpdt~%Y2_~e2OI6B1DE(XS%hjQC#LJ84RO;1eNK?$rS0F6|w??XamS^?UtYg zLfaKh*EBi|o7&?|NWO3l{G#ZL293(TW_DHRDuB%*c`8fXr9iGa^*KDL>$PK5Ra5mH zJ@TW8W&{$kj=g&RIPFT4Q{e?=JIHD~EAqslkF7=omE3(KHTier7NU0XH5!I+;uRyP z<%d0oOZwt=cr7Dh+oO_S6L(qeLG~O0lgMLkl)TR--@;f%b#B=67aHd5v zo$DKJa@Ka7sC!I+5az4Xrdu0_w(8W3m>^SLyh2@Pw-9VnXP?I1lXrP1BGpZA~uK=m9 zm>i1gv_4xNhY&I_sq%6!lZd{{T1)l2lmlZ3EKyuk(#C$e9&MvqX0pA$5kywH$ko z&nkhRt$=+y6O&8}jpm-$jHpbFLFh-01?8H$iN_wx}1&QjZwm> z8rAu>g(R8?dHgXdV2-I}x?-(;SYq}#Z&AZ5gZrTIkyt6W2^B?-!1I^(pP~^&X4DgH zRrbl@R02xwLh;{P=PCnegdKnhJxTunRg(0fX5Q+%O&)_L_N|42UeWR%RB>5lN(to_ zYsv>a3&}{`JBZo5NnLsrV^vtkM@YqFv=!0~_^Sm(DG#iJTIy zu7EEbP#v>1Q=|*xD3BH0INQ+RdJyU$c+TfBf%9+ReQP%vx|dO_4f_;NAwFkn1dndD zlHY~}4XI>r>`9{nPrQ|9dzjX3_&1RurQKnA^PKyl< ziWIwm2To{u=brg#SBa;M1m0jF7Qi;Z)!2^tXJSns#G?3&@;c2=A-#lE4{uy@<6$21 zY2$}XBxX{0RX15PCXCvR9Ity3LEV0spJT#}Vtqmw(Tb7)1oyuF-r2gZVf5@6H2^^2 zL80}m<`@E&^Sk|*ka9q79b77T*xx89kM-@A^o6R_fHm$W&GjQBifpp7y2gq_o_8?^ zZ`&#g=23ntSmMa?{uz4%yLlkmp1pjh10_}gn~=w#9e)f`6)OO?KpgkrW@?toWEC5f z2cQ5^`eVo^@c{_l4~C}50{;Lr{W6UW7<3^*0bmX+<&`L%6z)j|;bZo7*X@tMn^Ucl z211b++-Rjy1JrvAo2n&tXxx)*_jS(E^vFETSeZ5I@ZCBB7&e^~o_NfP4*3?0 zgaOnJr#0P1D-c2GJ6Oc3Mx$^X9F&11Fa=wXIiuSk(5>^>emeKS;QMz~Sq85Gis3*2 z^LBW;%iu7unfd+RMPc8s5O)VD*piU5sg;{J3;GxeR2m5Xq7fc8Kh|> zbTkGHD61(gWS?G{F-m7By}f;Mc#6qG5#{vj>6H>l)IzClwrh;dQ6Y7$+i3K@KMbLs zVri5BI&*+%<9!-8*y1BeFm44uXVq99N3j`k8W~FPXq?MIETG+j2c`mDjE+jE1Asv1 z6f&4a)v zx3+2^kCgMdi8r(w1M7+y47+c{ZQt~O0Q+SMNnB0g$Tu^5uA~BevpettRURP#8$5t& z@>sI9R!!kpki=f;IsX7S?5tp${EpYqoxjTz0D<0J$FE8!=KEkY0EKrU71Sx>zouyi zDyN1eRxE>{?me-7;Tj;0Xql9N>DQYziP_=g>OqFKOGOAGy>cnKbL>fT}lF;nOD# zTAd(eS-yR&kF5Q?cJa6|**u;`aPBFPIq*X`HSe$P``%!IW(#`3mWjMx6U_vMeM;4gj|gkJwQj8;!sN*CpwpjmFE48?hEJgIEat(s=HFrfU;PaL>51bOg}J+L#R>Rq~tT z+wsbQCir*b+l-0<+3%VT@vDM2Q0>lLOl)U&BvCxk;{n9&+5y^n`tgCjA#RC& zzHXVVKrm9&cAM>d=4ydimdR2q{JxnK23Z|;2B3QMCmX#0d3LWBJx*GMrF_aMy<5IT zXbedVf~)bsVv?tAa6syC3aN^L$m%eLhu)aJT+f9CT97NH41kih zkjL*?Mu5C-9Cp6=0LrZV0>pR922?vb-@W$62z7m_)4 zyk&e+g%klB8+TNFG4FHn6(-=2YP9;yDOg9oN1AE8CJ5>!D$qfTh$bp|kyzv``{z!qCcW*xAv=@;pbw$WRiz?WVI{R7#(F7c z8%{Iuk1!oC#AeritmtK4p-__FKzfclX0zn9KT8&CXVEi%Xo^lK&C|un2 z;A9wH7(j3>oA-df=fKT$Ufd#S8RpcYsb4Hhy7rFjeg2to61gp5Y$-e_{&|L+BbJMT zixQ4a^!w!=bn@yvLA}Ev6ctAwj!hiPB*S{{S1VkOg8LjQjWVv<19?-l^T_tXER7@T z%~#P6^vi;+%ESQG$Ck%W>6cR+h*PH~`S;`3GO3k}EZgRNj@GDqWwbPs7bS%Oxa>1EN@hj_a}~av(ZJFf2qIHUTm|ctDV+H9 z>*j7Kj%;*4h6A^IYndfU-*6w-^|au_^(edmIMAPJEj-C4zT# zIiyh=+mNJiI@e6F5wbaJC)*$vEz-)5Z%mXWU4fz~bUTM!iZ%h1?Xg@}VUN&Qr5;`v zz4!WNyamg9Y*7d8c_>URdxM)ib?cBcMo1_LP*P3=q#SA1w=C8!~| z^chgC!AKX+(+ZwMM!I4Tpzo66CY1vNNwGa5`(kUYInY;Lm;fgLZte1L#R{HjRs#s@9CSLY|(Fz zP)f+8I{MY$)Npa+j8dGDH(ycHGmQ$>>7#u=i2)#kOd5f2dl_t>2#IBo`8Onq`?UUL{Ci|pOB<^f+!{9Ogq|@% zoW;9uoeg@}$3XT+{{TGy0PZ-*nw||7p(O@g#1YEzb?xn%9q}y~@RDan2#st2vPb%? zyn0uZ{{X5yrKVHtM@;G2Uao-`PoRjaf(a&&^Vf>}bC)k92)1H{Rw()AL45k=VP0md zPw>q)tW1-{vdUEMbt*-1!uRI0w7jgwW=pT9ibj+YV|y(|_#a+#i)8#qOB+EN>KZM? zlD;Pd@!!5)I*$%$A%+vNcfC?POh_KIf1Yn?nnO=45+rh~lB380C-3c-HFflQeNogv z8h~TL_RbfotK*4h+62Wx@{|CQ0n0lCWm$Di98Llt03&r!J+Zr4!7yi%z~Fa14iw)I zDf1Iv-SIr2X=ImsdeBmD^2g4orY!vcJCAhcUbVMaj~-&PrPZjwI&HI6&uoyQI=8S$_GK;C~lni zfh61JtD<^fQ_2f-XQ&4VfV;HBIJUm0qU2Ptd`dGpN8XEct#%LNn$DLVq-?chsMz;R?e0*KCT~H|6|B0?Lio zYDnwmz{ZV^?f@MKI1-h3wIN+voK=oF#$Y7?$Ury01>)Qli5)>UKgI#Z?L-K`p?sW* z<_uht0IQ>Qgc_DWEO2{aP4QR_n?N4iRuQTc0NYJ=R`2hcg9tm6O4NGN@qva*W48S- zAY$(yD*$qUac0A2)e4^cJ9D^pbt zP3B^Q$8R6Qi5xlNx&l7Apm1r>hPdiLd3GcU`ub&`l&b##SByiqPSBRG-RAP9r;(Z{ z$SEUH9S>4+DhdAp-P+PyRV-#@YZM7}J;e;OQj&jWphdE1$mA;RHT3qyBE&_RN)xhx z6z7~moEJ=`N)I@$dJMfMVv-RlVv0()Bv5~F~RM!6h%WuOO zLL%2l36<0W=F|gM^z1MxI-#hFM3#b)L|;DGm2vXZY9bng9`!G~t^Ocqc^S5NeHX%f zKMDreyCX((x4G@kapjuV!OK3;2z`;pVlGMP$@R$~4QJ}Q)(;&r!^v_7C*L>RL%&`y zff__v-=8yGeX|(Q9PbPoP|`7`bI#G|GWbs@4~8AQK09tj0YLT{TEaC78glo12Kl%h zfXh4!eh}1sL`@D%9S9^uU<>J{4mtD{n2h0(`lx z$SdD$S%Eo#N#ZuqMA@Qmft6K6#KO}ONPAWFuk)JTnZ~K`m&_=U+b4x(D=jdP{#eL? zc?2n9G8?~RUtD-RvN+p$nrA~vQK%ds?tMwk38eE9Yk|`-R6Y>}Za{z!l<|2)vZRs7 z3YTNk(udOnmgZVNH4t{3fa8T#XaRnh4-uu=2Y0qmd$y1b;2Nj{tqUFUU>T$;L68&J z0pBRl#jCJAtQ;WBh`T^t$J7hLxsLh)2yW)M{P2t%SYJ0h@mW7gDK|RoOC*b-!5Kn@ zDCJ6##f*SL34T^Ar>I_j^?(wzo(|UB$O#3RXam$9a*alA84zq?--GyLz%*c1i9W!K z$PS}r*!7NKy6l?fBqKZDdkdZSO~nfyEV%iRK-* z3Q#{^IiZfn^l4lb~hUa_{bWrX?B(tI6bkr8c&V2WGQE@9B%m}#uf8z zyRLyhz5_!mM#w>19PR6x*n~U*6+-WE)NU3=X82jzZKq;GmuEcQ6ua% z-N#kq@y$wyMWvhJq)Ztei192M0QIAjccaVPhDD&nt)7H-&Tui0i0%&HmCbXzHNBu+ z9S|~+;e)g*bqCV%pCQpeB|_@QaQ)w0W}3pmo|rIE(D%FvCklBIaoBemC=~J~p$sdx z0CR!m>V7EiC+sxghd|ENnw);rx#iT(rBhDgFbgrdykwoC4K9;YDcoUXw&QY<-;CcZ zSzlHnC<>o55y|PCk;tGDs>^rC1e5f@WM8v3{9m>M8d89=qcI%PjJg1b-lPDlHz0q1 zY<1;45iafrm8-8cnXN&vr5&tRDh&i~Rb<>6=urS1MK(uP)ri1o)fZ@?Vu$22R`!@C zQy~luD*o}n-SkIs{PGM8lF7KJ+$yMa`sTdU@HuxI1dvGspT{jooC*Y=lyzgxoXbTq z<(qQf02T-E$Pmg*meTD6*yp}QaV;3yv{%2bR0@-PkT0)1;4p1dLeGDuP-{Wg&4I>1 zmUjY2IRdw{%1EM5KTLd$3IiS7{zn1PzTyS7d*uRHmY}V)pP7$bnx@AaGXhEf0Hj|` zVhrpJOUSF_W&H%pZSqz7WC>_vX52>N2t06p#{ils;GC6d3~lIcumo?3hVnfMuNVGt z0Ppj0(4GnFlsHS}t=4)Fc*rrfEl5Bmj{^Dn;0nqZ5<2~Eu&v;&9>4W>!W@Q$(F3In zp@Ei-3nSMEAXPXl2OSPj60ndBv`F^MsV<-`GXc|rNURRPa@chc}Xm%QVUnw$<^sx4Ahy zuYn+lZ45cEN%c9dk&^gnDQdXL>AR3}c&h~*k#t`$?t9`?qmraXRXwZ~Jl<$7Ic4zf zYBWf)Jr8`kfef#xLI|;bUBiHXueMF>Nm10%vJk4l&<@_X5;5H(5wsSu=0HjQ*#o6i zMO9UeSp2ug*A-JVU#v;Cl}J1uaR&bYx#9l+m-&p>Xq!{7ia72-&RA|m0+@TBOtX#T zJoeMRq1IhNF7-Xbg^9#alK=Rr0sn7sxGqW%j+6@^J1FYEsRe9%2KQo}2WC-I|Y zuaVtsF zZ#EBHNoDO}9}Ut-K=I)UtMan~Y<3*~06f*HUW|)rPNZ(DJ9>{#Y{%?BW643wn!hLj z->1_q0W6U=(;+R;g*JYf07%KX6vgCY&p*!su+i=LN-5*kvh;%#gL1K8dJg{pT)q^d zS*#zJ518ggFh*JnWO7Lu8i-hq=CCwr)bPX+N9u8gn2_z^g(tb_F#`~!asI_ZCH6Oe zeAa+9y66H=RLqTPjD{8o@3!*zx_KzIkR0wki*b|ocqqw1!r9|#1DtpRYqWyGJLzj# zAYRz))f)Zcc{oy}VDb)XtF8kS0xIwF%7ZIss6Rv3C@tYZRWy6oTq1d#B#Ok{sRoaH ziULOe0CGF_$frcx$6LNHEJ`BucA}cDOMdnS2C-H_C!=wZO-U460xsxr`Q=9VyH?5E zPi&wXKu4$Fk&t7`Y;F;@?mlB@0fKZitcTcFPp3Eultj!)L-inFFJwUV1RldKjC2Uw z!D>ARulB$txmbb;H}uFDkt(e%gMBXns=$vjh9f94-KlHe2=^X>`p^q>`LZvA?D;-n@(&i??qz;bJ?eX}>U zoeg18SW1EIdO4nJyaY^dec zTJNbmoU;6*lz5^_^8)Qfh4d$npv@vvr|xAP{G@U9BPI+oLK{d~iK)1d zjvc+Z;0)<+SsCx;S<|+oPInL54#09oV-@0Sp>_C{pLpwCdJi|Ib>aTCn>%`1$+Zcq zg<=d)R{&Wj`3%PyENdRnciIv5`y1(*(+$;+)^ul2;!u{8p7+P{%czZAnIZ@*15|yu z%yRP5?K?8Lc2j)?j()iyb2ia@mLjP2Y|;{CbHdOI)Dd-)Mu{d;rZH}K3DVE6u*~+- zJyd$=%F2>Q75Q0!J5f&tyOIw#z|G7`R*&Id5!345$JK9H6b6}QWMf?@3mLm-#AWZ9 zr-ew>D3t|Us_kGq5-XpsOTQ$~f|ib~v_MI-)5?9p_3fPZ`*hf3krE$~&|cDgKKXtT z8)@T}SHwXevO#6DUWX>)i%q3XG<$UFB3dDpMFakFTWDco6W!kLaif#SX=NL6!07B|qBa!7K<&scLSTGwwUt`w+69l3H zussc8g$gS`m1-as$P)e|@(QTz2Q`ubVYSsoan$v?z{G*sOpZc>$iCw)27pj;$;vZ& z^G3T9ks40u>_3~+zAD099f2WFz4Sa{DpoSa^iVK9pU)x~k~t)x71qJ)^#>@R6m{Gc zgL)n@nh97a9w1uxJq94zm^*nJ$_Es0D3!GV2n^iaY`QrV!yqw&p!<5>13W-TyDB|z z2*+pv^6j(ec|V3wuiD7et7ER#G=Bk%1{1FEs#mD6asee7tjgzi?)v^C8W>9=@nt=0 z{d1D3v9Y1%yULF0+;sN9-OM=rFb8qn%K`Pk7jUc_cbfU;i62agp%EF?+B3N zkx2)O9rEwe49ViKNh4CGyxsA;&$)fRf$!cY8bZzgPBztf7vw19PQp%FR|zPoarki zGqM)&w%PCNi$sh-kiF47Q8}Gd?+ZJfqlFeo{zPClI9?b_&mL=Owqcuz&c37lVk#VWwY%4D0$ff6yyU! zjec309TbZ5Qn)01%U54qPa&sS8*`_P<~PQ{#rl)bWvFCZoEHQc8;1jd^cRUV(MhLc zrFE5+ffPq!?UKtDUdqwR+IooWEfai~e0Kb^a#`A2D&Hv^mB=7fRdMfqa@#91Vsjx$ z5tI%|>Fe*DwX)2Ci3N6p)B7Bnscl>Y68L0Mx8!63W`-syF?B6ta_%ZP?nfVEmP1X_ zw)qTWW22y80pj`OAGS$81+k(c?ID-TT=dOJo>G@5&AR#bJRDj;h~s757tDIrOrHUf zCe=PDJvhA7>&jB~U$T%}Z5Pe-HFW(xN)6h3g z)p!gtL`sLf-8ke7yFN^%J?=X=1M|$Nq0}JMZFV-x@*n4xUcdU$t@CqLkIFE{7Ru41&RjK=87u{(!Q&xnc89|)QUTmv zOBPVyh}%K)o>1OS)|Ds-Dmw}}UIjob_a@RmX4Z!qXbOuj*^F_s=O zz17zJpr2gVNq6C`;le=LR4B4Kiaz5ZESeU}4$MGPu_dRiQ;P2%ua+!9R>NPzB zj(s|0y)(#K0*raQ}Ppv*pWgpL`25eoRpxAG*>-54M`p5{PNefx7df`t`2G@5TX!SVAZ4(WI zZ2*Eh9A+Bt3U+@iVMSPG;eNJqWwmsv7El0b5CQXTka9lRZlTc2wF+Eizn&pRU6%Yr z72Mf3@0AhD`n-jb&t7eL$A@$F>EA4=NgBzd+bYJX%@iYx%c5p!2r`W^3)6D97xXy-zuu_mVlcY8 ziwk^Z#L;+$YhplhFU#AD`(*%ibGjnK6+c5OF#wP2_c;;7#%qU`Z-`F4**Bap81!0Iy?Gf|@74>pBL18_RB`2%p!vg`MJ%LwTb}h_h337rHZbTUM!ma&gYy8yjC(9S(V|9*)m)Wd z-EZZSxTMRhL=MqYIskS*Bk{@d15NP*sg3uo?UTMRH((iCk3-a)}ZZ?$1O`T?1Fx=fva6ySyoX^oVM|}v zGd`7I7QKl)an5a&lSVk&h~Zk8F*h0PN89qu*0kp`7L3HolCKm;mBH=xR1uezD!*M#)dKp zJI6;IjzC&%LkOW~pgf9eLuV|kri1TrGKC|9c-UC<-8G{H#@ zoyO@SFIQxa0m_7t0dLs4D=n4^Z2lO*Jc_O=_JRdqWO7IchSD1Za1U>`1rh0`0m`id zM((-IdpR@ihD;?`x0R+J!a*Y?<6_QHFw{=#Xh1zk2c~6DjL2iRx8{j9a1|^Y939L< ze5JiT4P~I9LW#WZp|r7H?@C#y!>;^t5^{iMq^;dht{}hFlHs zB&%QDG<~vV6Sk>Qm=aA62nUR^mORZ~rZ*%NQV1i;JLN*#!ttZtc&Z@v`rt2eA1Ne( z$T!q~d?>f4{IUN4wB!izzi4dO9#DW#8Kw>himtQ=h(IhTantSwO=})*o8So2DUIat zovd1$BkP@St8tmeJ?N8TFM}(UP(T}b8OO_J8TQd|NFDgI{jeN$BWWIR&FX9IlGS-S zjcRHBHl_CRpgnqjOx&Brb?r&1h%V9)S*736kG5ffs+kzb3!31b0K6-jKL}ke{={;B z&OvMn#FZv7s9x94;p>}|`gtY1~;{+oR> zsMMh>W3WeBuj`ZD%6v7Dei_zAe8YI}-{^B$IYi%WNOaptB;R7BemTqAjp!rON2b3C zHiOB(<9y%DIg&^0O)C_{xHH;?xmmr(4DR5f+m|v1(nBh*CK~I0x71mvwbw z%CSgQ!?6DV%Zb;N@+D?!+dz)bcY!>zsbjW4SQ@fu3|g)rx&YCv`;Ce>X8>S{)V}>g zxE&Qn)g1a^1o7Vtz=Cd%^vOs8r$ny_iZger$&06|xV0f1*JIRW#L)#08Ee}jnl=7< z<@h%Xc$k2A9NliK`(&_meTPIR^%H&BnuqYVWAeSra}>V z9{2Xjg%XVWqE=U43ZDMwBB}+DZUJ`>;Om+~&Zcr|SP^1wgqtA$08F>S8%w)x?cc-H zR!mV4&1z{Mp;69ME|mc?Eqjiih65fke7cfFt1og?uI>t^l*6x8aV0NQMG)` zPZjIm9o~-}t!QJ?Cy92|$sJC1>x^^nl})LeQY0oQi9^?mIVU@OMZ9E7`u3_P9zK|b zC+1#1EWYbJvzy@XBAG<`a2bzqdisy9EZMPT$3V!@Qp@47YT)M=KrmH5Gxa5j;?4D} z21TZhZ95rCY(s6wC*Q6>__aaX!HsSq&n!jd-+-eKd6=UW9X8zx{{UU^IKm?HoxlUh z1RB5<)TZWIQy@I5b^4sBRFlRg3Zx%P{{UR(YjA5n1z5F%cD=sYWlQ9y)o*_y_wW4g zC{(scFDt6;qvgBwtX_oLtuSO|B1Z&RG;i0g5|VbbKq1}%3>fvVP!BmkGAUrlcG2Wl z1bs5Zrhcmb0Kp&Oj+0B$OAhCXGaJgEJ9QC`{{T~(_(vH7Jf0;1`~#@=%wthz_3->8 zl^1IAstDWlKEBy#LP+GQi4>^2{hr<4*Xfg`Gs6J`I3$uihGZ3N1)YO)d#|Cwye)Kv z{vuu@zW7!P+P$;U#%C6OUs0pf81!%jA)+yYp^c|bduI<7RRxQ1RT~(KwQdjN$oz0A zI)4a)8ps#2x%%d>98J*5(Y&bp7sX-b1$%n?W_ex9@=u^ks}Z$Q@y89g{kXiExCm$7 zDYvZ-4gPr36g;7ocCv{9y{*ONsQ|NhVx3f~u>g+4tz?yKbcnKimB&C$gZImcsQ}vS ztT!`$??Q4ZGRk!E@`sM?X7D*CU1yR_tagS6s66z*rWZ$38_7q40vaS&LxG|ujoO@* z?|iWy_zY66s3@~>W1fE=xdTF(9it(mDmR{fW%a*Ix%6vWda$rcpWahr{N>sL>~7tC ztoO|5Y(-OvpK9I9~A=IbuM!>Q?Yif0Sjpv{M@X5>HS2bH z&2zT@09{TwCb~eHIJ`96?s^hWUsH>mCM=hg*F<-J#9AE<9x_YzS@hEy!y>d`>_5xX zE@kOAW;0fxHIU-@svP5-UMb6pJW#si)^padw=1~vF6*aEm0>!UREDNGUyRS za&NX&DMsVBarW(zTC&JIq>ef_Tg=N>A*-rg&YOy{>shH&1bo%wDwqAzPbcY?{!%$+ z-8=DU4=zI3wA;}Xl!8i@yqK>)A`1CR;p&Su=JJS0fs zCAR=Q`er=&X-ar;AzNBKELjH~L$FvOoqGL@j&tH|{ZktcOwwWJva&zK1WAG!{TSbrPuKdi=xf-vP+B2E~vD;4$ES8E_&= znj~gMa)ffEU*nQrqYDy9_TMQW`4gN2(E!DzC!+I9(>Lj}&bLs;U07KoQy4Pk_^-X>pVyWbxutk=N2w^t5rbPfi`;8L7*{(s#6!J)fjqA5>K_2Qp zzvBpea;iqE^QAWfa-FB!+cgAk!ZA^hq%~7y4Ahln^G2#q%H2D1r@f5V!Xnte^9TO? zfDE&-A|*&;A25gmxQ~AMtxRy#EOELu@^=~*Ny3(rNUZD>AN<3iJWfi4Y!N)Wx)26lS8^nSp1_P7Cg^s}a`2o%s+CNDZlVQs@0sU&UNPs1mKn+xviyNu zUwq}b>1MIh#ik=+zCb-jOx5rzjxfeX+&#LCz7w}Xu_$nXiu&F2h*YRh%v2DB@*8Ns zreUWxo)@nWvA#%S$JZ`I+Gs`7t1g{@UiaS~JRW?JEWoOSqSa%)WVfcI!bz4Lv)ghx zLFtn-vvg?Sn@0>8OJDTON|p*YU9`9V08l+fT}%XwNmfQY9^$h;RH*eqT9B~cs_3jIg6Z}O5j#o`((y`1R8_uxcck zS$C4oz^kz0kJG+RR>k8WUKtMn_8wnT>N7Z{Gy!SkD}6r4*D|H}U$r7lq^~iXzpgP( zXc?C507Vge5tSON8j<1xeH@;?z+*8T67O&~G(ZXhz(0pmjO}-$jA2b~GM?Aeei>>L zE$`Y`ZX8mMM<0evSQgrLnBr*~=!yfMe@vc58fJybhDhUrP%Q&7JAwD_nu$(2LI?tg zBJXu%#n+;=ili#CRd70Hydie*p)rI6b5)Mw7eB;e@QTR{h|GHJHF<9>=**~@? z8jsy!WxeyCmYSua+*g|I{Qm$f)I}O*1=(3jk}NnKPxsC6tn!Ru99n?Rpl+tUy?CSd z#kt6x@y1K=^p{cMBNq-qAUOl@&0afonQ~y-Fm;MhiU*$f>he3z%%4xcSqSc;^Hy&t zPZcbP%c_x;7J=$pliQ5t%l(_<;67kO5wzc0yUh4dEMe)Q0ps9~Kqzd`=k7k(40V%& zQ<>0o0MLnf*tCxY_EC8`QdZ}z`jWi<@1 zBP|d(G)njM`{j@y>nkKiGj`{l!iXcDxpM}tqg4^yPl*xgvJAS7{{a3yFaH3nFoc@~ zK^ZaxQNQbzOK@U$Br=gg`t$9LK&e>=hDo8z7Cmv`Q>Jx@Y=osCwhDu8PG-YF81kMsAmecr(;#Tmk{N}8 z)`{Ztc$x^K@gyL*W*tXi#${RH#AF9+C0G~J>~blE09Ep}gZx*Q5W)dPayHnap12N$ zQucxeJYT+QGeI`wlnUnhjF+muN|Cm=o05NrzDrgDNW@4bBP#qz!d2sH z8+P8t&XbPKBIq?|SEf@WRCxq+{{TZd^6KG&^O!iakgtBSs-o_W7- z&m|Kxm6vLvAkhT!GGkhL=^`>Q@WGLY;#scNSL@h@}N;3p7|}#qR#w`m)W*i0bUNqUVj|U+{(Dg0~G>4De9-D6*ubMD7IG& zr;)hx^vRlT9APCvWv+jFoVaOg9_zFMyAfdhIpZLs!wt(>AH&x*pDgQ;MMQXf`|*F@ z@0TI8W;6nrS?je8AE~UliL7K;$YO<0Yi;M-{dUQESRIIx5amFVuc-QFaz!)2P&$Quhs0g}+AlM-Mr?=BP$vH

x@qM1!dUI%mI~!4tN=f%gy;;YF7-# z*1@i-IUj82<*-z~9^pEXcjguk;ej-e$hWA8mNIBKFKE}_)E{45e0CWe(jaAhyF1Y) zkEk`%>ymvAj#OD0CXiM2Cib86lr+T72#MN72Kgka{&`0>k=#%~1#!qf%cd|&o01_D z5L8(D`-~4cqp4L(ouc|s;_@k^g;Ze45G}N;HqVrbIfRw9f<1a9pkbw@i#KAA2nQUzuW zI)HD>6@UjFa$2y|3ey#T*{Kvr7encicjT)fhivjIfYOz?t-fzk57Rd|{4;qJejx&C zWM9?9lPz+@jzHs%=ifEvc4Bk!IU+8t8D@7Tx_0Cq*`8c&?^=&V8Wc#`V2{Kx-sK*( z-?taQ&SO?bF!<8|v9a42uA};5hxll*C~yfpnl)GiunB2iI*fKFgYEB@cAgbo?sBC- zpce3^%mc>;`%R?eRv#uURf=PxaPC_FxJF#QIW^= z83D!wUTVJFp4e825nGnM+-(4x$OZNQ1ZlVL*YL;a0SpjW1de$3z+$+5hmJmB{V*v+ zu+6n-4#ee%khqoEZoQX}$1}RufwZ0oJkwvwIVbI!+)N?%&epA6=!>k)?PpIXS@80c z`1)j`cp!0pyk@2Ns;CJ{0}O>tQBuTXYawks$^yA~!2`_P{v`Iv-^r>ppn_5S{8u?) zM39)HC11)(G{dGo4K_8Am<1m&t0I8QHnY)imswmg9=lD^+x5ocsoGXBTXCxgj(X)l zFqP?1ccB~*D<#vUx{W*&ij@`U(b?v2?U~$cuhoPgA`=<|#_|P^wr2NM48|CMk+Y7W zowkp|u3Y>khEEz;%GitpMOQC%IxQNl9qfV6Kied#$)np(z;Jmh+nqCgiy&tZSpH72ueA0Cz@29cIjZh5i>Z$3U# zPTYJp*%%UcYa|Qw825c978vXR@ZFg7%rwZ!Qe15+4Os-Awr6ptGb0-y(e6p-FG<;= zO{!Tol|8{9&oqt`0<2cO!Ty-vqYLrZeRZ_ojqBNW6!K_ntyP2Er5 zwpkgprcVTJ^Cu^z=5rb$yf-%zl3TeKUu?%K#x*zPGwULUgV&l{9M>nlVse+mSxA4< zog{lek5D+fO{T}=oo8j?$!3G}m*F~w5yh?%&0H+QWuH!XIjO?V*uR&jB(kt29aMD+ zRN4FvbE+Ao3KX&48;Yu1^f;>q05R`T#nA_*GowHWByIBEL8oIHXFG?ji}%Sx3kE{8 z7%xjXLeAjZSsK_IZDSSfqpc`i5z41DwR|tkUQDu>Qt!hEA zym$1xx2feKFN|ncRUn>OIbrjwn?G^>M6san#x7_oLiUSL=D;k2{x6>G!-IAvVV^N?tag3(1?Yz6ueHYgX zY#M#2#Me9kdSsHNtSPcOGFZN!_Q{=jYgnMF@Bk-)w06rs2oo4Cy_j`j*A^O|P+2A1 zIr8(*8Jp!{3R#-_bjYU1q*B16xMe%Mu0@>OWE06Lka)*vyC&~&#qvg!2BlFze5-YM z{GWr;RS^r}ujQ<=rHr0;5e5z6Qz$IH{Vevyw2_~zL#UW0st*QNN(Gc10&zR)C78aU`S$1i~`>-5hUS1(&^HAz^?y~r; zBRhlA=x07s?zb$=KTjlVgt6S*eY2+<809D=V2sScmj2@l_g#>rax0v7RHGPQGavzeYik*m3~G$DgkNAetjvfiU8n~naj%L zKTnU<{*ZiA<8w3`1d=ER{{Th~Hjh_)>pd>6Rrd_TCFi*)8}94a!!1FRQF#fHGiXj8PX#ew4baX>)|kxz3Z>#o0o<0 zaXt6{08}&JzodHKgW9V}HjPb510GY|Z=v?g^W!;ndaY;A9}m)Wlj;5`@aVNVNd&Ps zaruHfA8hm97IjVeHC3Yu-$c?r|Uc3-^BPL;^D4{&T znz`e)F+k5ZhD1@xv~xp^!@nmlXk;=;f3M-xyCt+2NY$GAAolrpO&GJ(jt z=yFvk_>79=6(o6wwlkwxPy>4{yRtUiAyY-P0-$a^4(-H$OwH+Bfx_D|+VXhmh^{gR zgoR60Zb38;ArbVPk7sQF|_AKO)^u7jZ6Y5NE<&=kS-YP|3 z*Vi*@qg^_<4RpTT^ZoEB8g?jlzTwn{QD1*duts8?m7XRAM=GO|J?|_)_~nkr2X~?V zSwyD6DQswQxb?&i(M=n!oB_T(5NbP<|ZeOJs&VlW-v*U5Lm5Aq^4fewn~Iwg%zZ zh#f}@f6B3gqlvs`-b*VH`!X+Y{qp`5Ol6=9&9n}*50L&jV>IYxkSj3>>`Q#vc84Tp zQQ}YyRH{g$@9UOL?L2hp5DH2~P&~%^;CbgxWs`gF+7FdMG%GTzAc@ct`iXb+^FIUn z<%KZ5(m@@$YQ~O73TTc`Gzas_7!X*n0ru^e6I-=Z`Po1m@!K*LBeaeYBig5(%)GbT zGkdt#haI47MG4ya-cTF-A!Bj%KAATUDYaU<+L4YAUsICu`Xo&xjL1rj#PrElHVGII zS|Wjc2lvSq)}4Gv%ql}evejir36fR>kjvJOQ3LPKqt$ ztx;j>c&xrz!fv^xvFI#}D;1i%wQ*x1PmPHOaA97Y=9w{kHeJj~BcLGv04z-Mci_-~ zi*R>+dgiC(a7A7LC_5VC2VjsJ^B=kBa#esKiZB(@hTfSd5f0Vc*N&$W7K%12bO8gf zIbu@*x}ig_T+#)$5z~xxouSmm(MTnSssaH9zL)pQ;;+J0)a|&Xi)5WlMXU?%J%6S# z9P@>J!j|wpYxJvMCZcT?hBmsU_TI*UKS7%R02*w(t9}lbPL8M4Dv66^6vGX3} z`{d_uE47Ky(MrH_yK6IxYOOZ6_M2F4Q|px~!9MPrsB|MG?2k9%{{W-#{7Fpuaw69b zM3uw)KlkgK*Cv3O z8PknSfx+ObQ2g|R&zd0=~8D@z{mI)-hlN7vUF3Rr}(`6G_M zbwHu`W%4Ef(-Z^OkL{2OtdbCed#`#I`DF^9O6m-Xgb+bCdB!G{tSuszU7(60j|62< z>EVr-c$TwSqJNpoF)8stOwO+zwEzh}pXHYj@6@LM0PG|G0QE6}u&YfZZ?|l03wjg9 z52t*-Y70_KQJNn);YsV6<b3 zm-ekn7ij&%&P{1%mDVIDpU6z@vDq76$|1wn2soaI>}Ur)CnZm81Cp6 z`D66!lgciI$|@uF9Qs~s@Qf&=?p~+wd5mjJAwt@MTi6!OAmN5b7Ss~=Rpz9rXxh~5 zLC{&Tz{lbtWs`RVG4?r?12mWW!_XDTtY%eK77O=b&OR_s3n-}7i9azT^327lrHrcv zRbzZ@J+fK!ur5yUtPKHlI+2YMKB-5Q097W1cfjS4A`1*}fKR7$^vDQlbj6E25jO7Z zyqvHzPYfta#R!ZOR;oDsI_1<>gtCPtnBC>KWJ-u)=gd{xAZp`z znh4k#LF5jDE@xvTj#*!9HDL1BRgg9qWGQ?p2c9fqN@|8sn`9+L@Nd3qvH;$HPu4ovSrrA7!pIbulnnnjJ)ka zqxqy=`*|!!IYjcorerRVL>WOO1^mV@h2!P&`pG;`(x|u5sT2*Pjs|t~rg~i-t^Ut_ zbwPL}5Iu9AGNw5wuE0Pefp`sD-{u4b^vQbeto$P%rGF1iN9yx5s<&Ip@W0lxbJOK! zm-^g&91|l%roj!!Z}XVWhmZPG29r~#@#LN*)aga=MY0~MN2l_v-w$_!S;p$0&}rBI z0EZ)1dr>QeC)1D0$;;}@|?LRNJX5zvfHI;T<83SHqO8k=*T4ewZAs$%Tf+b+8X2#sb&H)3=p{ ze+bFpVY9l;4TJ%~`EIjYrX>v9cDro{o(aM_RtSMa(y<2iJKg;1 z_aRy!-2->`^~V~OY_TzrZBjFia`X5 zvPg{?2j)^iKGl+{n4A?hBt))_-`r(Dx=kqH21Dw2KZXV*N#|&Sg;oHB=lvWY(xVFX zcgZ#Kj@SaK@;f8FCEs2$Ktomfs}zj}!_?LN^2>%CU=#k@wz(cwQ?&m8+v}QS0y$Uz z0I4IfKmA4=egd*piU%#8Iovw^ z@oh3V5Q|C)koOrC$nO|!t#A9rvEV87hi@cw>DwA&DW+GtWhI3Gyp#9Ls#h|FGDGtK z1)p2W7E@5DSn8x?ZU|%F>*Pw#9k5tSQ?;JO%&?9lsoch}~n1o#ktiNX%#Aoa%V#Kdx15U!=I zfwDSQOj6O4#cj5>e*XY$ctP%NLGy~}Pb27iWze$FxKxx8WEC!W{J9xm(W%q37{uYI z*)`J$6ShIQ5Heko4;dAUqm0Spsvi*W2+AIeY$SV#9eBiuVkBWL#e>te{cAPS4`%WJ zN*zh6ydz9QpCC|AT$U`O2sZWrcfP+|VXd`g+g`xs^9(2{0CBRpG%V&-k|^uq4t>9_ zDyQTDx66I+l0LZtrYpc}KHc$02DV^|K{R&^q4B?fn_aEXAQRK=nwJ@~Qp+H8Hst-X z`9uyV_aJsS5$bG4^xrCy4@1+T%DjBX%CS%W0PjE$zaWB0O2*YxC__l$8WC_bbqSKi3)V<34^IeM=`% z_g@SBAXohvX<<^bK_7xtfClQ|kLT^4etazDpKHSGd{pjSunlFtXYSwQJrg4~YxLjI zw}gI==;KIQ5EFpMslHFW_0J!v-z%;0>OE-nvq$AqVDV?RVsD0oej(wCk%{#Ksmo{& z*SZnqLt~JCwmS~-1d-SsJB}=7vsu!~5hIhohw0-`b`2vrK&)=Mf^@Q#Jibfuv8^*RMiut?Tim3TKPhb zff!w2F=E^Ts1!dOo0y>R>4HGCN?;cw|`2%KtEVu-K1#`|Q$pX=}+zoP10~82TUSVtdwSUVHQYC#l zgEyErL+OTpzwo`&yUg zr3mEq%c1eO-%dd3z{@%dpHjPatY9x*N6d0ssoepJ$W7Hj2NjTXdKlHY9Qz9G`CuIW zbqE6OkD%-^+Tv2tw4b$%v}m=*e`?7pI!F=1v;=Z5n>%v;MK)Q^;V|Jg_sMK)M9t;4 z2fY*Tnq(t;$mPi0XKx*{Un+ED_&|~OyURQ# zc6QYf*=@j%xvsG^5(vVBz!k;hxU*Oac5z?yo5-vMD{CGHL+Or=+b-R#0W>{9!a@u| zJjan;I#x_wNhzr)Et)+408EMyLMbA{bR?dcXFx*+BHoX121E>x8g%m?N~4`6W~Gul zA)_`A@fxqTYD7gL@hwd`{{W`{06sFK<31q^>GegInILd}v}|X8PUl~3`jg!@J?LF# zM3(JjUCKbL=Vn}T)V~swZj*kT5l!c=;<4?P_TLUz`RR2H=1A-}Mq|PM00*%-=;Oyb zsn68jxPwFR{YS+$BT1l)$t7DiMM2z?&<}H+JWqEgp5OgEUhcUe_TaJ zUNoIJAHq5h$G&;*KXvy#UZ17xnNaDpi$1eYr$0Q+&~{$uF7EGtGz}*8l}iQ_mR(4NyX^MPCOWkV9A(cbelpiOoSQzZQ#5LnNEI`B6&)?d_E^ zkl!BEgK_BGpI3VPhBkcF_R^&Iuf-%3x=7d3!9Uj}ynfbkrHyaJS;G{IVB_RGetmL( zLn{x*z9*(&PMR`11`X3SJ-6htyZ-=-XFN-yDu0SMzvq_lm&H!ZgY=I?^c~s~diaWK z@fnNh@?DQ(OQ?or4GSx+-uT+abIiT9sv(eXAULq!h6g;>#e+toshaE$wnY$768uu+ zj-*)o3M$P%yL&WWzOHs8KKVuy}YjT$)QV|BHv zlzP{ExSHhf5sOF^w_EM?_sIZiH8L|DoR%Du@~Fat#DPbibW_%dpmL2sv?PF|i?Li@ zKS*+FQOIW=VZdWxpJVTj*yxd&%Yl6K85Gn)*5L7ZbLBP77R4^$DtqNbXwrCunNb%0 zRq9SBTj#GiDy3QDk&6pq*q`ZvMwkgC;1S=sHGxViylqqo zCV@S05hQ#1k^ns{*ZIKd2F6jfX?u@cf?59n;+>4)YLC86R>LBy4+Z3_t7YJ2L(s`2 zoLdg3FOb%;OizZLcMGy{qp9SvBdK11mL&c@xjck7hh!(3y#>}w6b%~^C?0SeHxse; z*dCnVIyg5l=uKUJoZO6?CYCuC*eD?IF3vNfK`Aw6Po$Hm4Stz}6RmnYuXTc_;o&E_XupLI8O>5N> zBr&1)HOc%&YmY8+bhp!&%|BiGM-b8er|``@T1_u>g?5HMr@8y)Y~{}X0BY;Qj}9I@ zyeMOvSE)#%jpo!!+hd9`Z0FlLPCL{~%iG@|YE`}w@vS>N%G1W<#4(#u*noSEqWkAg zGF~=M4j!eml;wQB(RD$TY+&embJyr|$&Kq;W^xGp#p05ygF~&=l_)8H>KuKu7njpn zo>Z^HG{Qo%G@7~BtWb^He!Z9OMrv^7S-j-%V9^`ekiiK49%XOJlzt~MZ>Puot5S2n z18;-cT(Zo-^UEwl@KJfr`n+e3EzTDCq#uX;F+bv+KONdebNQT~&Cd9Ze;*&3Tfy*; zmuwq*0TIdkzP0fWXQvU(qxf5c;kqMsATs5ir>#82_WF0lP5$UfIEz$`>?FU)-fQ{n z^TmITd{kPWfX^5-t04Cjf2hu!eSR14&Gh+C%gJpvqd@!NGU?yc8VB#wJI+&=<;u+b zF42CIPp4p-_*QhkmX0jjKxq1R%E@|nP~ZSni9GecObUPTAH+ZQkL`}Y>Jo`4peXe` z556yw15WVxoX9`)u>QFst?{8-+dA&_yRYe&P=BqUdr)^*4o%mf8Fd7*%^*;O2(RX@ zzPX!fwk8W;7Ggbm{{W0dYutdUDxKYI9&vja8WlpZF&j;8?tb6b5GA5PHurBoV%}nY zg!KF}2F2ndZj;WPf$D$8S@}xD@g3W9xV|V|WC1sbib9ZEpm4SqA0wfOBag+FXM6dt zftR3Ds_q`8eJlIpMu+fY^DTkizHe-SemY6W zjga;wx%&>;LS>Rm+7uQ2&`&4pkPIVYozz_MOVDG&n+>#nQtVGtRHH0GOQ&@dUcnrx zVtV@a#h66P9XUTKx(dBN42rfGZZafcL#Z5PLu8QzMI#%yGB@4Z^ z&JnFFWp`H8Q+C3zJn8OcJ9jEA4n1==DeyYa*Q*?TK&9D*m}= zgmaG+{`C*tQwUX_|ea})B8MqM6k@eRIVW1-`&Y9qj(O8QyWSi_CH2@{iEgmgL6 zk1INKvyVRhL#Ws4buZv)bkdb>7?1`29R_QM9h+;HFY9tdPhrd`4c#&IKif7&$)=tt zw}=Z5RvcuRe3zbh?S7Nv$3qd){2xaD0IzC?hbEzoyI<}te5>^2_c^a_&hAD%(|64) z;<|kg!XgpAp>@9#adSEwjxYLG*1NaZdg5;^oH~WhJ9+u5e?v4H-E`gUUb>!GW=^>F}Y_~znt>qf1LDBON{tp^1n2hr}&h# zV{J!;`@2%VAAHtuj&OoLBl8og1L>Fgeis6D9}s`1;` zI7y8TNdqq=i|=*!#aLU306dmT>(Jyi&#}-!wx_1nTz1DtX_*B?JMOShFncK zWMwK)DSO~AHgaOFMkzyk25wK6$}p;%QW&ZyDg}}_IW#>SsOUDFXvdLavR>>^+G_FO zEvHo^oxF+%`{Wx9f*1e*7xl{us@_P$IR(Gz%jG;Y6;np&i{#y7z*h8%LZz*U1gKgb z-1PfnK1Rq;#9gVySY8c#;4Uq$cPTqRhVl!1RSi&qxC-0Yee+iL(SVosDRORUKj|Wd zOBYhlGfe0$k`(8jta1(UfMdqzJM_O#(aBGe19>5~GXX$jnXqRj$0$QZs=wnnqn zh5^N}P*(^409RA#St6XRSALw?%|tFkN=*VP==aHILUv-jl{=3d;sT~Bz9%O88|i_M zR1F_Yqmud~ZDZ|-3^SwC6)WyBwkJcNcU=GvKyrzjXNY)e9-}kzx>Sf7$^&P){&>JZ zFogNSanO;@J_Z@1)9n(sorfM%$G$u-kjJQvqGX4Co~#t~^aS@l**e5A5qFetpKbL# zcgq!;j~8hpk_R9RsOFBy+b|bLVP1y4PHPzp#X*TZ23$=@<-?J?a<`d#^O}N5R7?bm zVQZ(R5hSa$Rf;#pZ^9rJ)`{QOwr(;^l90PmM$_{V-2VV<(AbmILGcfYXub~#jcgaU z*bT`k{w62+obq$^uc_A`4@VvohkU%hJNWnMth$n7h=RQWE$km(;y+)*I(mQO@0K}w zzfT%H4!>VhYahXk{`9}mbFJmWhg^GROMJb3FTi573ki|WM%6yc`Y(Q-na7u{er|r6 z_Q$Hf1}A9!U`C*kvM9pW-1q6*IA30UI!*%Ad@?OInrT%v8kXC{W>Nt^YRSjdytzr# z{{VvV=`30ZCzEM`mL^k8;x(b5X!BQOiuTT&`SO!>nKtGqe}ceBDJ1cm?IAb#-g2J5 zFPR(mN1w0wOmQK3ritS;tK&z>Cinz@Z0*C=ysk;x7mj&(IsjdG>s|X|@R;&78XZoFyg~Agl16NPIoppeJi2ncY+s=LBbFvr)mwqmMd6q4oc&Km za-B8D)VyxT)W@pQ{8LR*6p0RRX@%1?RlQ}$Ziu@I{Bg9qSokwz> z=hrrDJ>vot<1xyHIOkLGZ~IcJaDbZ`sE!KoDfiQ2N%Hu+boG{ zX4Cj=!ATX^_r@sqAK<|749<0aSc`$u%>^gD_sz*Mi{*S!pcg!Yc|6kY%xdC>6$FP( zG-T}~&0yK~{IUC1{5Cn_jn1XXVr&iF202;1D#*c7%zj>gH$#~YGJ=evm~^xU0Z2E6 z1PcSJe@u$dC;;jS9ld_}d>~?1S0peNdXvrIROqOSOcuuhZq5Kc;-<#YL#V63B#5$$ z=EaX%_2Vo?GHhWFfXwV{v~N^9bB`WDh`>8Vo_JRzAIG7{ry7NPi*4wqrUYU}W-l)Q zAHzWadibN$?!mvWs!ZyBcG-eNj!2Auo8XG^T4JMWQ2vjPXpKMfPO*Og#-6{oC1IV zpam2dGum!BkKjFWj8EgO^dXZrD@~DOT(6meT^W z(wZWNBxKV9K2{(u;dD7aY-d5@)qJtLSIk$Qa-v3z$n3_0Ut!ICvy)~<1R#pB*Xx>{ zBaEl06k9HsQwA++P2VK910cp%joXrMr*ZgT7#vfca*aYk2!V+_@MvOw6R(qpinnUa z$ABA=n(Y&>imX8ZgUb*r`Ei-;u9KZY?leFit+E@>y4OHffL)e*Pv-zB&_sz=1M=F(5W9^$n z61Y+3y3ItSGpMqxPvx3r^dF+X2AAUcfYMli9=^HHmn;6Usn>P-bS)5s>7XSv(D@~i zO%i{BPp_%%)2~jG+ry6E40p?u!2KfqCX3;yVAF`!Skr)hNEfjq*U)E=mo8ql--o72 z>CemZ?Qg|3pBvUR8e;F_8+K#ne|9~FdieT$eL3#r;dx$nBi#5W=-7iYXT>U}zK;Uno+;rcxS8K;!)E4RjW^MC0bkJFs;`}y;^JUV2L9w}v- zKs2x!$~NG})d8|agXw3u>s49XmPwqhF+B9B{5#?rmHz<5YQ$ihDzuv(IQWfc zE977NKLO@hW|6%~AKM?z%i(>IF2CV$=^zgVnpw$eWM4IkKZiBXZ0YIxmzB;{o?K*} z8Kn3+&!-clnurea6f*5#J;z_qoOAU(w>+G9{IgZ??}!+-c*&_>;ghdQ;QbG-P8|I` z+c9k9R+mv0mr&oXMI=t(iXzvOXSMbE=DG2_r1o7&WWA`H;o5Cg&8BriZp?I5kGSdm za~yqMd^+T}jJ_W+@gIWhW(F?`Lt%FD9E5rv-%R%K^<|wn^5F9!mVbpgVQT090H)o& z&UdqqFD`xYeRslsCYsp1DcCrxuxyO^-mj&2-**?c)AeWi@_FAF_&@68$r{{!NFBY$ zws!P=Uw`eNQ`7eTh59@3w)lLbMXF)?v!5%Td^7#CUZ)Rq*u>e@eRC4R*0?-`&nCXhd_Yh7$Abyl00fcL{{U>?2|UrdU1X`MT{}OB9CK#sx>inHW@_u! z5$`lOUg}BCN_)c*EqhF^ z?xD620qJKiJ~%9bRwOe8rn&=@^*NDJvYocoe9%05U{Dk)v2nC@EXOJmHHxB?56+d+F20nB?Cr6C3##MTQU*DXl;JphQ zKDE~>wU36j2Ii|hcpqH1rhKN4RW!1`@T;_yP`70Jp2PcQJ=)eV1!XE-SScHVp1)sg z7+ooFREq?W&IZ8Z88)ih@<}Hw$Wh20;oMaK3`p*8CEO((a=ySI8%En{WahquH9RFQ zZ5Y&s-6)mh6wfMe6Q2MSbQ-oGQ4 zE&(WvtXPjh$jqrawP>W`=+~6=7`+Uc1dHWh8A#(QBGtmqicxOX{{TF{2=mLUM#<3i zv)}w?q9JfCHoeTx*)Ph!-|`;E7uDLY015zb z0N`gP+qbp=$nnH3NfAHuFdxq>miSG1KNt9nG3nJ{nIv~5HlwLtM_21h_Pp)sdUoFD z{{TM>^5n1Kbl(qxrH){!w6tlpO>w~NGajd0>hbWUqwYFqHj~Y!S&*cNu7{{$V=T5^ ziF z=e~NZoTHD5`;UcuLLZ9gtZ~_w_#68i`M$TOeLi03_j*30}62oL({<&a>T^?O%my(5{G#uV0TF8f$Lc1&hnT^ zk5V}X%2W*?^*uA2LXdA@@(}G*4`KGe;ln8;sJq~G1HJ%0qo3KU7VM{~IL$%=I&(1( zBYcskBo9;AetD!aC{)M*jZBPr{h=ItfIlpXq)!H&g0lE$khkYQUU>X43{27u#nwPa z%E`_s79<*G3f`mp;8zUJgd&eCa8G*1n0TF83hp)yo!`?UgHxys>amek+rBC!kEtlg z<;e7WVTUG-WKtEvwXAYV`$z&Y z&(_ZvzzUB=*(7+N@ z7W(mli#kXD02po+--`R?7eh2`j?3m^0PA!;t0-h{g&4U|KkDi-0}9RZ_+=aTPh6-7 zw8lDO-!Db<#$YW}j*wUu$I2CY^zDi=?yL4T?pUW@h z1c@4g1Ch<`?U7S{*lK3n$YE+A_ZcoLB2De)Rq~tXz9Cejfy=V62FML{m%?AcZz{LshdyYuJF`IqCImM*0e_J z7(x+L58v&T36w71AyRJ5WD`#+2tYQpZ+CzDX1)>RPck{E_&vzyDk7AM76{Ems3jl* zI;(Saog)ZkZ!sN@Ox$L^-}F!6ap<&ft<;W-yz$S_W-s>Ti{d_peL(nTf@!sk7FQlN zppV_-gdV_fKIgt;{Et$}Jw85bewPjY)%h>!C&j1MYMnXp=Oc2D++W>6{eAPVq3KCC z;(zm4^*Qawx%xBk9}Yha)cWci9=?b_uldhEuj_5!`hWR!;ltY=pT;Mi8KaNkj>=;~ zBuK#8qu6@?0CDOwho#0@d2?>xi1Cx+lIUbvv`kw}RZNQMbV2hEW8d%JJzmM`OyxUs zyT`coz6bG{ej%!wEkma6d^p#WK%RK$D2l$h$JX>`4l?m;hb^y2>%3`9S|t*=7G0W< zcI*4!Z^UOGW=-VQ?}R$%n@{mA40_q#O+Kf3Fpu_Xjw@;4*&Np=I`EU14qn;ZX56z? zPomQ4^%_Q9JWF!;Wb6j_De6zS8HvxADP^l1uSECDX~NlTR23rb5cQPXhXi&RltO+}7-#L8sB`wE9@tbwr(jx@vsO($76d z=bF5@^5uGFY=Y4ILLGE5OSPgCUx&NpdNt)e`f;3-#8yVAwJnHyM3DQWv5{6warXsQhDg`iJ??Z=>q(ZanzB4~2X|{uixTDELjosTH|SdO7f% z<~hq{ecq-R{v)9x_oFSVcO$X-jQLZ2E^nhO^>}0DRj2rNv1eW;h5X+C0N{`3p5D1k zbMrO!FzQ!R66yg_8;b(D`e&B)a4DGhijK^CZeG5}+aesYQN8TXz-s58rWD51Bf?k9 zy$=P?2PlWeU*e1Z0N(!D6|#>QZY*P=(09aSI${E_sy>b10qablcl6^5OKQJXm4FW} z#;0&;OL`BcbeuF*4x$Z2J|Nzw_z3CleRCI$;%KFkNoTZeJLFKN>c`Acl!C+Dae+E+(?_x>mVHC9W_KJ9a(y#iQA9eX zYK>euuBpPGxAMps9TgdfZ%Vw1R_`^n1qY$%FgL^w-FI=x28Y;SN2_?1!U-9ktf1;M zQZs2#Lp*=AAQr0~0n2P2o|jZLDi>2rTn6p4Y@`D9j^q61)JSak?G<54@RNcS0H z{94s8`(|-vXppYv1-T}H>sde-Udzh=01)qhx70sg0*m>leu12*#Kg~+3QLEW`z z1mllfS~VsmX+h(Xz}_@91cj`%-$nGtX;rfr)a`qIlusF?Z;MfqK(9;dfS(bIc?ec+ zg7P#|ICl!Y6+UjAdk00n~b;N`hVAT(Z&Iwc^R%(+s9Lk+Wj+460DHH z{{Yj|D4t(-{lWO#eTHY#{=9E0a_-~hzf3+Yw0KNxMg;QvpWI)^pRms_qc5q-^S>`g zshoKGW8^C)D&jaBK|ldp-QOUAH2=7KL=$O{@os+`oT%{&(t4<~>e+`_l24`LB-r7Dbj_ zZkeipV!tmz*8OwQ=z6kA!ly1f+s^n_r%j=a9m6(?LK1rU!`D`!dk^sc0NXqIlb5M~ z{{U}~{{UZ~%bb&se-E?N0{S@hIvuYhBYa^`4!zgzI(vbh4n1=A@^!v8JpTaF38K{e zD@Cq^i6RoI2h=bky^n0|=*v0YHJ(;kEHmO7nPm7NbRnhFPYW}D67NzQ?xY{b95~N@ zUlvs5dU>Cwvm^XRO`|fEXrpNgC>GnSbvz0K^UmMm@w1KPo>=uR+eazA!3q1^rgzWL9O4CTv}_|~o2A%CPgsWp=~!t{jKT|=+hlkP~rs2;g}E*{_Q zQFn6+=yUedemkQP%Cj%Z-bVE2dEE^V`nTsakxKhOMy z3(y7mN4`p`LjpFev4GsS9R4{6m8^GNREZPUA&CcasIJ4;>z%mxO7(sZv}uWbuG@&K zwtr2{ocVQE7Mb`V)DQY>4tsRW=-uJRQ~`eYP)9rMcX>}ADv`i9#~73gIoi%v$>0Oj z{V;%TPxB>@B1V0zcSFg8g7z|e(I8SRR;?fobZLEk7iw96DkMxbsMSaC!8 zoSHe~)H;fZ)feS&@0Sx$%Hzc=wVP=mimS-NGu1ce5jC>bSi z4~b-(zD9J;ncm2bSBNzpL8H!d@YGWdx<;`>a1;&n`{mHj8dq092b}Hlo(H}*f>5!q zhE%GKeKO9vMl>xTvqSIwahhvX^X351yFEU?=K_1HJzSfhc>3m5Kb;RX&=J7^eNIeP zw2we|0g2?Wqm(73R3~8`E%6yOUgs`iYeOO!|)qp%9<}j^Zr!s`MY%EQYGsC_`tw*c z($Szi5zSHSd2yX3>xO9zXWx_f49jWe4n^%lqC)w^VCjLEO6j(_|KosQqu+|I}NV;m^|0NMxQbD#NK{k$g$^53Dy zd0toH`H#o768uY76jA>G#n#E<5$F#JKFTwR`0+VpM*sqgKcZhWQX-S5k!opg7?w9v__c_2c%O*z{NlVG=Y{=fQ%rf1dXeYt$o zjC);9d7Thy;gjNQ$q7*$4dz!KSzLDd4*vfDL!J2N4)2=9+WEhT{5Qv%XVS)F)ouN@ zmHzC;_s;&Wr^nQv zSN{N?^^Q{BFIE2lSAT))W6-#L9Ji^0zj1>C=tpY#tI(fJ<0mQVPj{ae{{ZT*UfYVa zg=P2yIdGyiZ8W=&RXoPuW*ZfXam6qOO(e8tFs8E8B?l2+ujYCNQ#tP4x(9bWZa;2= zGwt8&#dqeUhgq)uC)P=(hBwiCIX~l*{{Rw2Kf8S?hoRsbzL|ZTcun(Db?#}<>1O>& z$tkq7493Y()k*GF$JAG$&OD~})}Ha_E5)sR*ZaCHKgAA)UE&F?;V8vQk|>M!7QaBg zx!Ur#j{P(EdH(>VKL?GsMH3oCyv*q!>$LcikwuS1^9 z>hW{s+?>AOM64qK#>@ybS-G!KoETLUXk zsDSEcKk>+8Km{iF_c_-m!yWvbH44f%6;=oS8n5->49+gJzkwQuA2&gLf5tO=Hv=>8 zOHNt3l0PAcIVX{}isT+Ui}$>_0~yF>c^kx`&E&u_v64W0UqCuy^hGg7&mbgu16JY> zKi?vZq8)1n-yy%<6<=TNli)p2NX4Ux;)OUZ`|f_HpTic0N`Gd{ZbuZP*ir3y6~W_+ zPfEln??iRTqE;mS&edwT9N`I*OBT5JZ5)A9k0%%P%}!PeH1J2JK(Vx86OEJy-!X38 zs%pv=sX;B!_X7bYR*agEf=^s2LsGz>5tyP2V_`-x8Tg5e2ay81{Hka-w;j04iJ&^M zsF;LxX&8W4u=O{LG;@BfxAuZbU-v?AKh93V{{Z8%7EOUkC7f^t9-Tq_a;bWKE9<3* zsoSMS4)aMs9ld}&o@?7T;v%@(1F0%vS4DA3yQz(L_4UqiRUJsw%+88J#CmW?*7|+2 zp_0uT6%XnFzPQsIAc;XU3!zKpvQMWxF)BHrIVAIw_O9`f?4Ov5 z7IC_mSa%?l0<4<{t~;vd;YXZM9OS_nkxYfv)oXpvXT>Xw4QqBywdPXj%iu6lEi-)}7c0Bc`i@d-cO{{RN?Vr$x> zB`2>vPu8sGgNObnsjk6uGNxmccKC8cGuRy#BHWhUL0L(|fdhgD9Gt>3E@m%)t{TZu$AIEfx z>}Au*6K+jJUT+NjM^A7-yqsq*PW9j8?77L}{98h1)3&7eZ90x-gxq?7KA$TNwfJ6j z^sZca?E_(P$P(%DD{EMwBy`7XE1nw57TS@HSs2cT&<~|R`JA|%{d_>27@u+00A_k zjop2>Y@QMJ9}CsN6hq;kquNK*M+Xh7lZbbBCHlKx@ctt?*>8NB--xz zkIx&o05JX4QNRa~dXs%lbGXu|oplf-$$KPF!u<|%v0g{%7L>k)XFxZ=;f4AVKd#gE z%g4?YFUECxeP6?Xf<$dXh18^1<^T=G$NpOw;l|7V0AknXUl`H|HQI=fje+;CAG+M} z_~)~SFBY?A$JhKCf7d<{r*5ocD1NGcvCp6WM;zq!e~rt`cwZ2RL#Wh5op%SnW*rCK z^V2UkUfGaP+!3{}l<+qnGM?C@cFFu7ng00| z^N%5tnn_QH&E)`jnEIbU272Uq)M?mO;-#o?4|D68s|OUj*al}L4wgFPt!Qkh+|RWK zJaqevL>hcSNb(~&9UHgcG3;Gu>!xQm6#H11E&*HI7ufC0)>KmWO zH8BSiX%d}8&eQ4`8j0heF}-1fi%TSF$WIZucLRWZJ^Ku321Jp>B$)WzK;fJJ08#${ zz7{R;kz2xv=87@qmO}pkFscAvXH+a<)CO(7G27;8TaX89yt_fH^FjKdZeMvnqsuDuX%@|rkd%BDC$TYCGa>TgcmTvyo6TYEY_Cz<3 ze9XtDR2Y?H6l;(Ad*o4wl34&7d_p{;=p4Le^p@a-BS?SZAOJaYUvc-%ctYL7ff~6g zt>khm?ULVx{JgD0GRRe3UG9ZqM72a(y+)J|5IY0ZF*W(%dQt41M8NjCCz15bv=({{ zK_uTCGr!bb`%iE8cJ0*FDBqMl?vpVZ}(YFmnB)9Lil2bkL)IXr$H^RKo^ z+aBvk{d-D0kLNwYuOEgtiInACE~XOD74)_3^%(Z?<>1>McDfcHv6Yw2zyS3b%FOcI zx(Lx?MP0-IepMDuWkD*dpavinO`ANElr2PZExzGG{NL-Q5jLa3Mp*@JL)_Jl`O-2> zz*hCzK^=x}GhS5B%WgYIwr`6mH}9S`9NP|WI(UryzT@G*2sCTiwE+JB?N)E*26_EI z_O;WW(l3oZ*mQ_mfsy5J{VIRHd3_%Fa<5OT*BKu-@L3Q>rNLOt&mrS?$_*dJy78Xh zTX!SN!Ro^))y<{Tw5=u2Zmd}Cs=lP3;?6csJIYUnw|ad_^PVSE+JP+J5P>0N1{7&d z^&}E}qoMx*&7FAU<8Aq7`EHza;3GkeM1(Rx_@6*b@u1g?}?D>Ki*-Xo8iIrK!GHYF30Os z$|#agUu!j*_Iqy2(r&z;ihMmj7p#pmj`B$%{{X_YNKXF%;zs7d2cWK%ojBXhZT|q2 z@zAt7X!Xshd97!S5n1J9x*(^TUgOy2_}h|3c}Kq&#Qq3A3SU|9xs}#JyCPELwS2(# z73=xrlJ8ff-kuJlT%V}Jt{Q?r@oBqH5G@-gKQON|0td0&IL@Cw)>TWPi(fd^>2&@M zvxpEs>x>)DYM`1MbkbshD7zP5*C#fH7&FqHi^y5>emJ|N~)Iz_A%w|=5j+$xG z7(vto)4OeTR2Bd{*(6^M1#{D<8M~d)@;@4Zmr($sT)<*s+>~Ou(trK0AD5;2Ea7x7 z64MlvS@hfw12}(^I@eD^=PXb0XzN@JR_KWQ8~o;dEBzCf+fL(t5BQ;)e)R)%Yr zmkwT58Cpo_3Sq~T3qRX4hy(i|X;B=GdA+|wnX9GKf6G7nafZBy(dwd6G|0?4C;%|5 z_0C*eGW?dhj|r||10E^63|YPnG-_jUwPdDaLe1{>_RRZg>V?tGO(6`NfD15CPo_&^ z$yGz5RHE_tvL0!r+O1yOL9f3#o6G5}HYj05{{Z$q(w@jb2m1`qy5E(^r0N+XXxC2| z^3n61qu30}>c4~OWO&TmRx3VTi_bkzKE1uOw+!;fB`qGJePnROF)BFPKmhuaSvM9^*;ydjN|R?p6z=ES5P33G`Gtth1!1soLeZOM;84;g*vnsp1iVv*4e9FpNr(`d{f2muHQY5sqPun(2x4wxc8*U{NBXRz+R>O{(iuZ3EG&>u13U4OO>(zx zJc+zdh|FF5s1NR*K=dB@&o4hMZ?#(Kz8;FJB1hJS>n8p4rg4n#BInZ&5oObA86%8v z37~!YbNJ%%&fzb`9;z4BX#}BvYJ%xaf$fu*_L{S*^OdzR1|$?D{LH<3bgbbWE45P2 z!~q~+6#ng9X1hWRgsN_Gj6ZY^F9Kp)#JK=GR^l%=8Kg2QZva&uE2Vp9NW;w36*oYi zsN*_F%}=D~R~RY)y9V;#^-extZSc0Y&11mA zjPw5hjr04C{D783^a{5<>|~ywr{hxcK+sC*aXrrB%YK4 z_s*02PPg5x-&efCWc?@B>)qjfCWFXSGRqT4SJ$cFj^4i6)_Od6&6cxy+ME69sz_(m z>HZ*)Y7$Qm%K-5B2Dv+k^0E3G&Ys>oC7m<3?N*OTs{JO_PpN}ns4~YHZ9B_Asp-@K zVY*+T?Tcp)u<}-iL#_Cd!>EgHn^_xpY>Xng}A2O*m;52}Dkc0Vm8s>HsW39FQ#MOZ}#6A1d^p zq&j8Pc=|Y`(WbCpji^n|04_n%zAW$qdATQlTi|rb?WVoGA=T>RX?_c-_(_sM=F~K= zsgb^f=}x1pQ`s$CRyebUm|vIM)3y z_D%XCK-B6XCzmKkiOy2vM$qDe|oz+At0pyhitLc|)Owq`(MQPwF?E=dJPv6x03`=iikzeg% z0U%P8E1nn+Ks$YI@^roofb3Q4XR~>M`{ruGOEc;`uCcKlhFleC*TfZS03W=<$8615 z`VWRf5YwBGZv^sq2Rd=RGs<=y0a$f2C2n?5v_-M!pv>^{yu2kulzdCUl(a78iMnR| zxXGK#wYMYC(LDNXYsBsf0DD){Eb8K3=BtE(uapAR7X61zv;C6y9%iamMv$RWg^vL9 z*EwG{+MZxZ!BBe!5I*T1Ga9*AhKY+#eydgfFbh=7E%5(WPN^&5llm&!b4EN5U* zY;(aNU-QlM$jD>4ofQcjG3}90(rNzyS_Zc|4yBmT`ub#CQ#O@%C}|)FI&X~g^vvqC z&mM^E0GXPbW}Z80_4Kcj@>OD@R9ovhkVYR^I ze~iWC)QJ^glgJhKliQ|cOK3z+66B1YcF3n1r8N%qSyV9uT9IJZOheW|;gIYB z_aDQUAFPgy{!>Ei;}xdof( z26XsfolC4#uCfEvZR8KW1ag*?RC34&JxCRsjFC;qW@T&d{xflxovCodgC`@p^P7y+ znn$f_4dKTlfzyoD{{U3u<@S08WPKA6w~0sOKel2~Wc`vFZFp_*~x!Ssh$~s#Ml7#XqeAjNJLoaM`77JNMjwK|`K$*$7;D@7ay$c~L&YKATM~$YhRK#qN0|7h#*8pqjqm=RaGIzk`0A&P>vLAK`O+ zL&w+7VT^g2DOHt+u@%mI-d?Az#(x~2^7Y<4f7p#z$2NRO%4b->EkaS zE?2f`Vw+PZ!%PdVdGz~6gT!wf!FW)~{Ko)XnhO!Gc zQca4n&~gv*%kIgNraf3^uOK}`ZMs!)8dh8 z9x|}Ze23Hq&R(af#_{(2y3RIo)qfaaKgD8TIy9%BpdZ&b@$1vCM4$MP<)}3{PysE; z9kaI^)UJNFo`Vc8y60wkfF6`9yD5`16--JP{LquPW>iE8mpMz0La9wrk3G9Y$K@5;5vs zuW>%PKSG$EKlo6!uom0a$K{#7b*V;?%}plp1Vrry7<}%12lu?YFi>>VH!1NXJd-NZ zkIdd?)y3ZrowV{1G6fG+?0aUoT)59Dx_GCEnc@o&Zz9nq>2CE2iP>VGQb1Rfnm2R?W^&2DYo7@} zQkHnaAlt_#!9QV`jVsf9F_Z{;s1{bgo=ny7DI$0ehZM0y4`W+^%-Pz!{Yp!!a8BYn z3!p3U%_4IOL?3xww_SRFuUu*lJt)*jO2mW?0c$t-^vW#ocvNdApj8yAJ-cRF59%>W z-Xx`#E`w`RNPUU22h$Rv`gmc}r~VQZh{$Y^#FO$6O z?PRlTdq00{(mhDhGXgYve-ytA7+Jo;`wZOiF`MVIH8Ug##Z<_#n+Vi)pHEDe>MVJX z&nStVjh4F%y#D~(GNO-KqBaW>$1P9>=;XlQ8ekSLlnP^g>m^r5rf7({2_x5%aiC|8 z7Ky)DD<~$!Xic_MFHtOM3P&76k$XYpemPKzF5!f67Ay&NMJM@jmqrO>X1}nQ+jQR~EqcJPgRvA`ygA10Q<)vsju`X&Xvi zw-rEDRYeX5CnBoxM#@y6d0Mf?QKzNGs-vkaKb8_UEzd=jSDIfi7xu!g(Q5oKVQCb# z`2p+n&YUm99H+`D;?%*bGwD=u>CO6#wpn^Me3;W}kRRCgszuzYEz6_C0 znWNA`;!vhXB=g0eY`^OdG(IG0@c#e>N~E%RnI7)Gxr=gRQ@g3!5>2a%=xYA}9OT(7 zj{{tUv}d_JGQ_B*)vt%OkUJ?Nh4MY~ahi^2XMoip0QppN_Bpu8eju7K?xk9&*K?gC z6&%PLaU!<$&BUl;aJtC2G+1>xyW+Dv$J6Piztx9yn5jMd%D`Xco^CU{KMzMfvXA26 zN&fGC%w&ZB0P0g;n9nz%)#V+%e-gY8(TM`9##o_>YTg00+z7E=^`7tYJG=P*0NLd9 z{+{F$pVl-oHIS}Qw(ZI;sBW{+G2oleFD^ZDjmzA9GVz{AQeROPhvFVSqGg5|U?97; z&4*evS)RTr!?BnhwDFEn?$D+3yu!6dYWJV87bP9B!FKDw>>x*okgEiyn(KTNV(djfgr9TjI z%PI1zN3@mwp(ByDs;`^lrfbF9;CsIm{Tr7<@c4BQ>mb&YK$?h^>&OkKB?q`StGQ= zYK8NjcChGF@Rq+t7Upk*sOL5ZrjMU{kGmlf@ zv#-UYRQPYiwLc5isN8hr#PKlhR6kYv5J#qOS$nA`#USHR2Afhpk51+`{{Y(DfBV^+ zfW98ac{O^1jGiRB0>4lYZT@?*Dv9I}LnMc!YFMA3yvn{)LAn|A1nPAWGsw@i9d@@N zeo`&IQ+3$hG7pyct2U?NzYh#|5gX3rj_k#+9;YnfU403>mi~rmraI=;GZPvqR8njX zr2hasi+<-g_+4kDo<;}k~u>w9)*eKyJnJ;vAsv)ajA+7h7c71-bL6qna%R1M$G6`kVAhL zOe%q=K;voJ+zs7-k&P@ved|^Sh{`C?R{e5zad>PqP%jW?}P>s<2 zJ+fR`qlzaAJYouwd=0$%W_nXXOCVj$0+t(XjRAg`7XJXe^%_=+1gRZ`Cwmv_I_Bpp zmy8_$02>hiCDWvGFy^GSzo@L&zv(@!ZAxnj136B9UbcRp*E!p7mZYBrvKbVBp#K2U zM%()4V@eUD(}D>he|Q6ca%;b4QZiJ(EX;oal@jUzm39>#5#;Xx20zyzjirl5g<}mY zjm0kkMgIVNc?^OHW!M5DhBkP=#GDUB71bCj5U2PQ3+y{&P|G}!$8^Vc7NA-79`}*} zk4-Sz&eq4VYpm5lO*bqkmK_N1SrxF#Bw*necWXCZ_|ULh$0b>aKQSE+PXOJTI|9LD ze2#w%&|R#A5C_J)!NOT3ECVr#M%}D=Z@B0(gqgfC zwIBfh0MK_4_4UnSYl{ad86dNHinWRvFgi_;2CzIq*naQ6P>AJ_BQmjKJ@TVN&RT(0 z4crSkHB@ff<+Fag{&+&9l#oGd_9p>O=&}GnR_@L8^%-<(7@zGwmq{w)twB> zBnqsXmOh08S^F`+?U`wkg(!q-Hj~?}{c;0xsH7_cL#X61^dR&&676?BV9KVs1B}#W zq|~p5N#J{Q&XJmw9pI~23Vg(MU+c}@kHyC^HYIngd z-m6j%{U>&Lv)j%+SNm~#Ul3vb=`$$Z`n0P!9>DYYUU~Tc0AF7|`gZ00y)Askm;V3- z`bnySHl>(vi1t6cr#-yCx2G-mc&A*feO&r46X7qaNm+}5HCZ*+`2+c9igW({-}rU2 zt$O-7zgg48HFE1@dLHBPyyMDc#^u?j>vY0>Dz}8PybdN*We0V26n#M>@Xnr<%ll)J z_0>ZGSfTSs>$xI~a!0Lp9_Nhh$A!1HEh0#@GQ!jRUsSN^O6@u*38y5Ax8S+$Lb~Ut zg_)dO?D?;a_=dSPA0N`gGCW#o+(jBLp8o(>P&~l^yEnn1*OStRX*%hjm6~sYsQ9}~ z`ZJ`B5SK_KJGQKr3o!W)Dh*#k2^{0ylOR8irhw=^8$OdnOBvh2(!!xisg1UC(2gvS zPg9a_dRNcG;|TRJPP53ew}YmhGDg-c6f**73p^3hvt3@t(QCdD@ZX0t`i%gG#nZOQ zV*~`2KB{;0R_3pps-v8C^6QgbPUGdEgG@YaMygpMk+!ow-QEm@5<@TWnmsxII3qRA zThv}Wr0%|t;C~&`v?f+ZRz=+_=@_htz1#uBiaUY}4{_6<9iP{i{{TPzwaR?Y4|;!q z$MHBK)@ZdcO}eFuc>e%q$I-2LC*Fbg%}b0Mrue_bG%9qz6wu7`pDv$Lhzd&Qg;uVH z`}92Y%bVJ3-qS!dnn<7xxT4W-;yusY+04~J@#*{@hO}xoJnRuvckX|ceex-P5Fi+iL%Ng(?lOr8QiSBw5%{{Y3yrV_J&q>;Gy=7;5% zH8kkwassSDr0Zjv_7#)bYtdKT8iz#yIqyXMvo)wwYDDrF;Z3MGJazZRXJ)BDRH$wf zuvN_If+Q;)lLa-wDo7uOGgRng)hZCG%n$GQbfA6tJmSnYxnYi#&xt(E%RG;?eSqzY zMG=>UO0CMR&emd7AFp4&O#)gv@ZcK(K6Pd;$LWDftY_p~q1|ZVSgaJ$W-b5&Z((@@ z<%S`qBW~$ltX+4+Ry@U6#}GS*YP-u(JH+ZtjtB>VxY-`SbjSu6MeSYNPbSFoV0tMc zLmt#mCmi=|YJ}9&ivp;h z#=UX|B7`(rm)jzZ1H8fZw}%+M58;4e<7Ea_9N#;I53W=svWN1@w!?PS=9aqgj0fi4 zx?q-$pscsek$ii4=S=uxep5|Tg?Eet(cMqY>BeT(q{gJ~pa80So`%P4idkoO91cja zT>$48h9d-%YJeDzvfuUhz*eD~h2_Hhs-)M{;}=;REfZev+A^EF0ex@@q`0>3Q2i`^ z@b>q_?GoxIMcRLv1EC0{RSgq72cJ2;iPu5H5L5KBLzi2Z@}f z@&O~MMzDSTe%Uhu;hjvZvbz*+0uDj^abc|of$(ru>@@#{j+hJ^W;&< z0>`huZZPyT8j_|Xd=W?LIR077)#CJeSFC+E!?ww%Z8V2)qYHcbAHa<9{{WFZbB{-( zdb}&-{woZSMW)pA<7j04USF}bC+aiZ>DkL?#qHzgFB|%OpTKo6YBW{KNsU z^&dcQ@y`#d#?Dg5S#}xlnNv-vmqOBR7ve<2kji~MdmqQsC#fxymM0#%eH0?=o~N#7 zjO?y}r^9BQB-u z)}R~R`2pM#bG-KOpO$Xdp$3Kzfyt)$Kf#hoHS(oCvQIJ7L`k;3g3aww!93%4`(Fv; zqP{Pyk3pi;MW(g!+x2+B<%Ci2ex;nZ*POm+^0j{ne};TANu0Xspq2?8V_p6mNJt74 zaLg2syL)E845QNM=bmM0b$XYD1iFqvr4fKhRvcd91yy(B8`p(;U!;EzL7|UOiMLY$ zZ8XlLl3WW{1pfdKYG#RbT1hO0laD-X2T%(VJAlTzRyM;Q zIQl7ce-(-yOAQM`k;Wz1LnN$CFk$nhf-lqDRylF^ap|r+y|wRrFXGzG7OGt)pWzyp z)WF1Q^!k0K7H{KU;3wOI>3ru8cP#sKyk_+G{tfY1{y#g;u)JxcJ3=`hIUJrn2Oo2q zi7;1mgZ;c2v%^{8B8fg4Y zl5qYjTB4EIfoHFAiO1l4$HO#XJ{hFbF#V>fyh$3l1GW9E{qu*ZcbnJ8`taA-{7F;c zzoRPez?hj^+Aui$fc$aKhxOw=YoDjfyMCVyKIPHJ6Mw{SJfHcP+5UOXUw1oR$vwO> zhr?3~FupnkJo{F5`FQVSvXWT~7|HHN5R_-KtQFWE7%y*py&=9F-}7Poa&#eykyP2S zV32v^H)2KbO1o|=+<$he&U3QQEo@gLi0b8-ZrxYj>$%M5Z74)YfM|qafZ&tI*D|IP z;sB`1S&y5Jr`IT8V;-HE6}QO2P%BUa{c=uR_)p1jhD7mJP|qQ~<+}Fjdv*LXHDR;P zbu@w(mCpdgmVYd=6xGvf1VlL+b?dc>-HxJmVkA)%-i3;iM*f57KfX;?nPK_2@mGGF z^uTOOB*aWtWOwB))cc&2jxsBRU}$bE4b}F^7O96?s0g4Gbu@1^E+ryY{bP9>wlN%E zP%%kdsmG9c2(8|~<1*00b+#OI0CdO@^AxZMQce9bz>zyW`S+8}_pBn7)EGEa-Mf-b z+COfiAQFuz1?QlDbPkz77^4gGay$3Hk5%z@(l3YRW)w{tuT0+_8kXVOABrZRv?koK zg{ur$vyqPxp!G)u26Z32VQEd zE)=Mxz3u^`dY%FLU}uRLwWbHD1l{Iz#RbKxD-|up59^mqDpPN@Ne9?qD%){pQ$wNa zl^q} z;C(PbhDc$wuy_T%Z>8cD1gsiuird~m38C8tsa8o;Cf%e~-acXYb;cSQWVGNh3&|D8 zKKL6PluId3FyK}JcnKpN&9$z@c0XJJl<~54^CwmB^%*G?$o>%8EDkEV`yXs#l{j+j z9mwN&b~lzKPb-&06kJfhm&)H?eA6h{Fd$W_<8U3l^KqJkQl4)v>bf_ZjMOql^mdyU zT#V@%tkbyxl7){t*SBBG9Hz#&T(6?|Zm1bif#N_Ek47Ia;w*iJd3kZ(H;dD`%5pd3 z8bp?T>_CHDf*B9+$Ua8=c+OwrbII-bov-;EKlMDH(fvbd=4pN?sC`Y3fX z??jQpISN@}KCVYa>CbRM&U}3?SC$u)@|)rM%}>Q98c&O8%fqaVk*0yS!pw%j2lr22 z4;={4P0lm=-yijJ^Lu;WugRiSgH)a*>_R}wHm;!d9*W+hrCA<=NxiA6qu~Dl4AknS zaVDUHEYgu%-=O*dzyq+&&e?e%qn{1^e^S2|)_?mvATE?Qdf>=^I`<^{XHChBld6hs zU+6EzHF~fXU2C?i0#BAb%diqT9z`87xyndqNIye#0$nG^XN~2RS~t_GFe<9#F>QdJ zglx@nz6kYYN7w#~=yj}=+MOgqPC1l_ z5;mV^9DVX`a#yFU_HmZLr1?n%0{)6A1fabii@%4WXKM#r})GqBREwMsBXv`?6 zvv*-Y6hQ-;BJhuw)rR=r$D#OZN=#5O)a#_XZeFwm_C*pqtG80+~^&p)Tf-^tt6<&zouU#%Yy_>@{0xrsc^2SAE?ecFf69M7xjZM^>g;y3AV z@jvFiVo&|y?dWr?+g?{lE!ewIvUeO{TS*+K z6&xayUSVAO<-`ww{{ZsS{eAJKAwf~?m3QHr@cyUQ*j`-u zHLp6vgJW(B`@)U?09=?S7drvci0i>0Yzk6jk$gA_ZZ_{Duc`LMgszfPzhV?pIxh@Q z*BCgG6(XU&L2Oi>o|uq1Uu$hx!vn##^5$ztJdJ8TV1F!%KyTs{JA;6eA*L!te-(85 zWkwX*fv<9&p!LEH8Zud$o0_h+G6yOu(REZ(X+p8Q4uw4I*Wz{p`e9!`tqgUttsY*$ z>Bf3^_-4D|+gDc)n2V4BVy~ZDyu7?5y}qMSJ370S056s~H+418`wx8cHBg9WjNFID z8*Dd9_v5x(fimu!Y9rFv+r0=Uo9mY_Jg{T1m2yui1>d%1O^HNhZFjf^>;sh(Flp6QmikV zKQBL-%_An0#dlG|8oD=s=OTbGG=&{1s189M_!=S$ZuLriH-1@_81qNDkc;F9tC8-1 zwmv`^qTUfuE1u2%xyzLVQ^a=Ta8Kbp1CSupUmS*6@0*ksl z;{dk1aoZ4P1FetC>6B{3%7OOoC*~LOoSF2cm0`Sv7u55~`u_lIM5IIu$t-{nydW#o z(C6vSYNCju5=09~?0beAi27tz3@t{x1slqFUQOjf zrUBG>cG~c2vr?sxK2fsOfCsoEHyL^IqekpW1QUD<&XI~mv~nY-?wbeKH4%QEP?8wK z6-NP;hi>5gkMho3rgrskvy{sET{Fk=O$3^G`bajo{s;E_h|d?RFQ?9P;_vC-e;dP- z!1#<>h^75`R2_DRh13t@U)_`LI6nF8^!ah+$J_CL`HvSqH;*sOeK){$x^c9=(c*Cx zpOEz^eeaR~0BrMmyg5n#0MGijEL$o+!*vpBV?})=pYdb#9q#z9c=WS;9y7y~=RLQ} zHf7hf@MttzZ6@D`MzO%oT%y_@8FxbR z7{rPD%eZ{DF)aBj$oPN8=F;e0b#dvN!==-%mED7ODoYFUngsiRIpZyo_(k6h_<3m# zzg{Vz;Z!ujYW1keBJW@ReLHPH}AV*vC)}Lz+~>>NJV(&<=eLgEC{>D&+6yc! zAAIlO=I6_6wDKymqwu74JqA1S%XJdOux;2#HY;~OTlL1>EQm<(yu)!*(2j>R%Rg8i zr|>xT)7;46nbcGC>_8u$ErwN#DvYUHvi3ouq?#fi<|aSNqM7P_p>SRwgi#DMti-eX;uk zsaYd<{9w)r^A_kuU~3fJwG>CVblb_u78Q{E%!)q5W}uu)D6$!xgV(si9*{Y2nPp-* z94jx|@#%~-Ku|xkBX1Y9*uZCpwi0+}Jpmstz5=xH$qle!Bw&1t&726Na%ME@5ZO0k zj!@Ahtp^48=IkGDt|CyM4V)~Lsn)>c)UqOi6^7ybByuvwY9?Ei zf~gC~Ph9IOH6*A|`P*^oE4aYy_udd)7^)kd@w{IVhHr|LRqmxnLnzTSQ>{hfL7p06F_}pH(){2LN+i{W$c^a=njDJ`M2oVt-Xf zVoPq6nGO2+iOHhy0;p9K2LJ&;VO@AfldJgRc%x15@HIM?u)BFt>-Dd#4&-K}9%idc zsfKkj5ii6g+TurY7CxfXis{^n+8V&CCFLF`#XdO>hvBTQTlIE3imOo6zjA~3Q1xT` z$J?tn!1F#0rJj9i{A=PXyIC!MrKcl=9h{E9b{+cXKU18O+r`_5ADa8`f_yb$jO(?m zN-5k~x$zs<=nvw4nV(OL<3E$1hIw+lueXcm{yFha_t(Up%AFpOyx^WBamZhw>V4>E zpVswlyYqkT9-m9oo<1KlteomKMVy1re))YqIURjodDL-<*a>%qj9)dv=H6DUd!0dD zt7KaqPrgM5hF&&936YT4DtW)_$81GJMDXt1X-`$4Z}I7ymND5|fBe#a?HK7hH66En zr)V}WGh;`pnWVZt#N<;8EFN1Wk5Ug$z5qPJxHVlz`NW2h@*TjiHhBb`+>Gha$_C=h zI$tZe54U{HixfvWW?k&vECFNi$(U;B^)b5Eo`%qOMi27EpEY!+)et~BNjh0O{{Xfy z(v{_B0FrByX28XeRTmP;e9sE?wN&DnJ=1YBV}&T5VED zVT^fikj#I!Yl>FMGHSO!n622Z{{Yh_Vx}x%W@bcH?A*}%cFE*vpJ-d;9-i4`G{vA4 zu#=wSpTuPpiD5o@FL3A_5qQH&8imv`c_~y53Gej$a3r0Xfu$Qd@zCQCuhx|U8X@YK zZQ;Ft(aSjMYa)t9gz9waob`w?749$jWxqjz&8@2kVs-73``G7{%07vcJ_&At+!%Lf8QWOxdMy% z?uqA&id>Y+7BH^Y&gHrvTtPaiU}Q2ie(CM&_*Ps&xCSN#wvP4vPFNJH;&~%bB|RIj z9_K0rU|3H8Jr7K7fSHEkWB`uVf2Ke|!G(7dwzyz03LuXn>?Ny#*x)i*KvIa@4!d~g zD3MtskUKL9Jq`2kg8L7!JfkQ{(kc@|#9dHg& zADjgvxTAdLrAmS14Aj7i_3fIB)KkXGD{U`i16z9MNXpIE>t6jcpBs2}SE`h2^}h>ujB29RBxh+?u)~ljUnKGe z1-kUkvdi$x&|lIh5rS(VpG^1Bmj3{;{IgS!(BFvukZB;%_|Watki+&{4W6|?f!>Ao zyX~6eDhuG>7lpnZ8fx{hnd2rhd}7(o-VY}O&9K`a9_}W(bv~GbM-Q37hXIwy8FL_{0nGpXT%u!yw2^x ze_`k|JUCDH=iuea+nio^=`Y9MS0VU*fsAUrJFou$OnQIj{#nb_^>@4D;yZdim;V5_ z%j)$pK?1`PtZ0I-`sWTDFDve^S1wb8K@#saF=Jbc&{zHRTUC0*mWpJJ5U>D z_ct*%&QtLvIdD?f44k;d%NA8@;`rp{pOmz%>FC*dG{%%TAR$)c zy^L6Bf4K0YNpzj@fe=*C9gWwUPWoFJQNAAP`8q z#1%&_@mq>0KU~gY>X7456+ku*TIcJToiurhFq>0gznE1FX^jwt00|3o@&Z7~rX98@ zQi&zlf5TU=#|o54UD!nv6&w@m{xbMQ3$c#|kaYoi=2UC7SHzZa5`WZ4JoXrqO(CQT zS8oe<_@?+M^H%+sia=dWBXYkK>IoK-3~2{bzCk*fkPyh!XM6 zZDb@KJ@MR9<#N&l3}j>Lz~j>|X&`=iWgAc7jT~d}W2RD3xv|L}_yS@YnSo|u8Vfvi!Wk?0Wukya z5kNOstBsCN0Rp;)dh+wg`}fE>=Q5~RqAJ&0+>UlN z>yCLN*bK6E7Lu_6wLh@B3mF2y`g;EWY}J^8m7)wnD-(abI_5_tWl;EFF7Cff1*5x5 zAeuUE%n0*-KhG#ZD9pRo!t+3Ka0rngExO4Ais_0t6@_-HvEA0XpYf0yBuz`o@yd{Y zo@zk97i^_$P(Qi>tN<~nlG1+!G34L$$@>;*gl0lj+D5wb8~fz7RL>hMVZ1RQ?g8tQ zR}v_qb|}8vhvk=9XNnR))K-Todt&w)$|fUiFC2YvpjgVvRmi39l?{+9S%nor{odo> z0v9bDl-+%ADB~gFWF#m&9F_`FLtnGnK^517lLE*FLBj3=_~R%$1xRY=tzuM9B3sb_ z-vFQMo0Stt5mtyQ2LP*d`*+Ps$|)kTzvuV$&B}yIqA_fvcU2X@9;Z4=&LmyY$-no# z$6Tp8HaGCj`0S_eDeAxDIr8JK{+~SU>-<0Bhe`kpUIEy0(ftQ;{IiEYPIKz{cc0h3 z9v<>Eda}BWG^-rNc#(No2cr(-JfGjuzT4r_&OWTz^QZVsM^>`HtD)Cf+B(H4Blk~Z z>~qz_*4{mL9$tQ(MLIa(70W`KAi1xJ^LK%{drI7=Xlq(rue3h;!J~3 zBGh@rjj_y9lXqKB6kC&3jK*@kuY~LLT2-AjZt3DMB+U~AKWi)aet9gXOBuceE{<8W z!{P5E24w}+H#Kk%Ad5Aco8caDiB?Fi7!VbHLkeSD0t@k9(0b;-& z5vo&dXqQK&0e*+y^2N}4-;L;}_+*-GJQ|53C{cE&go-;5%~UwPhbPGSomc4wn?}cE zkw+lh%$h;sJ8mZJh}ykPP~aN8){~9C9(X?&_`)%P2g9^dA3XB0FDKQ$X8H`5pBUWX zUeCe*07qcasb7adG@9oi{;?n%>$y?;pU>Q94qW;3xy8~>JbSON(R?dO@OXpjNNIY6 z2JHHuT37f1)1LC@ z`hJ&Pczo`wR~DTN8evL0dY@8He{-BTaJ=uklhbVB9!PHytg`^emae($liKof<#|&j z(n90O5`)*D-uF27R&a!hC?9eF9cY50js0?atucS=aJlh6S7vZ|2d-xt4E`+3@}Et& zX8xH3>mtH7yiyqf^8WyAvTA9Ylm7s-PyOTj<-=Zoh!Iq53`=~s*X!w*$On<+4J)`7 zX;!ZP0JdC40^4oKB=80Bxcvsetu#AP3h9C7LM+JN+b!$Ql6D4UUE3uaM*u4H`}D#X z0=!{DvY-08AHGdil~O@cQ2ltui!{-i-b$Z)pay2FJiKdr9h~$gxEYmG6C?is2!4RC zUsKop3`0qIuF^1wJ-Ny`gKkx6NF18F%!(1>2uFw!Lebpj$@a%#Eg0IRyg_`AIOFjd ztsID}6-JD$WsjS1KI9zDq+@DddvAv8soJ;pBb>4t;Z#`4Z1ce2e{2gQk?3w=U-fb_ zVu$t14;rg(zM(7f$%e8f5p5E(S?H`OkNC-fl1kDk0x|&Z2LmXSL%7jazv5m#y*bOM z*40M=@}V-IAQm^5Gz!MjfOSj>VZgc>diWPn+qO0G?b=9k58K-?rz~t@3jQ(<{DXej z40VxXGX&Zhf`%(^^d6sF(3)N4S>7d#za>E?vJDcdDI0782TnR-A@S}*%t7Q~eQLh- zn(!6nH{(F5U&7>)ez~1g?DEfXMCr5(V8)Gm`(gz(M5?l~S))oilh^~>?U(ccPP41Ag{ z2R*19)TxC2tm?Kywe|AmrDqt>cwn#+7Gc8hHvNCLZ60)yu=$kw*<*RBQxHiHWgs_h zbEK?cD=Q-cN1Sj*QgoscJYNzO3jNTIe#bfTN_8C zoNpVM%eeGkZ!5fduX{=Hgpi1*0T}-5oU45gL;Um2%h3M-)xx*@nb$bZ< zmva4&QJm+i%a8j+zK#e{Ai?)W5eoIDE`DZ8ydt0a20K#k8=4Uc>w4o~@U-mxl}Dr0{j(P((UmK;7w- zeJdZ&bHV&ve%i2nZGjQaWA=_Pp#AHNzs>khpw`epA831ql}49NaGu&Z>a6{Y}NI0e@T<>lhfPZZ=cuCHmoyzMsE!Wv!_P8 z{{YV2{)3OMc<-xi{-5=Fc=~@e<7<8-(^Pt30xuQ^Y~QEo{MPw%oL)#{FHu~ON&W9k z^=5c^IdZ(OX2b`FTSt`j2b|3e@f&a#!4wDsAY8KcQM~#d2*68DvBkBOR4+^Imox+G zyhIyqh~O6F{VygO0ju)5I<=nH#$3eEe!6`R;xky9iscQ-2Y+yR&GgS_H-{M9ZNTn2 z52(z^YTvUKc&37pkvXm9O>@_uTuwG#*JYg>FT_Y?fWnbRw5ZBFtUkT(FSD&p_zbcK z1P4^Fels)lQpDi3GZRCDeSVp*X{ul>>`V5(opU#(ik4LaX^t^nMgIUy#x%(#UDbOB z%s@T8GRRsr))F?tf5>G-o0QwxCzkD5bUHRzBO9rtZh*A}$C0yYy3izw z@6#A*VPw?0$twUy{4fm@_UtnC4<;t5)HHj7o{STKKKYy&R7=knTooNM_zWMj>Q#rU zJpev~APwocN;(eKqRGmtV%ZY!ELn-?cR8DC^wyZGsH^%63Pm_2pK15$_+S?4NZKBe z1@1hX_BjNSs1%^tH}?AFfq+`rQdo4cb@dsfGC0^nWM$xzdYa1f0l49zAnXvYJ@c)Y+mvGg77_bPQ;aNadK8%d0DR7Ru`TrKkt|ksNvXda~I;?;e}Ue#MWN{i`SPfBq4v!rwLKzr^6tD<+WwE!iW# zxjp`;6Vv7DUF6^O;~plX;=@+^QeEVe*PuD;g|b6v-5nf7nfx5@tiHb4Ei$@FNYo)A?c4!qXsCCHrHreisol+rKTMO3Q%4Mvss(|@!`3&VKH%_i^V)@% zc((X-Tz?MXe|yWnl+VDaI!&jN5;`nzf6pg>6s{7o#bDJB-^A0HyjH*{J6~Wd0MDt925;! zR>zckW?D07jz9@7#g-45p>eTeL5h=Sfs`DAyfie<$G206G{rB5RasQ8F3xBHfPoIB zm~NFh!)rqWM0P!Vt}Xwo_f*x z0lLsFZteqKl8g-|0?x5RZ?9B%AAhELF7hMAjTRrMo}!>`{Z3sel-xw3DL_*HR( zTZYv7o<9tV&(|XiLo8?i04c1gpqE^(%BTR`cq15Snf7_#nF!!t%l>c@(*Y1rypw0l zXyrv|t(lbpg(NB{IpF>$0lJM+q-49WQP;y;EBIvd(xO17L*!7aXZDTDeFjefUL}@3 zb|9Vz=l5ikQo?=WD0tnxp32yQ3r{&)vWg8fs+jk(ujy9cSZC(j7h6%xa3lWq2wB( zPb-m34B2WX81#yg1C5>cTjGzal^#|WF1!Ryo-u$T8%h-=him4Nhi=(;D44i3<{y!!%_i0VYq>RPS^{Q3q>20wbdN3D0r}` zPYr7CaOeKnrb|hMIx>TOtbzDo67U015?275;{ji-?U0E8C#k&DfF#sLPnA;d_mB3< zh07l0Ce^)xth!g9G$4{_+2ng>^@5%az%WvNgZ*AvQwexfleB`~-E(rKiCQjer}E3J zfU6<3G_m`AM!rlgkKc^ z3X^d3tn=SN>7KtEI05vUd#VR${4!^&_fy-! zzpwlz1Le_a!w*=N#!qLfeA=1922avO3AQ-GkNQOnzx}r>(7fY%LO{uA{?Ibk6-mpW89|fsLEK`DKR5TF}AW@fgnwP=hX=1hh(%)3uXBWY(;c@ z!pRNr8&X7BeiJ7^*U#+osMi^1L8mn;?`%G^pAUpFhRiK`>jam`$>qd&S+}Gf@1)C> zMKfz%fbPMXUTnOxxGr$B@)^2sVrr)sV@EA zyZLeHy?8989Kvyot2Nb!ZdS8PIhU(zR8bEwKDR3Q&N(}Mj(H3c4T)`#ZyD}|7c+^x zlK7}r7W%O+HfQQYcD0r5bLGww8(JuDAK}{&EgfJMcGjgkDBc1wc)SJV(NVP_no@4OpB!5a>5nxGuyIaYg76cO#HfNh3guw4=vH(>oi8KeESXtc*eclSv~%WeD^2;h-FysGm#>mAb}R4 zpGrN$^qv`;Ly?AiV==aB{LT{o(ATf|Q=YwOg-#AuSdLWQ{_fP^;$qhI><-GKaIwaa z#Vl6pZ24N}>WE}{x}d;V1ib;h$Fu%&V-GF6Z^;1fT8Ecedr{xcb0gy zr>+$0WB2t%eA*7l#{s&$JJ%~(qCy;O4(a>e(Y%c4<@Ww=Wto)p=C5GM>}IQ88v~9w zHZB>+x#^p9){tcXx6B>p-8=eWt`vV9eTzEJI9?r*hF_cHVXXeJh71$^My63uPOP}% zY#8S2GPEXRa|KEpG|u;VMPaKga?{6%DT00g0dAqEd)Q?JF6evr)t-be4);o5dSBJA z{EtDi*T=4v@1?L-$?nh7hESREcS4f8I3hvp4Ss>)k6k^I$5T%g-4>id2>(XMvFFY; zQgynaA(k`Nkk6*-0AO#^V=<+#Wu9b8o&E+!k@GkMCMUDY@UQ}L8_G$j zEk;Y{5=|7QeZ9nbDxLJb7fP2dK<$s%azyQqzi-n`%1FB){3PP~#Xuy(tiL3qUaAfU;?;TQ zLr_308@Z5$H_XXx!#tjbhx?RUp7F6`cg&fdCv1&VJu~^Dq_(8qD}*?EXYD4ds_>M_ zXPlMF`Dk*JUb}IvLI&;HSZ^;5ICs>BN0{0AlNgaNbT0YF9TnRn!w$Cg zImgHKBZ~|N44T%$`n1Pg&vMRRTq7@CE-`;+{8%%&26SsVe#Xw7Rh?Yf-f4HN;3Vivan^K);EEje%y&61n%_<3jm(xpuk$vK3|7;Z@J5 z?7HCD&gN(zUzVz0>8l1>IS&b#6XuQ`Is|~cV8inxyyT|>ukV-+T5DF4>L(DSa~nXg2|_<9FqBtNyL;^_;d227u^_F z3_0mah71*3KjZ6$n7lsDLCcepmpPgy8Hx*p9qQi2JoygYwl9`4aml^L>7nGjnQs`5QXqRT}S;;@tz&DHKr^^%HGuI}bexcdiO#PS!~8w|-va zf(N#p??bDprcvpAZ|*LAA4z0(dF$gB1y@M?Zn>w%v2#=XFizr$m+`wFVPp?h7(MEH zA-2cz*~N_fu(#8p`ik{5ZA|s}tu4emlBzCDlmEz+=8AFNqwZx=*Zc=?U9a}{hDr;f zfs@{{XB^HgY~?#>F5CG$n>FLjuyMj96F0G>sm^xO1t{E`dHdaR=XkWG#dq1P_Y}@Z z;4EmyX3cW89l|r@mAw9lz*fAQuxvSM4pjVs32Jp;AQWX>p2(pJ7XB9 z@na^_HGQ7)En}wxm#eb0gCsAN!)uPC-T|HKkCokIUL+ZV^h(}N{TR2T4@lA#B=PhZ z=e*YQ-dX9z6$LpzzfjYoXf)tmuZrMZ6!GC|j(2@?0E*7r`4{GjfFfXO))w$Q?z2_X zWa4dHs@-)Qmn!I953Xrp_?~Z2=Lt>A*sI`+xEM-RNM0Q~u_AM~zTFeZ@tfc=Fwrf&|a%{+Pc z7dA&24)u)eeo1mT!QnsJFOUuTl6pGX8j-8^nZB;XQtF2}&fsl*SwuM1y{gQ)(|10r zou3kGzun}W(REW0tM!+W#Zj0#f><-~4Du5b(yFPp4W%5W%(x{J3#xXWsQ4oln@rW zUFlh>-p$Uera8{@z~mY|Jj}}1nKIIVv7TJcA+v-18~N|qRW<9@Q=3QB?Hj!EOB#iC zgmf~C3AQp2h`%d&R5s!Env$Q?R;f%M7s*7|%R};MXCT5rI zfFOtO-xrTsXk1J5T)h1(;Z%qdh-v8-`?NpF#q|%-7d73=%}Q0#2Yv@H!)}K6IB_K` zhV0L*6iUAdvH!-Dl{)PQ){_4m-!`crR$N{t!gEyG{=Gre?8l^5T-&|ruM44@_em4< zWz(?BRYdKZMsX#c-!W~YiL~)5aatwWWSfYxUd%VGHK*Qe9g9(Keyw-UBeWP6YHplC zc9KehVXa(42aU++ws&h!TyIi+=dhsp6cnAHb?dDy?EZsxrmmY2Z%~Vhq^_IbT7v0w zZv87mH^%*ZR`WHZ*e6su9qt8(cg5*ZQ^{T(P4ZFn5)6(oEk4y{J$4DYu{ht`6gR+0 zCf1TjM*U7fHq)%Vm}qI{-sY)Z{li3F!Le?l=Q4rqFB8M_i*YSv%XwU9wxbW0_Om(J z%`)=JID`1U@d=3eKTnjlobGeXdnQb2BghaSu8QfY`OLZ$OHyj+>OrV&D~d461_q;g+-QsxKKhnT!^FS0=6~%YGWHh1(=ybUJ(8 z9@W{ZD+LjFAe~F5N1wEyv6*zXDv{d)8j|vPZSIUsV6W7OFJKMvV=h_t5JGdgRVYmIzu$wQlqoFsu8{hahB9v3pitKqJ*_pm@ zB9p~f>C1^b;+i+<>}!zbae>yz0d~485p6_m3$y}vRQZ7*fiS-d&}ubm@@}1y31>hz!75K`%yn6wqhWN}0j>m7 z$D~w6yfLmMri=^2_Qw&dPB`=OHs@qr9$A`Kce@a-oX{gNuG1=S~&t;>p&ef!3_Nt_6Y(eM}&xM;AtU98o^vYZwXJ-v4`Z&_v{2+mgM!dQJ+_5*Q-SNu>P{7t)mIRGst=qj~dCN zBOi&#vBt-)e)19v#|LMxFF^Ke%h<`Z)+k@mWLc59oYQ zbnt9;8He-ZBv?IzY@aQ#C&wgD5O%ufbn;;RLKTR?-PNNuprA~UiR^>nnzds}vlELK zgnw!Pyr$VVf@Y$A+3PpFGCK5!_dq&2P(amyaD@oOb|T^l6K@Sf(Z_Wi=>1bUJhBBi z|FIXynhbfog{n0P{qiKxzl!qW$B*lc)(=Zs{#BAEP!deNUUyle zS$)^5-|7!~dl~btWZL*V)Ax#2=4e_X6YN!s%W&p8VtEk*j3PkjNsUDNM}*?D;$vJ9 z{0~rtJWxd$d>`CYB)+kt+n|t8Kc9K~w6p&=RcITGbKLlK&u=u^dg>-O60SJjz ziH3nij=jwRl5X>ljGQ1@FcPY4>o^mSX98wGhxyU3PpyCsNTA4@o<8H>EKxp|wJ&Mk z69PJ{1LT7TAc5~!nz`=|;EGo97oZHlhH=@ksGv8J@LBRBA%M^|X8{Atx z;yESXSGr08ePa2Y@0Cmc$qT|gh!&8)MFKkzZCu7B#y_F&_BGRoic zU$QHME69^(0mxo~wVW9poJ$eB2=Wm1#-wR840xf4bDqj#+!k+CarCPTZ+6!bT`$Ac6>0`# z(GCm_dtroiy!H(7(9e?f{&`5pZ{JG{18Q~LR1c<5x)h~5Rez%tkWbQl&$cijz?bgsnRP4+ z6GcMkJh0l5ZR}{-0QxpFpJhdQKX~7k6q4HJK=Ako089vwG#p31p!lgcLjmBCer+I( z)a9UEj5WFmb zxFIBO<-%t*m^pZ|WH?l~@lzQ4L60Zj9p$~elR@X-Nayz&IcH@g>i5`q)gDkyRU}bK zEbf;kPloV%Kra?cwv9mgz&fyUFyqt7G-RSrT1i*Af0%!i(w_==tK7Y}GmX~p43E{G zf#uOQpoLO!MI=!{;6t@t*c#>M`E^sIte?DrS0|ES1;`B&c%3;kMd8{%^f>=N`XLm! z_x#PlRUhzmeB)zy#=pjkp3qMqyD6}s`HSGfTyknDI-p7S>*O@smZrvh-hpR1W?#=iIJYQVX1c~y+!cHKM~6SHJ$kVYy|lDx*^=iFUtV@4};64`6E1q zs=!Acr_xYCF?A=Se&#K79sc0#@5#XFl6hq`oMfYP)BsQUz$Ec6MU977%m?%^qqHra@pTf3Wc_xY#m>^+$E zleLD54RL^L66bS~Ed8Twdw|{%5!*X`Y>A}bgh9uquTvTMIO;mj3qo6(q?%B&V02x(Z7 zfTi0^%YSsxITJr;6CpcS`sBYJiGj;>RQa)+Up8$)@Nsx5il%7w)E$3Gf?50hi#GERirqaV9!r5B$xu~a|on8ywt$~EnfsQ@TYVEjgQBJ z4kP&q46I|>3ocaX9>L!yCLaE6@7R$5#t#5o;E2&#s(?o>VKJGeUp4gjhdW;kcO8^% zg0uUDN>HxL`~@4w?O!tm;OaUAJ{Nq@$$BmjVEzKsC^UqYFa@H6!Zdi<7OzK(g{y~; zT>Eq6z9Sx_jJ}~aEO`5ehE3#kzL=Net_dWimS0{oQOkL=(!vp&104-|5`sQ?SNtuc z^cr{BPMUbokcda|vhJ!^EqGpyuvVMQOe?N`8xSJl8Gr204HfQ<_5Yb)AwWC*ipeR9 zQ*eIeHGMvgP=V!(znzQb3e{x&VdI!;p6_7Cl=pJMvEAJ#kSuxLjGyzdSU3Y3Li#RY$0=r0;>>i^1CzQ$dhIm_Zh z_XWFNMcmOw;K_e)@yJb?DtkDPTD2~jS+l~kefPdxW{8e#o-xZe)r87J+_T?1GvbAA zFs!u?>y5yP{~$4LiaqtyJ+Hq-SaHX#%ljwMxu0nZuWTW~WHF5SL&*#(Tz4f3iW@4{ zfK#Rf{=5xWg3e>x%tXPKH`4CcpM85BMO!bL1%>3VoV({`w@71lt&-vR9~L>ovS6`z zCRzcKpX9`0hyBL68wZQtZmWlwGD{!k|I<>5R^Gqf7-)nh8wYKq`S}|o^1PMmpM11L zMLl@oQj}G#?;NJ%c;cRPBKu`^@1Vm0^Yqv%L^D4vNw|!BTs{n!cH)ky&P>b;;=$#A zYGojoza^s`3AF;v^Tg!Fs2BTux{D5pk(|?(jf|n3q2T!->)ubLGh_V%&K9v6DMTAo zE1>vkuv~IIBmI}P>6ejc%XGUZFKGRZnN%61@b@AAE?CHIbU$Fk)Vu&Cz!Ux9z={KZ zb^)UEtuOqc~d8*1YdOGiCP2}(b^ZFSh#G*1qk@z zZ}nw))vE2m1&DNL)6oCcscowBDmqq}+W+UU{IEm)T}Uf;q($uJ&6C{c*M?EjzfWoUY3Njg_5M*)xu2;Mgbxzqel@Enm0kv;@UM8@Z z+>En1A<5$Q&-hGc9Z_xmm*-WpZYiE@SU?l6ic;GX;`WKak<&Edrfs_aD1j1rQ~09W z3aO+reC_2WqR}c^G;1cxS8Do2=Ak~uNUsYJVzj=d2YrZB&(2tVOK$ydiF68Qrk9ff zE$XcllJc2xfjvftctvF6esLL6F)NTHEH&Ru~A|$|f1Ke`+y%jyD*>vUmF)%b^?n{Q~P%(riT)Na7WKz$ST{BH+ zkRtZv6+E~+o*{LZ;8M!M(`ZO(qg09 z75Z?33H1PfyG^_)lx=Jz+z!1=wV*Mx^9@=wuboRod96+M##5zVqtVNOiNRTWXtGT~ z=gn=*QB##p*p}F7x>nQF;VBZy4HA(7)9lQ7Z%T>3Ccev8r4zpS%nMuorAPAZ$5y3= zx9=TuslQKK;uvV<8{}EaHmt{6jTcj?hTrp|S+;gOEK2W=;U!E-e04WcmuOGxnog~z z>P#QhBbJUaO)vC(4S?;ph*Fu|TH*)`yp`I_TC3#4lA7kRI+~|YSV>GU>S3<#Y<)@M?k=wBb|u@!1A|9q<{Wr! zUB|fJ;Tr7WHv~!~IoDC!1}_)JlqI6e<(_;1M{3GLm{ktc$SeMxJ^llV{-0MUM|DoC zQZ(Q0PTXs7=gfoIv-hC9m6xUCL)sG_p6*H==AG2$L(24vTa0ro6!}`T+cSRFQ&lN z0k2svL>ahNdn4@8mFl)6YXOpjzsQz1&hJyo^Ve2|b7ZWw!HZwZoTEtYe1^EcEt_!- z5J2lPkq5T8+nm28e5Sboc?B}asQ5Oe7@!;w=D>e%5aqsk{-z@5tenrn%kdK)+wk<( zNb=!%kWQPSnS)AmVd~AWkp%|4iYEK7)@8dn@VllKG-LU7QcHDx?VpBM?^ECv1ob+f zTXVz`aj`+hr$Oqi&0^N^ILzKK2tLStdcW#j@RRbPi^}09iD=2A{8dqvsEuDSKKreR^h1 zflH{NrM~sR{8$#zb7E~y`+=4H{{=co8&h@5Pa;Krd&M+ZXX2^(7lHMUCOOcVau-Df z@TYS)4ek(#pWIUx?UP9}41D#H#0!1uG$C#omrufp^sCp5Lx`<{d!y+l)e|Ee91LpW z)koMQHZn$u@hngE`&r*S)&KfyD!u(IJrCV<1$VE2<%)$;b#V7|1b2-<$50^T5!JMo zj965lGOcccate)j;PhUg44%b?>F51nCe7z$MQngzXh;w*vLIqgcvz7%n5F^b`V>crQ4qv?`-a&(h(=Hk=Ow)Z@s zGfMY8IVDN*eli|6(eJ0Ls_L*g!G86vip%~!OMxNAntwq;kTD*yo#0QQIWzl6XF})BIJ_+M>v2nk&1)Hw(*I5rq - + @@ -49,7 +49,7 @@ - + @@ -75,20 +75,20 @@ - - @@ -335,11 +335,11 @@ - + - - @@ -264,13 +264,13 @@ - + - + From 49bc2f3783af53ebcf57e80437fd198b50e8a6dc Mon Sep 17 00:00:00 2001 From: Felicia Weathers Date: Thu, 22 Oct 2015 18:29:30 -0400 Subject: [PATCH 22/23] fixed font throughout views --- UNIT2PracticeProject/Base.lproj/Main.storyboard | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/UNIT2PracticeProject/Base.lproj/Main.storyboard b/UNIT2PracticeProject/Base.lproj/Main.storyboard index 27c0834..e5bab28 100644 --- a/UNIT2PracticeProject/Base.lproj/Main.storyboard +++ b/UNIT2PracticeProject/Base.lproj/Main.storyboard @@ -406,8 +406,8 @@ - - + + @@ -437,13 +437,13 @@