Full Code of MQCCoder/XYIAPKit for AI

master ebdb2c4a017b cached
101 files
414.4 KB
115.6k tokens
1 requests
Download .txt
Showing preview only (452K chars total). Download the full file or copy to clipboard to get everything.
Repository: MQCCoder/XYIAPKit
Branch: master
Commit: ebdb2c4a017b
Files: 101
Total size: 414.4 KB

Directory structure:
gitextract_jyftf8bp/

├── .gitattributes
├── .gitignore
├── .travis.yml
├── Example/
│   ├── Podfile
│   ├── Pods/
│   │   ├── Local Podspecs/
│   │   │   └── XYIAPKit.podspec.json
│   │   ├── Pods.xcodeproj/
│   │   │   └── project.pbxproj
│   │   ├── Target Support Files/
│   │   │   ├── Pods-XYIAPKit_Example/
│   │   │   │   ├── Info.plist
│   │   │   │   ├── Pods-XYIAPKit_Example-acknowledgements.markdown
│   │   │   │   ├── Pods-XYIAPKit_Example-acknowledgements.plist
│   │   │   │   ├── Pods-XYIAPKit_Example-dummy.m
│   │   │   │   ├── Pods-XYIAPKit_Example-frameworks.sh
│   │   │   │   ├── Pods-XYIAPKit_Example-resources.sh
│   │   │   │   ├── Pods-XYIAPKit_Example-umbrella.h
│   │   │   │   ├── Pods-XYIAPKit_Example.debug.xcconfig
│   │   │   │   ├── Pods-XYIAPKit_Example.modulemap
│   │   │   │   └── Pods-XYIAPKit_Example.release.xcconfig
│   │   │   ├── Pods-XYIAPKit_Tests/
│   │   │   │   ├── Info.plist
│   │   │   │   ├── Pods-XYIAPKit_Tests-acknowledgements.markdown
│   │   │   │   ├── Pods-XYIAPKit_Tests-acknowledgements.plist
│   │   │   │   ├── Pods-XYIAPKit_Tests-dummy.m
│   │   │   │   ├── Pods-XYIAPKit_Tests-frameworks.sh
│   │   │   │   ├── Pods-XYIAPKit_Tests-resources.sh
│   │   │   │   ├── Pods-XYIAPKit_Tests-umbrella.h
│   │   │   │   ├── Pods-XYIAPKit_Tests.debug.xcconfig
│   │   │   │   ├── Pods-XYIAPKit_Tests.modulemap
│   │   │   │   └── Pods-XYIAPKit_Tests.release.xcconfig
│   │   │   ├── XYIAPKit/
│   │   │   │   ├── Info.plist
│   │   │   │   ├── ResourceBundle-XYIAPKit-Info.plist
│   │   │   │   ├── XYIAPKit-dummy.m
│   │   │   │   ├── XYIAPKit-prefix.pch
│   │   │   │   ├── XYIAPKit-umbrella.h
│   │   │   │   ├── XYIAPKit.modulemap
│   │   │   │   └── XYIAPKit.xcconfig
│   │   │   └── YYModel/
│   │   │       ├── Info.plist
│   │   │       ├── YYModel-dummy.m
│   │   │       ├── YYModel-prefix.pch
│   │   │       ├── YYModel-umbrella.h
│   │   │       ├── YYModel.modulemap
│   │   │       └── YYModel.xcconfig
│   │   └── YYModel/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       └── YYModel/
│   │           ├── NSObject+YYModel.h
│   │           ├── NSObject+YYModel.m
│   │           ├── YYClassInfo.h
│   │           ├── YYClassInfo.m
│   │           └── YYModel.h
│   ├── Tests/
│   │   ├── Tests-Info.plist
│   │   ├── Tests-Prefix.pch
│   │   ├── Tests.m
│   │   └── en.lproj/
│   │       └── InfoPlist.strings
│   ├── XYIAPKit/
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── Images.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── XYAppDelegate.h
│   │   ├── XYAppDelegate.m
│   │   ├── XYIAPKit-Info.plist
│   │   ├── XYIAPKit-Prefix.pch
│   │   ├── XYViewController.h
│   │   ├── XYViewController.m
│   │   ├── en.lproj/
│   │   │   └── InfoPlist.strings
│   │   └── main.m
│   ├── XYIAPKit.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── XYIAPKit-Example.xcscheme
│   └── XYIAPKit.xcworkspace/
│       ├── contents.xcworkspacedata
│       └── xcshareddata/
│           └── IDEWorkspaceChecks.plist
├── LICENSE
├── README.md
├── XYIAPKit/
│   ├── Assets/
│   │   ├── .gitkeep
│   │   └── AppleIncRootCertificate.cer
│   ├── Core/
│   │   ├── NSNotification+XYStore.h
│   │   ├── NSNotification+XYStore.m
│   │   ├── XYReceiptRefreshService.h
│   │   ├── XYReceiptRefreshService.m
│   │   ├── XYStore.h
│   │   ├── XYStore.m
│   │   ├── XYStoreProductService.h
│   │   ├── XYStoreProductService.m
│   │   └── XYStoreProtocol.h
│   ├── Persistence/
│   │   ├── KeychainPersistence/
│   │   │   ├── XYStoreKeychainPersistence.h
│   │   │   └── XYStoreKeychainPersistence.m
│   │   └── UserDefaultPersistence/
│   │       ├── XYStoreTransaction.h
│   │       ├── XYStoreTransaction.m
│   │       ├── XYStoreUserDefaultsPersistence.h
│   │       └── XYStoreUserDefaultsPersistence.m
│   ├── Receipt/
│   │   ├── LocalReceiptVerify/
│   │   │   ├── XYAppReceipt.h
│   │   │   ├── XYAppReceipt.m
│   │   │   ├── XYStoreAppReceiptVerifier.h
│   │   │   └── XYStoreAppReceiptVerifier.m
│   │   └── iTunesReceiptVerify/
│   │       ├── NSDate+XYStoreExtension.h
│   │       ├── NSDate+XYStoreExtension.m
│   │       ├── XYInAppReceipt.h
│   │       ├── XYInAppReceipt.m
│   │       ├── XYStoreiTunesReceiptVerifier.h
│   │       ├── XYStoreiTunesReceiptVerifier.m
│   │       ├── XYiTunesReceipt.h
│   │       ├── XYiTunesReceipt.m
│   │       ├── XYiTunesResponse.h
│   │       └── XYiTunesResponse.m
│   └── XYIAPKit.h
└── XYIAPKit.podspec

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.c linguist-language=Objective-C
*.c linguist-language=Objective-C

================================================
FILE: .gitignore
================================================
# OS X
.DS_Store

# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
*.xccheckout
profile
*.moved-aside
DerivedData
*.hmap
*.ipa

# Bundler
.bundle

Carthage
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
# 
# Note: if you ignore the Pods directory, make sure to uncomment
# `pod install` in .travis.yml
#
# Pods/


================================================
FILE: .travis.yml
================================================
# references:
# * http://www.objc.io/issue-6/travis-ci.html
# * https://github.com/supermarin/xcpretty#usage

osx_image: xcode7.3
language: objective-c
# cache: cocoapods
# podfile: Example/Podfile
# before_install:
# - gem install cocoapods # Since Travis is not always on latest version
# - pod install --project-directory=Example
script:
- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/XYIAPKit.xcworkspace -scheme XYIAPKit-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty
- pod lib lint


================================================
FILE: Example/Podfile
================================================
use_frameworks!

target 'XYIAPKit_Example' do
  pod 'XYIAPKit', :path => '../'
  pod 'XYIAPKit/Core', :path => '../'
  pod 'XYIAPKit/iTunesReceiptVerify', :path => '../'
  pod 'XYIAPKit/UserDefaultPersistence', :path => '../'
  pod 'XYIAPKit/KeychainPersistence', :path => '../'
  target 'XYIAPKit_Tests' do
    inherit! :search_paths

    
  end
end


================================================
FILE: Example/Pods/Local Podspecs/XYIAPKit.podspec.json
================================================
{
  "name": "XYIAPKit",
  "version": "0.8.0",
  "summary": "In App purchase sdk, support auto-renewable subscription",
  "description": "非常好用的内购组件,支持自动续期订阅的过期校验、票据检验、简单易用\n提供功能:\n  1)、产品查询\n  2)、产品购买\n  3)、恢复内购\n  4)、票据校验\n  5)、交易存储",
  "homepage": "https://github.com/mqc123450/XYIAPKit",
  "license": {
    "type": "MIT",
    "file": "LICENSE"
  },
  "authors": {
    "qichao.ma": "“qichao.ma@quvideo.com”"
  },
  "source": {
    "git": "https://github.com/mqc123450/XYIAPKit.git",
    "tag": "0.8.0"
  },
  "platforms": {
    "ios": "8.0"
  },
  "source_files": "XYIAPKit/*.h",
  "public_header_files": "XYIAPKit/*.h",
  "frameworks": "StoreKit",
  "requires_arc": true,
  "default_subspecs": "Core",
  "subspecs": [
    {
      "name": "Core",
      "source_files": "XYIAPKit/Core/*.{h,m}"
    },
    {
      "name": "KeychainPersistence",
      "dependencies": {
        "XYIAPKit/Core": [

        ]
      },
      "source_files": "XYIAPKit/Persistence/KeychainPersistence/*.{h,m}",
      "frameworks": "Security"
    },
    {
      "name": "UserDefaultPersistence",
      "dependencies": {
        "XYIAPKit/Core": [

        ]
      },
      "source_files": "XYIAPKit/Persistence/UserDefaultPersistence/*.{h,m}"
    },
    {
      "name": "iTunesReceiptVerify",
      "dependencies": {
        "XYIAPKit/Core": [

        ],
        "YYModel": [
          "~> 1.0.4"
        ]
      },
      "source_files": "XYIAPKit/Receipt/iTunesReceiptVerify/*.{h,m}"
    }
  ]
}


================================================
FILE: Example/Pods/Pods.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 46;
	objects = {

/* Begin PBXBuildFile section */
		0190CB2B09235A151B59F6B91A9FA50B /* XYiTunesResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EB35C135D92DD6C06FFD00ACDB7B51F /* XYiTunesResponse.m */; };
		061611EA41272DC0D8D48D6D9E461A86 /* XYStoreProductService.h in Headers */ = {isa = PBXBuildFile; fileRef = 3794F7EC8004D150065C1D1BD626F0AF /* XYStoreProductService.h */; settings = {ATTRIBUTES = (Public, ); }; };
		0CB1FA41D725C8ED2B8510CFAD33420C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41C1500F3D1717C2A5296677BC797AE5 /* Foundation.framework */; };
		149F9CC2DAA28052C98A2731D5456E07 /* NSDate+XYStoreExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = BF3D7015065F30AE878C53F6486EABC9 /* NSDate+XYStoreExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
		1AC67C6EC7459FEF0084D64E321D8E25 /* YYModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0682D46679BA668693995C21D19D6 /* YYModel-dummy.m */; };
		1BCA97FC9953C4DF9CC5045541DFCC33 /* XYReceiptRefreshService.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D57A73B0C9F628C7DE280E6D5C05B75 /* XYReceiptRefreshService.h */; settings = {ATTRIBUTES = (Public, ); }; };
		221B6F4D5BF0AB12740BC37986BA949F /* NSNotification+XYStore.h in Headers */ = {isa = PBXBuildFile; fileRef = A155BCF09E0CE8548FBF50253E9C6E0D /* NSNotification+XYStore.h */; settings = {ATTRIBUTES = (Public, ); }; };
		25961FEA367E9289CE1B22C2FC130F43 /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = B7D46F03FE96EAC5592C287E14BE8AB2 /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
		2D1ADFC4982DDF689EB0CDDA189BEBAC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41C1500F3D1717C2A5296677BC797AE5 /* Foundation.framework */; };
		31FA590B80708EF135F5F11E72F781F2 /* Pods-XYIAPKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 793632D7AAC7377DF8231B0D1F7A8378 /* Pods-XYIAPKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
		3C9E9C6DA9242675DF7740C11A97A327 /* XYInAppReceipt.h in Headers */ = {isa = PBXBuildFile; fileRef = 36F995D2107846677EDA90FECC5C7C25 /* XYInAppReceipt.h */; settings = {ATTRIBUTES = (Public, ); }; };
		3ECA77D9D15BB3CF74333352D0246469 /* XYiTunesReceipt.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB3272EDCC559E829F8CD7506AC88AE /* XYiTunesReceipt.h */; settings = {ATTRIBUTES = (Public, ); }; };
		44E7101C18001B970E5AFAE46082B0EC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41C1500F3D1717C2A5296677BC797AE5 /* Foundation.framework */; };
		4A2EFA98FA53D0DCDC396510A07EBCC0 /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 805AB6FB2D3B85037CCBBB0ED0327065 /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
		4E7AB2B44F4052611A1E840DC2C1D3B5 /* NSNotification+XYStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 024D52FD954BB82B64D91E85883F4981 /* NSNotification+XYStore.m */; };
		4EC0BD2033EE9ECB9F07929E0D6175AA /* XYStoreiTunesReceiptVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C4B76D9F95F8A546C04C42B7554A26C /* XYStoreiTunesReceiptVerifier.m */; };
		4F991B13E9B467054AC5D017CFADD1B4 /* XYStore.m in Sources */ = {isa = PBXBuildFile; fileRef = A421F09B1B37C6457F5A71423F98EEFF /* XYStore.m */; };
		54464427F27D9B1A5F9B9C328DC20C8E /* XYIAPKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CD849A26EEA37B208995F82F28653A4 /* XYIAPKit-dummy.m */; };
		54C60CFE5F5C1B74AC953A1141A60F02 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25F0A35DC256AC625352FE0944843621 /* Security.framework */; };
		5511B5013827AFC06D870B4A2D0DBC38 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 52EEB1BF0CC695DE3CFBFD144B740510 /* YYClassInfo.m */; };
		57975ECF69A086BDFEC683453F03EBF1 /* XYStoreKeychainPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C24B4C35F097AE05916B5422A2711BF /* XYStoreKeychainPersistence.h */; settings = {ATTRIBUTES = (Public, ); }; };
		5A5019C06608706082054DDD45D6019F /* XYStoreUserDefaultsPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = C5C38C3EDDDD1890760FC2D891E2EDA5 /* XYStoreUserDefaultsPersistence.h */; settings = {ATTRIBUTES = (Public, ); }; };
		5A8FC916815B1902D70DFAC5EFF2C9E6 /* Pods-XYIAPKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8615CDA113AA0D635C14EA85E841DC83 /* Pods-XYIAPKit_Example-dummy.m */; };
		5EFCCED49FB8320B428C21D73C4262B9 /* Pods-XYIAPKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9004122B064C700884E4B1F83E6C2EED /* Pods-XYIAPKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
		659C5EF1AE841C571CA88B1CC903FD75 /* XYStoreTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = F34B439BA7F999D91D8C6240438DFC8F /* XYStoreTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; };
		6B93A3500752BAF0D980B1569A79E364 /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB8BFDD6C7FA43A5F3A40E0E838FA9A /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
		7501FF229371D018E3AA0B3E6F2CA8FA /* XYStoreKeychainPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = 73314FFDB64100A9BAD50ADB0107932E /* XYStoreKeychainPersistence.m */; };
		776E12826C7E86F7B2A14B7CD4FEB36D /* YYModel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F538AD47DB5635F8DE7A63D5F98AC028 /* YYModel.framework */; };
		77C79C6C0162A0905AC0C94B9A222B4D /* XYStoreProductService.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CB886BBFD5417AFA9148385A98B53F0 /* XYStoreProductService.m */; };
		7DB356D00A46476249AAA408E82378CC /* XYStoreTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 635A42EE1C4111088F322577200DDED8 /* XYStoreTransaction.m */; };
		8C9D5CA848CE4B852098330197BD3490 /* XYIAPKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 81C5D3B2633F8532CEF7754D2FC7F9E0 /* XYIAPKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
		95C8A03D3719CC519333FAD651646D1D /* XYiTunesResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B273698DA49DC21DB77E3F96C5844DF /* XYiTunesResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
		BCB20653388F1024B0E23D099409E54F /* XYStoreProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F739038BE0282B78767A7424C18EE6E /* XYStoreProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
		BF26738274100CB6248BFDE882420650 /* Pods-XYIAPKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E2AD4841DC55C4FD36D565E19FEA3D67 /* Pods-XYIAPKit_Tests-dummy.m */; };
		C340FF145DDBBC01B6E3D66087DD576E /* XYStoreiTunesReceiptVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 8155D4C9AF960C1807819740F3A417DC /* XYStoreiTunesReceiptVerifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
		CA9B91B21DB8BE2389BF3FE4E977C0AD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224A7D30F868EB84BED069D6915C4BFF /* CoreFoundation.framework */; };
		CCD9756310DD3335BE91BD8E5CC4C183 /* XYStoreUserDefaultsPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C84BBD405109372802B21E4ACE8A580 /* XYStoreUserDefaultsPersistence.m */; };
		CE4B4F8E4239CEDD4C096619BF695E33 /* XYIAPKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D52ACA47D09F6232840F443CA5621BC /* XYIAPKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
		CE91CF8A87DFDF95ABAA9A6F2BFD7568 /* XYStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CE1BAA18E41A7406CE0D93089FD7366 /* XYStore.h */; settings = {ATTRIBUTES = (Public, ); }; };
		D64FF4398E941C83EA6A2727B3EBDC7E /* XYiTunesReceipt.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD8C60FD1A86803FC188A73977486ED /* XYiTunesReceipt.m */; };
		DCB012E3C059BCEF114485DD716F515B /* YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 5967A2C13205CF40B171004E24C1443B /* YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
		E58B7C7CCD1B2A8A39B335E2E69120F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41C1500F3D1717C2A5296677BC797AE5 /* Foundation.framework */; };
		E90D78D14A0B9B2FBDDE5A6F59A8A1AC /* XYReceiptRefreshService.m in Sources */ = {isa = PBXBuildFile; fileRef = 19839084974243B94E00BAE9ACBD4E33 /* XYReceiptRefreshService.m */; };
		EF232F305F5CE9AD9EB2CCE712A8AB3F /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 965C7A1073637327C2D52CCD3BEDBFE4 /* NSObject+YYModel.m */; };
		F0537418745BDDF25CBF6680797D2BA3 /* NSDate+XYStoreExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A9DF752B2379F8B37FE7FF91F57A61D4 /* NSDate+XYStoreExtension.m */; };
		F66472A6744CC5B45BE6D046F0FC8937 /* XYInAppReceipt.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD057D60C6F794C0E8B9E5B101C2ABE /* XYInAppReceipt.m */; };
		FEE74D991DE3383479669038A4E7AA62 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 781A632EB53F2B7A7AF1A52C276D30A8 /* StoreKit.framework */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		4EE354A6739A8819E64CDA5BD279E18C /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = C0774F21470BDBFFE195E55CCBCB18CD;
			remoteInfo = YYModel;
		};
		7EF4460EED0B05F16E7C608C644BB80D /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 4ECD54A3EE5329BA3C267CC738C1FE18;
			remoteInfo = XYIAPKit;
		};
		D5E546E2779D34CD7BE943AC6EA5EBAC /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = C0774F21470BDBFFE195E55CCBCB18CD;
			remoteInfo = YYModel;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		024D52FD954BB82B64D91E85883F4981 /* NSNotification+XYStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNotification+XYStore.m"; path = "XYIAPKit/Core/NSNotification+XYStore.m"; sourceTree = "<group>"; };
		03BE81B1EFABD8459ACEA32C4407EF73 /* Pods-XYIAPKit_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XYIAPKit_Example-resources.sh"; sourceTree = "<group>"; };
		09F087CF34FA268F3350238A98FD5F22 /* XYIAPKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XYIAPKit.framework; path = XYIAPKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		10BD8B6B11E877BB19B64A601378A31C /* Pods-XYIAPKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-XYIAPKit_Example.modulemap"; sourceTree = "<group>"; };
		1293AD3298E12CD16282987431984A1C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
		1636A9F770CBEF2FB70DE8525F6A7F3E /* Pods-XYIAPKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XYIAPKit_Tests-acknowledgements.plist"; sourceTree = "<group>"; };
		1886C14942AEEE2BAD604B9E8ADA92C6 /* Pods-XYIAPKit_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XYIAPKit_Tests-frameworks.sh"; sourceTree = "<group>"; };
		19839084974243B94E00BAE9ACBD4E33 /* XYReceiptRefreshService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYReceiptRefreshService.m; path = XYIAPKit/Core/XYReceiptRefreshService.m; sourceTree = "<group>"; };
		1B009B9D2F2AB405C1E7F901F4ECC60E /* Pods-XYIAPKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-XYIAPKit_Tests.modulemap"; sourceTree = "<group>"; };
		1B6206B71A39167B5C517EF4C77B299E /* YYModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = YYModel.modulemap; sourceTree = "<group>"; };
		1F739038BE0282B78767A7424C18EE6E /* XYStoreProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStoreProtocol.h; path = XYIAPKit/Core/XYStoreProtocol.h; sourceTree = "<group>"; };
		224A7D30F868EB84BED069D6915C4BFF /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; };
		227FCB7D61B88DDEE976C4C7540CD0D9 /* Pods-XYIAPKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XYIAPKit_Example-acknowledgements.markdown"; sourceTree = "<group>"; };
		25F0A35DC256AC625352FE0944843621 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; };
		2AD057D60C6F794C0E8B9E5B101C2ABE /* XYInAppReceipt.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYInAppReceipt.m; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYInAppReceipt.m; sourceTree = "<group>"; };
		2CE1BAA18E41A7406CE0D93089FD7366 /* XYStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStore.h; path = XYIAPKit/Core/XYStore.h; sourceTree = "<group>"; };
		2EB35C135D92DD6C06FFD00ACDB7B51F /* XYiTunesResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYiTunesResponse.m; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesResponse.m; sourceTree = "<group>"; };
		3155740A2FA1B48EB955100E2F67A552 /* Pods-XYIAPKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XYIAPKit_Example.release.xcconfig"; sourceTree = "<group>"; };
		32C0682D46679BA668693995C21D19D6 /* YYModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYModel-dummy.m"; sourceTree = "<group>"; };
		3408657EECD8D8897C8F30C388C59D2A /* Pods-XYIAPKit_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XYIAPKit_Tests-resources.sh"; sourceTree = "<group>"; };
		36F995D2107846677EDA90FECC5C7C25 /* XYInAppReceipt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYInAppReceipt.h; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYInAppReceipt.h; sourceTree = "<group>"; };
		3794F7EC8004D150065C1D1BD626F0AF /* XYStoreProductService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStoreProductService.h; path = XYIAPKit/Core/XYStoreProductService.h; sourceTree = "<group>"; };
		3C4B76D9F95F8A546C04C42B7554A26C /* XYStoreiTunesReceiptVerifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYStoreiTunesReceiptVerifier.m; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYStoreiTunesReceiptVerifier.m; sourceTree = "<group>"; };
		41B554B698D9A817D3C56478894BA8FA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		41C1500F3D1717C2A5296677BC797AE5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
		4315C1F8CA3D2875D29A8AC5D97BDFD1 /* YYModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYModel.framework; path = YYModel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		490EC24AC5D35552342324CCB6F3302C /* Pods-XYIAPKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XYIAPKit_Tests-acknowledgements.markdown"; sourceTree = "<group>"; };
		4ABF94DC2D45C955486403AF9A5F3640 /* XYIAPKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XYIAPKit-prefix.pch"; sourceTree = "<group>"; };
		4C84BBD405109372802B21E4ACE8A580 /* XYStoreUserDefaultsPersistence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYStoreUserDefaultsPersistence.m; path = XYIAPKit/Persistence/UserDefaultPersistence/XYStoreUserDefaultsPersistence.m; sourceTree = "<group>"; };
		50761F2D51A3BD7ADDF801EF382C4929 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		5153F5F09CD668B257D6F37B774F3372 /* Pods-XYIAPKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XYIAPKit_Tests.debug.xcconfig"; sourceTree = "<group>"; };
		52EEB1BF0CC695DE3CFBFD144B740510 /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYModel/YYClassInfo.m; sourceTree = "<group>"; };
		57685DF090E684F90ED838FAB8653BAD /* XYIAPKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XYIAPKit.xcconfig; sourceTree = "<group>"; };
		5967A2C13205CF40B171004E24C1443B /* YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYModel.h; path = YYModel/YYModel.h; sourceTree = "<group>"; };
		5C24B4C35F097AE05916B5422A2711BF /* XYStoreKeychainPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStoreKeychainPersistence.h; path = XYIAPKit/Persistence/KeychainPersistence/XYStoreKeychainPersistence.h; sourceTree = "<group>"; };
		5D52ACA47D09F6232840F443CA5621BC /* XYIAPKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XYIAPKit-umbrella.h"; sourceTree = "<group>"; };
		5D57A73B0C9F628C7DE280E6D5C05B75 /* XYReceiptRefreshService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYReceiptRefreshService.h; path = XYIAPKit/Core/XYReceiptRefreshService.h; sourceTree = "<group>"; };
		635A42EE1C4111088F322577200DDED8 /* XYStoreTransaction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYStoreTransaction.m; path = XYIAPKit/Persistence/UserDefaultPersistence/XYStoreTransaction.m; sourceTree = "<group>"; };
		6515E9142A8C44450A68DFD3316814F5 /* Pods-XYIAPKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XYIAPKit_Example.debug.xcconfig"; sourceTree = "<group>"; };
		6CB886BBFD5417AFA9148385A98B53F0 /* XYStoreProductService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYStoreProductService.m; path = XYIAPKit/Core/XYStoreProductService.m; sourceTree = "<group>"; };
		6CD849A26EEA37B208995F82F28653A4 /* XYIAPKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XYIAPKit-dummy.m"; sourceTree = "<group>"; };
		73314FFDB64100A9BAD50ADB0107932E /* XYStoreKeychainPersistence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYStoreKeychainPersistence.m; path = XYIAPKit/Persistence/KeychainPersistence/XYStoreKeychainPersistence.m; sourceTree = "<group>"; };
		781A632EB53F2B7A7AF1A52C276D30A8 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; };
		793632D7AAC7377DF8231B0D1F7A8378 /* Pods-XYIAPKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XYIAPKit_Example-umbrella.h"; sourceTree = "<group>"; };
		7F2FAD82758807D8F42CD51D40983F36 /* Pods-XYIAPKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XYIAPKit_Example-acknowledgements.plist"; sourceTree = "<group>"; };
		7FD8C60FD1A86803FC188A73977486ED /* XYiTunesReceipt.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYiTunesReceipt.m; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesReceipt.m; sourceTree = "<group>"; };
		805AB6FB2D3B85037CCBBB0ED0327065 /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYModel/YYClassInfo.h; sourceTree = "<group>"; };
		8155D4C9AF960C1807819740F3A417DC /* XYStoreiTunesReceiptVerifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStoreiTunesReceiptVerifier.h; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYStoreiTunesReceiptVerifier.h; sourceTree = "<group>"; };
		81C5D3B2633F8532CEF7754D2FC7F9E0 /* XYIAPKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYIAPKit.h; path = XYIAPKit/XYIAPKit.h; sourceTree = "<group>"; };
		8615CDA113AA0D635C14EA85E841DC83 /* Pods-XYIAPKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XYIAPKit_Example-dummy.m"; sourceTree = "<group>"; };
		8CFD8BFBAB73DBF02097DACCD0271C7C /* Pods-XYIAPKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XYIAPKit_Tests.release.xcconfig"; sourceTree = "<group>"; };
		9004122B064C700884E4B1F83E6C2EED /* Pods-XYIAPKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XYIAPKit_Tests-umbrella.h"; sourceTree = "<group>"; };
		93A332424F48023EB611C173EB58D0C2 /* Pods_XYIAPKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XYIAPKit_Tests.framework; path = "Pods-XYIAPKit_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
		93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
		965C7A1073637327C2D52CCD3BEDBFE4 /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYModel/NSObject+YYModel.m"; sourceTree = "<group>"; };
		9B273698DA49DC21DB77E3F96C5844DF /* XYiTunesResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYiTunesResponse.h; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesResponse.h; sourceTree = "<group>"; };
		9C5BB56959983EABC0C5B3B44CBEF36F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
		9EB3272EDCC559E829F8CD7506AC88AE /* XYiTunesReceipt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYiTunesReceipt.h; path = XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesReceipt.h; sourceTree = "<group>"; };
		9EB8BFDD6C7FA43A5F3A40E0E838FA9A /* YYModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-umbrella.h"; sourceTree = "<group>"; };
		A155BCF09E0CE8548FBF50253E9C6E0D /* NSNotification+XYStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotification+XYStore.h"; path = "XYIAPKit/Core/NSNotification+XYStore.h"; sourceTree = "<group>"; };
		A2014A34A0545E453DAEC4F1ACA6EFC1 /* XYIAPKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = XYIAPKit.modulemap; sourceTree = "<group>"; };
		A421F09B1B37C6457F5A71423F98EEFF /* XYStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XYStore.m; path = XYIAPKit/Core/XYStore.m; sourceTree = "<group>"; };
		A5C98E7CF02C568CFE18C996E0CE5855 /* Pods-XYIAPKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XYIAPKit_Example-frameworks.sh"; sourceTree = "<group>"; };
		A9DF752B2379F8B37FE7FF91F57A61D4 /* NSDate+XYStoreExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDate+XYStoreExtension.m"; path = "XYIAPKit/Receipt/iTunesReceiptVerify/NSDate+XYStoreExtension.m"; sourceTree = "<group>"; };
		B7D46F03FE96EAC5592C287E14BE8AB2 /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYModel/NSObject+YYModel.h"; sourceTree = "<group>"; };
		BF3D7015065F30AE878C53F6486EABC9 /* NSDate+XYStoreExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDate+XYStoreExtension.h"; path = "XYIAPKit/Receipt/iTunesReceiptVerify/NSDate+XYStoreExtension.h"; sourceTree = "<group>"; };
		C09F538BC783989A268B6A3C2CC9741E /* XYIAPKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = XYIAPKit.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
		C3C7EDE62C882DD4D17C9B00BAA0A454 /* YYModel.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.xcconfig; sourceTree = "<group>"; };
		C5C38C3EDDDD1890760FC2D891E2EDA5 /* XYStoreUserDefaultsPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStoreUserDefaultsPersistence.h; path = XYIAPKit/Persistence/UserDefaultPersistence/XYStoreUserDefaultsPersistence.h; sourceTree = "<group>"; };
		CD76A9661DB93661D7E5D3047DDB078A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		E017EDC1FFAF720060C16F9F6678643C /* YYModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-prefix.pch"; sourceTree = "<group>"; };
		E2AD4841DC55C4FD36D565E19FEA3D67 /* Pods-XYIAPKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XYIAPKit_Tests-dummy.m"; sourceTree = "<group>"; };
		F34B439BA7F999D91D8C6240438DFC8F /* XYStoreTransaction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XYStoreTransaction.h; path = XYIAPKit/Persistence/UserDefaultPersistence/XYStoreTransaction.h; sourceTree = "<group>"; };
		F538AD47DB5635F8DE7A63D5F98AC028 /* YYModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYModel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		F613DF08298A7EE24DA8B33580F70C17 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		FED033A3212E7D1603232AED76FE0E97 /* Pods_XYIAPKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XYIAPKit_Example.framework; path = "Pods-XYIAPKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		087A90F83DE38641435916A70C2CE920 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				44E7101C18001B970E5AFAE46082B0EC /* Foundation.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		21D350EB95D3160E52755CC44D37336A /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				0CB1FA41D725C8ED2B8510CFAD33420C /* Foundation.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		772FE6F29C1A86B44EB34B6D45251773 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				2D1ADFC4982DDF689EB0CDDA189BEBAC /* Foundation.framework in Frameworks */,
				54C60CFE5F5C1B74AC953A1141A60F02 /* Security.framework in Frameworks */,
				FEE74D991DE3383479669038A4E7AA62 /* StoreKit.framework in Frameworks */,
				776E12826C7E86F7B2A14B7CD4FEB36D /* YYModel.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B966B3AACD2B1AFE7A25ADBA691799ED /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				CA9B91B21DB8BE2389BF3FE4E977C0AD /* CoreFoundation.framework in Frameworks */,
				E58B7C7CCD1B2A8A39B335E2E69120F0 /* Foundation.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		06D5BCDFCE1D1B4ED2A1D46C5155CEDA /* Pods-XYIAPKit_Tests */ = {
			isa = PBXGroup;
			children = (
				CD76A9661DB93661D7E5D3047DDB078A /* Info.plist */,
				1B009B9D2F2AB405C1E7F901F4ECC60E /* Pods-XYIAPKit_Tests.modulemap */,
				490EC24AC5D35552342324CCB6F3302C /* Pods-XYIAPKit_Tests-acknowledgements.markdown */,
				1636A9F770CBEF2FB70DE8525F6A7F3E /* Pods-XYIAPKit_Tests-acknowledgements.plist */,
				E2AD4841DC55C4FD36D565E19FEA3D67 /* Pods-XYIAPKit_Tests-dummy.m */,
				1886C14942AEEE2BAD604B9E8ADA92C6 /* Pods-XYIAPKit_Tests-frameworks.sh */,
				3408657EECD8D8897C8F30C388C59D2A /* Pods-XYIAPKit_Tests-resources.sh */,
				9004122B064C700884E4B1F83E6C2EED /* Pods-XYIAPKit_Tests-umbrella.h */,
				5153F5F09CD668B257D6F37B774F3372 /* Pods-XYIAPKit_Tests.debug.xcconfig */,
				8CFD8BFBAB73DBF02097DACCD0271C7C /* Pods-XYIAPKit_Tests.release.xcconfig */,
			);
			name = "Pods-XYIAPKit_Tests";
			path = "Target Support Files/Pods-XYIAPKit_Tests";
			sourceTree = "<group>";
		};
		09380EA71E3EBD81A87882157DB36C71 /* Pods */ = {
			isa = PBXGroup;
			children = (
				0EADFB64E1E3B0D228C305C49EE28D12 /* YYModel */,
			);
			name = Pods;
			sourceTree = "<group>";
		};
		0EADFB64E1E3B0D228C305C49EE28D12 /* YYModel */ = {
			isa = PBXGroup;
			children = (
				B7D46F03FE96EAC5592C287E14BE8AB2 /* NSObject+YYModel.h */,
				965C7A1073637327C2D52CCD3BEDBFE4 /* NSObject+YYModel.m */,
				805AB6FB2D3B85037CCBBB0ED0327065 /* YYClassInfo.h */,
				52EEB1BF0CC695DE3CFBFD144B740510 /* YYClassInfo.m */,
				5967A2C13205CF40B171004E24C1443B /* YYModel.h */,
				6CBFD2F103FFE1F250918CCE24B686CA /* Support Files */,
			);
			name = YYModel;
			path = YYModel;
			sourceTree = "<group>";
		};
		13A9BD2FDB0B790406639BA9B57C7F16 /* Support Files */ = {
			isa = PBXGroup;
			children = (
				41B554B698D9A817D3C56478894BA8FA /* Info.plist */,
				A2014A34A0545E453DAEC4F1ACA6EFC1 /* XYIAPKit.modulemap */,
				57685DF090E684F90ED838FAB8653BAD /* XYIAPKit.xcconfig */,
				6CD849A26EEA37B208995F82F28653A4 /* XYIAPKit-dummy.m */,
				4ABF94DC2D45C955486403AF9A5F3640 /* XYIAPKit-prefix.pch */,
				5D52ACA47D09F6232840F443CA5621BC /* XYIAPKit-umbrella.h */,
			);
			name = "Support Files";
			path = "Example/Pods/Target Support Files/XYIAPKit";
			sourceTree = "<group>";
		};
		18C988F098DB04E0A86257BD6080E78F /* Development Pods */ = {
			isa = PBXGroup;
			children = (
				87688B8A352A8CA93EB643A620EE190C /* XYIAPKit */,
			);
			name = "Development Pods";
			sourceTree = "<group>";
		};
		1BE391897633F124B6BFA29300C9C7CF /* KeychainPersistence */ = {
			isa = PBXGroup;
			children = (
				5C24B4C35F097AE05916B5422A2711BF /* XYStoreKeychainPersistence.h */,
				73314FFDB64100A9BAD50ADB0107932E /* XYStoreKeychainPersistence.m */,
			);
			name = KeychainPersistence;
			sourceTree = "<group>";
		};
		5B28468599CE82A970E6153A9F29E4B0 /* Pods-XYIAPKit_Example */ = {
			isa = PBXGroup;
			children = (
				50761F2D51A3BD7ADDF801EF382C4929 /* Info.plist */,
				10BD8B6B11E877BB19B64A601378A31C /* Pods-XYIAPKit_Example.modulemap */,
				227FCB7D61B88DDEE976C4C7540CD0D9 /* Pods-XYIAPKit_Example-acknowledgements.markdown */,
				7F2FAD82758807D8F42CD51D40983F36 /* Pods-XYIAPKit_Example-acknowledgements.plist */,
				8615CDA113AA0D635C14EA85E841DC83 /* Pods-XYIAPKit_Example-dummy.m */,
				A5C98E7CF02C568CFE18C996E0CE5855 /* Pods-XYIAPKit_Example-frameworks.sh */,
				03BE81B1EFABD8459ACEA32C4407EF73 /* Pods-XYIAPKit_Example-resources.sh */,
				793632D7AAC7377DF8231B0D1F7A8378 /* Pods-XYIAPKit_Example-umbrella.h */,
				6515E9142A8C44450A68DFD3316814F5 /* Pods-XYIAPKit_Example.debug.xcconfig */,
				3155740A2FA1B48EB955100E2F67A552 /* Pods-XYIAPKit_Example.release.xcconfig */,
			);
			name = "Pods-XYIAPKit_Example";
			path = "Target Support Files/Pods-XYIAPKit_Example";
			sourceTree = "<group>";
		};
		68D4D76D28BEFB10552E5EF9CA6636AF /* Pod */ = {
			isa = PBXGroup;
			children = (
				9C5BB56959983EABC0C5B3B44CBEF36F /* LICENSE */,
				1293AD3298E12CD16282987431984A1C /* README.md */,
				C09F538BC783989A268B6A3C2CC9741E /* XYIAPKit.podspec */,
			);
			name = Pod;
			sourceTree = "<group>";
		};
		6CBFD2F103FFE1F250918CCE24B686CA /* Support Files */ = {
			isa = PBXGroup;
			children = (
				F613DF08298A7EE24DA8B33580F70C17 /* Info.plist */,
				1B6206B71A39167B5C517EF4C77B299E /* YYModel.modulemap */,
				C3C7EDE62C882DD4D17C9B00BAA0A454 /* YYModel.xcconfig */,
				32C0682D46679BA668693995C21D19D6 /* YYModel-dummy.m */,
				E017EDC1FFAF720060C16F9F6678643C /* YYModel-prefix.pch */,
				9EB8BFDD6C7FA43A5F3A40E0E838FA9A /* YYModel-umbrella.h */,
			);
			name = "Support Files";
			path = "../Target Support Files/YYModel";
			sourceTree = "<group>";
		};
		7DB346D0F39D3F0E887471402A8071AB = {
			isa = PBXGroup;
			children = (
				93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,
				18C988F098DB04E0A86257BD6080E78F /* Development Pods */,
				EE02E376E3DC7E7C8C1BE5DCC0B99A7E /* Frameworks */,
				09380EA71E3EBD81A87882157DB36C71 /* Pods */,
				F2B887FA5F6C6B51A743E04B103E62F8 /* Products */,
				A9EEFA94774E7345E6D1F65EC2AA03E2 /* Targets Support Files */,
			);
			sourceTree = "<group>";
		};
		87688B8A352A8CA93EB643A620EE190C /* XYIAPKit */ = {
			isa = PBXGroup;
			children = (
				81C5D3B2633F8532CEF7754D2FC7F9E0 /* XYIAPKit.h */,
				B76475C7A19FB53F68110D96521CCA59 /* Core */,
				E7ECAA0257FCB5125DA1478EB8834638 /* iTunesReceiptVerify */,
				1BE391897633F124B6BFA29300C9C7CF /* KeychainPersistence */,
				68D4D76D28BEFB10552E5EF9CA6636AF /* Pod */,
				13A9BD2FDB0B790406639BA9B57C7F16 /* Support Files */,
				F14E70A12F12C0AD619DC1CC4D30523E /* UserDefaultPersistence */,
			);
			name = XYIAPKit;
			path = ../..;
			sourceTree = "<group>";
		};
		A9EEFA94774E7345E6D1F65EC2AA03E2 /* Targets Support Files */ = {
			isa = PBXGroup;
			children = (
				5B28468599CE82A970E6153A9F29E4B0 /* Pods-XYIAPKit_Example */,
				06D5BCDFCE1D1B4ED2A1D46C5155CEDA /* Pods-XYIAPKit_Tests */,
			);
			name = "Targets Support Files";
			sourceTree = "<group>";
		};
		AE3361776E6CB588EA7843C980927B90 /* iOS */ = {
			isa = PBXGroup;
			children = (
				224A7D30F868EB84BED069D6915C4BFF /* CoreFoundation.framework */,
				41C1500F3D1717C2A5296677BC797AE5 /* Foundation.framework */,
				25F0A35DC256AC625352FE0944843621 /* Security.framework */,
				781A632EB53F2B7A7AF1A52C276D30A8 /* StoreKit.framework */,
			);
			name = iOS;
			sourceTree = "<group>";
		};
		B76475C7A19FB53F68110D96521CCA59 /* Core */ = {
			isa = PBXGroup;
			children = (
				A155BCF09E0CE8548FBF50253E9C6E0D /* NSNotification+XYStore.h */,
				024D52FD954BB82B64D91E85883F4981 /* NSNotification+XYStore.m */,
				5D57A73B0C9F628C7DE280E6D5C05B75 /* XYReceiptRefreshService.h */,
				19839084974243B94E00BAE9ACBD4E33 /* XYReceiptRefreshService.m */,
				2CE1BAA18E41A7406CE0D93089FD7366 /* XYStore.h */,
				A421F09B1B37C6457F5A71423F98EEFF /* XYStore.m */,
				3794F7EC8004D150065C1D1BD626F0AF /* XYStoreProductService.h */,
				6CB886BBFD5417AFA9148385A98B53F0 /* XYStoreProductService.m */,
				1F739038BE0282B78767A7424C18EE6E /* XYStoreProtocol.h */,
			);
			name = Core;
			sourceTree = "<group>";
		};
		E7ECAA0257FCB5125DA1478EB8834638 /* iTunesReceiptVerify */ = {
			isa = PBXGroup;
			children = (
				BF3D7015065F30AE878C53F6486EABC9 /* NSDate+XYStoreExtension.h */,
				A9DF752B2379F8B37FE7FF91F57A61D4 /* NSDate+XYStoreExtension.m */,
				36F995D2107846677EDA90FECC5C7C25 /* XYInAppReceipt.h */,
				2AD057D60C6F794C0E8B9E5B101C2ABE /* XYInAppReceipt.m */,
				9EB3272EDCC559E829F8CD7506AC88AE /* XYiTunesReceipt.h */,
				7FD8C60FD1A86803FC188A73977486ED /* XYiTunesReceipt.m */,
				9B273698DA49DC21DB77E3F96C5844DF /* XYiTunesResponse.h */,
				2EB35C135D92DD6C06FFD00ACDB7B51F /* XYiTunesResponse.m */,
				8155D4C9AF960C1807819740F3A417DC /* XYStoreiTunesReceiptVerifier.h */,
				3C4B76D9F95F8A546C04C42B7554A26C /* XYStoreiTunesReceiptVerifier.m */,
			);
			name = iTunesReceiptVerify;
			sourceTree = "<group>";
		};
		EE02E376E3DC7E7C8C1BE5DCC0B99A7E /* Frameworks */ = {
			isa = PBXGroup;
			children = (
				F538AD47DB5635F8DE7A63D5F98AC028 /* YYModel.framework */,
				AE3361776E6CB588EA7843C980927B90 /* iOS */,
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
		F14E70A12F12C0AD619DC1CC4D30523E /* UserDefaultPersistence */ = {
			isa = PBXGroup;
			children = (
				F34B439BA7F999D91D8C6240438DFC8F /* XYStoreTransaction.h */,
				635A42EE1C4111088F322577200DDED8 /* XYStoreTransaction.m */,
				C5C38C3EDDDD1890760FC2D891E2EDA5 /* XYStoreUserDefaultsPersistence.h */,
				4C84BBD405109372802B21E4ACE8A580 /* XYStoreUserDefaultsPersistence.m */,
			);
			name = UserDefaultPersistence;
			sourceTree = "<group>";
		};
		F2B887FA5F6C6B51A743E04B103E62F8 /* Products */ = {
			isa = PBXGroup;
			children = (
				FED033A3212E7D1603232AED76FE0E97 /* Pods_XYIAPKit_Example.framework */,
				93A332424F48023EB611C173EB58D0C2 /* Pods_XYIAPKit_Tests.framework */,
				09F087CF34FA268F3350238A98FD5F22 /* XYIAPKit.framework */,
				4315C1F8CA3D2875D29A8AC5D97BDFD1 /* YYModel.framework */,
			);
			name = Products;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXHeadersBuildPhase section */
		3A3ACFC50D255C7178E5814CB26830B1 /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				31FA590B80708EF135F5F11E72F781F2 /* Pods-XYIAPKit_Example-umbrella.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		A971EC61C1A2979C1C44B112F5FFD21F /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				5EFCCED49FB8320B428C21D73C4262B9 /* Pods-XYIAPKit_Tests-umbrella.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B382A2ED6B059D7355147875F936071E /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				25961FEA367E9289CE1B22C2FC130F43 /* NSObject+YYModel.h in Headers */,
				4A2EFA98FA53D0DCDC396510A07EBCC0 /* YYClassInfo.h in Headers */,
				6B93A3500752BAF0D980B1569A79E364 /* YYModel-umbrella.h in Headers */,
				DCB012E3C059BCEF114485DD716F515B /* YYModel.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BA4C28D77710A12F103F8C14AFC51DA2 /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				149F9CC2DAA28052C98A2731D5456E07 /* NSDate+XYStoreExtension.h in Headers */,
				221B6F4D5BF0AB12740BC37986BA949F /* NSNotification+XYStore.h in Headers */,
				CE4B4F8E4239CEDD4C096619BF695E33 /* XYIAPKit-umbrella.h in Headers */,
				8C9D5CA848CE4B852098330197BD3490 /* XYIAPKit.h in Headers */,
				3C9E9C6DA9242675DF7740C11A97A327 /* XYInAppReceipt.h in Headers */,
				3ECA77D9D15BB3CF74333352D0246469 /* XYiTunesReceipt.h in Headers */,
				95C8A03D3719CC519333FAD651646D1D /* XYiTunesResponse.h in Headers */,
				1BCA97FC9953C4DF9CC5045541DFCC33 /* XYReceiptRefreshService.h in Headers */,
				CE91CF8A87DFDF95ABAA9A6F2BFD7568 /* XYStore.h in Headers */,
				C340FF145DDBBC01B6E3D66087DD576E /* XYStoreiTunesReceiptVerifier.h in Headers */,
				57975ECF69A086BDFEC683453F03EBF1 /* XYStoreKeychainPersistence.h in Headers */,
				061611EA41272DC0D8D48D6D9E461A86 /* XYStoreProductService.h in Headers */,
				BCB20653388F1024B0E23D099409E54F /* XYStoreProtocol.h in Headers */,
				659C5EF1AE841C571CA88B1CC903FD75 /* XYStoreTransaction.h in Headers */,
				5A5019C06608706082054DDD45D6019F /* XYStoreUserDefaultsPersistence.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXHeadersBuildPhase section */

/* Begin PBXNativeTarget section */
		44E07BE6285328DE74E7DFB2F59998CC /* Pods-XYIAPKit_Tests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = AA305A28AD005A11A7111A786DD36650 /* Build configuration list for PBXNativeTarget "Pods-XYIAPKit_Tests" */;
			buildPhases = (
				566EF5D5FFB5F8AD441162E9902413FF /* Sources */,
				087A90F83DE38641435916A70C2CE920 /* Frameworks */,
				A971EC61C1A2979C1C44B112F5FFD21F /* Headers */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "Pods-XYIAPKit_Tests";
			productName = "Pods-XYIAPKit_Tests";
			productReference = 93A332424F48023EB611C173EB58D0C2 /* Pods_XYIAPKit_Tests.framework */;
			productType = "com.apple.product-type.framework";
		};
		4ECD54A3EE5329BA3C267CC738C1FE18 /* XYIAPKit */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 6D94804578581EA04C0E1BA4190A59DE /* Build configuration list for PBXNativeTarget "XYIAPKit" */;
			buildPhases = (
				DC1CB4D2E43301FD625914C50A59E3E9 /* Sources */,
				772FE6F29C1A86B44EB34B6D45251773 /* Frameworks */,
				BA4C28D77710A12F103F8C14AFC51DA2 /* Headers */,
			);
			buildRules = (
			);
			dependencies = (
				CB5C1DDD78A169406E280B00309A8BDF /* PBXTargetDependency */,
			);
			name = XYIAPKit;
			productName = XYIAPKit;
			productReference = 09F087CF34FA268F3350238A98FD5F22 /* XYIAPKit.framework */;
			productType = "com.apple.product-type.framework";
		};
		5C61C506FCDE0B96EA3ACE01BBDA2004 /* Pods-XYIAPKit_Example */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = FE3FF5EDFD8EE00CDE08D1BD60940FAB /* Build configuration list for PBXNativeTarget "Pods-XYIAPKit_Example" */;
			buildPhases = (
				B2BCFD9E5D4089C5BF64E86021B6AC1A /* Sources */,
				21D350EB95D3160E52755CC44D37336A /* Frameworks */,
				3A3ACFC50D255C7178E5814CB26830B1 /* Headers */,
			);
			buildRules = (
			);
			dependencies = (
				FFE3C2A5231C3AB9776AB44445A58AF0 /* PBXTargetDependency */,
				B33DC2E66CE1814BF0BC280054BA1131 /* PBXTargetDependency */,
			);
			name = "Pods-XYIAPKit_Example";
			productName = "Pods-XYIAPKit_Example";
			productReference = FED033A3212E7D1603232AED76FE0E97 /* Pods_XYIAPKit_Example.framework */;
			productType = "com.apple.product-type.framework";
		};
		C0774F21470BDBFFE195E55CCBCB18CD /* YYModel */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 0622F73CFD4C7E21BD1076372320CCB4 /* Build configuration list for PBXNativeTarget "YYModel" */;
			buildPhases = (
				5A8AC762D71950F42E40CF8BAE29D758 /* Sources */,
				B966B3AACD2B1AFE7A25ADBA691799ED /* Frameworks */,
				B382A2ED6B059D7355147875F936071E /* Headers */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = YYModel;
			productName = YYModel;
			productReference = 4315C1F8CA3D2875D29A8AC5D97BDFD1 /* YYModel.framework */;
			productType = "com.apple.product-type.framework";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		D41D8CD98F00B204E9800998ECF8427E /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 0830;
				LastUpgradeCheck = 0700;
			};
			buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */;
			compatibilityVersion = "Xcode 3.2";
			developmentRegion = English;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
			);
			mainGroup = 7DB346D0F39D3F0E887471402A8071AB;
			productRefGroup = F2B887FA5F6C6B51A743E04B103E62F8 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				5C61C506FCDE0B96EA3ACE01BBDA2004 /* Pods-XYIAPKit_Example */,
				44E07BE6285328DE74E7DFB2F59998CC /* Pods-XYIAPKit_Tests */,
				4ECD54A3EE5329BA3C267CC738C1FE18 /* XYIAPKit */,
				C0774F21470BDBFFE195E55CCBCB18CD /* YYModel */,
			);
		};
/* End PBXProject section */

/* Begin PBXSourcesBuildPhase section */
		566EF5D5FFB5F8AD441162E9902413FF /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BF26738274100CB6248BFDE882420650 /* Pods-XYIAPKit_Tests-dummy.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		5A8AC762D71950F42E40CF8BAE29D758 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				EF232F305F5CE9AD9EB2CCE712A8AB3F /* NSObject+YYModel.m in Sources */,
				5511B5013827AFC06D870B4A2D0DBC38 /* YYClassInfo.m in Sources */,
				1AC67C6EC7459FEF0084D64E321D8E25 /* YYModel-dummy.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B2BCFD9E5D4089C5BF64E86021B6AC1A /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				5A8FC916815B1902D70DFAC5EFF2C9E6 /* Pods-XYIAPKit_Example-dummy.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		DC1CB4D2E43301FD625914C50A59E3E9 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F0537418745BDDF25CBF6680797D2BA3 /* NSDate+XYStoreExtension.m in Sources */,
				4E7AB2B44F4052611A1E840DC2C1D3B5 /* NSNotification+XYStore.m in Sources */,
				54464427F27D9B1A5F9B9C328DC20C8E /* XYIAPKit-dummy.m in Sources */,
				F66472A6744CC5B45BE6D046F0FC8937 /* XYInAppReceipt.m in Sources */,
				D64FF4398E941C83EA6A2727B3EBDC7E /* XYiTunesReceipt.m in Sources */,
				0190CB2B09235A151B59F6B91A9FA50B /* XYiTunesResponse.m in Sources */,
				E90D78D14A0B9B2FBDDE5A6F59A8A1AC /* XYReceiptRefreshService.m in Sources */,
				4F991B13E9B467054AC5D017CFADD1B4 /* XYStore.m in Sources */,
				4EC0BD2033EE9ECB9F07929E0D6175AA /* XYStoreiTunesReceiptVerifier.m in Sources */,
				7501FF229371D018E3AA0B3E6F2CA8FA /* XYStoreKeychainPersistence.m in Sources */,
				77C79C6C0162A0905AC0C94B9A222B4D /* XYStoreProductService.m in Sources */,
				7DB356D00A46476249AAA408E82378CC /* XYStoreTransaction.m in Sources */,
				CCD9756310DD3335BE91BD8E5CC4C183 /* XYStoreUserDefaultsPersistence.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		B33DC2E66CE1814BF0BC280054BA1131 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = YYModel;
			target = C0774F21470BDBFFE195E55CCBCB18CD /* YYModel */;
			targetProxy = D5E546E2779D34CD7BE943AC6EA5EBAC /* PBXContainerItemProxy */;
		};
		CB5C1DDD78A169406E280B00309A8BDF /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = YYModel;
			target = C0774F21470BDBFFE195E55CCBCB18CD /* YYModel */;
			targetProxy = 4EE354A6739A8819E64CDA5BD279E18C /* PBXContainerItemProxy */;
		};
		FFE3C2A5231C3AB9776AB44445A58AF0 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = XYIAPKit;
			target = 4ECD54A3EE5329BA3C267CC738C1FE18 /* XYIAPKit */;
			targetProxy = 7EF4460EED0B05F16E7C608C644BB80D /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin XCBuildConfiguration section */
		201D6ADB48BE8E19C034ECD938798C69 /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 6515E9142A8C44450A68DFD3316814F5 /* Pods-XYIAPKit_Example.debug.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				INFOPLIST_FILE = "Target Support Files/Pods-XYIAPKit_Example/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MACH_O_TYPE = staticlib;
				MODULEMAP_FILE = "Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.modulemap";
				OTHER_LDFLAGS = "";
				OTHER_LIBTOOLFLAGS = "";
				PODS_ROOT = "$(SRCROOT)";
				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
				PRODUCT_NAME = Pods_XYIAPKit_Example;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				TARGETED_DEVICE_FAMILY = "1,2";
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Debug;
		};
		2B4A2119648244D65599A0E86589BFFA /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 5153F5F09CD668B257D6F37B774F3372 /* Pods-XYIAPKit_Tests.debug.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				INFOPLIST_FILE = "Target Support Files/Pods-XYIAPKit_Tests/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MACH_O_TYPE = staticlib;
				MODULEMAP_FILE = "Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.modulemap";
				OTHER_LDFLAGS = "";
				OTHER_LIBTOOLFLAGS = "";
				PODS_ROOT = "$(SRCROOT)";
				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
				PRODUCT_NAME = Pods_XYIAPKit_Tests;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				TARGETED_DEVICE_FAMILY = "1,2";
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Debug;
		};
		33DA7F43A1D2FA3C74A8C8FC246E1FA6 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGNING_REQUIRED = NO;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"POD_CONFIGURATION_DEBUG=1",
					"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.3;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				PRODUCT_NAME = "$(TARGET_NAME)";
				PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;
				STRIP_INSTALLED_PRODUCT = NO;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SYMROOT = "${SRCROOT}/../build";
			};
			name = Debug;
		};
		44D0A1E246DB2003E201E4DA0E8C11E0 /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 57685DF090E684F90ED838FAB8653BAD /* XYIAPKit.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREFIX_HEADER = "Target Support Files/XYIAPKit/XYIAPKit-prefix.pch";
				INFOPLIST_FILE = "Target Support Files/XYIAPKit/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MODULEMAP_FILE = "Target Support Files/XYIAPKit/XYIAPKit.modulemap";
				PRODUCT_NAME = XYIAPKit;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
				TARGETED_DEVICE_FAMILY = "1,2";
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Debug;
		};
		5F60B76B0319D4AF76C114EBA12223A1 /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 3155740A2FA1B48EB955100E2F67A552 /* Pods-XYIAPKit_Example.release.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				INFOPLIST_FILE = "Target Support Files/Pods-XYIAPKit_Example/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MACH_O_TYPE = staticlib;
				MODULEMAP_FILE = "Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.modulemap";
				OTHER_LDFLAGS = "";
				OTHER_LIBTOOLFLAGS = "";
				PODS_ROOT = "$(SRCROOT)";
				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
				PRODUCT_NAME = Pods_XYIAPKit_Example;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Release;
		};
		7201017C2625B36FDBD2126594F77939 /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 57685DF090E684F90ED838FAB8653BAD /* XYIAPKit.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREFIX_HEADER = "Target Support Files/XYIAPKit/XYIAPKit-prefix.pch";
				INFOPLIST_FILE = "Target Support Files/XYIAPKit/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MODULEMAP_FILE = "Target Support Files/XYIAPKit/XYIAPKit.modulemap";
				PRODUCT_NAME = XYIAPKit;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Release;
		};
		731DC216E1A58545B559F6E0A2418060 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGNING_REQUIRED = NO;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"POD_CONFIGURATION_RELEASE=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.3;
				MTL_ENABLE_DEBUG_INFO = NO;
				PRODUCT_NAME = "$(TARGET_NAME)";
				PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;
				STRIP_INSTALLED_PRODUCT = NO;
				SYMROOT = "${SRCROOT}/../build";
			};
			name = Release;
		};
		AC6D525A720795C9FE57D6E07833EF9A /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 8CFD8BFBAB73DBF02097DACCD0271C7C /* Pods-XYIAPKit_Tests.release.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				INFOPLIST_FILE = "Target Support Files/Pods-XYIAPKit_Tests/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MACH_O_TYPE = staticlib;
				MODULEMAP_FILE = "Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.modulemap";
				OTHER_LDFLAGS = "";
				OTHER_LIBTOOLFLAGS = "";
				PODS_ROOT = "$(SRCROOT)";
				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
				PRODUCT_NAME = Pods_XYIAPKit_Tests;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Release;
		};
		DE8E1EE8F87A58998D6817104D09B30B /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = C3C7EDE62C882DD4D17C9B00BAA0A454 /* YYModel.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch";
				INFOPLIST_FILE = "Target Support Files/YYModel/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MODULEMAP_FILE = "Target Support Files/YYModel/YYModel.modulemap";
				PRODUCT_NAME = YYModel;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
				TARGETED_DEVICE_FAMILY = "1,2";
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Debug;
		};
		F8B16E8C5DDAAD26471F157BA14D0B1E /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = C3C7EDE62C882DD4D17C9B00BAA0A454 /* YYModel.xcconfig */;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				CURRENT_PROJECT_VERSION = 1;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREFIX_HEADER = "Target Support Files/YYModel/YYModel-prefix.pch";
				INFOPLIST_FILE = "Target Support Files/YYModel/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MODULEMAP_FILE = "Target Support Files/YYModel/YYModel.modulemap";
				PRODUCT_NAME = YYModel;
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		0622F73CFD4C7E21BD1076372320CCB4 /* Build configuration list for PBXNativeTarget "YYModel" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				DE8E1EE8F87A58998D6817104D09B30B /* Debug */,
				F8B16E8C5DDAAD26471F157BA14D0B1E /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				33DA7F43A1D2FA3C74A8C8FC246E1FA6 /* Debug */,
				731DC216E1A58545B559F6E0A2418060 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		6D94804578581EA04C0E1BA4190A59DE /* Build configuration list for PBXNativeTarget "XYIAPKit" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				44D0A1E246DB2003E201E4DA0E8C11E0 /* Debug */,
				7201017C2625B36FDBD2126594F77939 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		AA305A28AD005A11A7111A786DD36650 /* Build configuration list for PBXNativeTarget "Pods-XYIAPKit_Tests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				2B4A2119648244D65599A0E86589BFFA /* Debug */,
				AC6D525A720795C9FE57D6E07833EF9A /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		FE3FF5EDFD8EE00CDE08D1BD60940FAB /* Build configuration list for PBXNativeTarget "Pods-XYIAPKit_Example" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				201D6ADB48BE8E19C034ECD938798C69 /* Debug */,
				5F60B76B0319D4AF76C114EBA12223A1 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
}


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleExecutable</key>
  <string>${EXECUTABLE_NAME}</string>
  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>${CURRENT_PROJECT_VERSION}</string>
  <key>NSPrincipalClass</key>
  <string></string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-acknowledgements.markdown
================================================
# Acknowledgements
This application makes use of the following third party libraries:

## XYIAPKit

Copyright (c) 2018 1073605877 <qichao.ma@quvideo.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.


## YYModel

The MIT License (MIT)

Copyright (c) 2015 ibireme <ibireme@gmail.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.


Generated by CocoaPods - https://cocoapods.org


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-acknowledgements.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>PreferenceSpecifiers</key>
	<array>
		<dict>
			<key>FooterText</key>
			<string>This application makes use of the following third party libraries:</string>
			<key>Title</key>
			<string>Acknowledgements</string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
		</dict>
		<dict>
			<key>FooterText</key>
			<string>Copyright (c) 2018 1073605877 &lt;qichao.ma@quvideo.com&gt;

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.
</string>
			<key>License</key>
			<string>MIT</string>
			<key>Title</key>
			<string>XYIAPKit</string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
		</dict>
		<dict>
			<key>FooterText</key>
			<string>The MIT License (MIT)

Copyright (c) 2015 ibireme &lt;ibireme@gmail.com&gt;

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.

</string>
			<key>License</key>
			<string>MIT</string>
			<key>Title</key>
			<string>YYModel</string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
		</dict>
		<dict>
			<key>FooterText</key>
			<string>Generated by CocoaPods - https://cocoapods.org</string>
			<key>Title</key>
			<string></string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
		</dict>
	</array>
	<key>StringsTable</key>
	<string>Acknowledgements</string>
	<key>Title</key>
	<string>Acknowledgements</string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-dummy.m
================================================
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_XYIAPKit_Example : NSObject
@end
@implementation PodsDummy_Pods_XYIAPKit_Example
@end


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-frameworks.sh
================================================
#!/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}"

# Used as a return value for each invocation of `strip_invalid_archs` function.
STRIP_BINARY_RETVAL=0

# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")

# Copies and strips a vendored framework
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="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"

  if [ -L "${source}" ]; then
      echo "Symlinked..."
      source="$(readlink "${source}")"
  fi

  # Use filter instead of exclude so missing patterns don't throw errors.
  echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
  rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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
}

# Copies and strips a vendored dSYM
install_dsym() {
  local source="$1"
  if [ -r "$source" ]; then
    # Copy the dSYM into a the targets temp dir.
    echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
    rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"

    local basename
    basename="$(basename -s .framework.dSYM "$source")"
    binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"

    # Strip invalid architectures so "fat" simulator / device frameworks work on device
    if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then
      strip_invalid_archs "$binary"
    fi

    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
      # Move the stripped file into its final destination.
      echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
      rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
    else
      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
      touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
    fi
  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}"
    local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'"

    if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
      code_sign_cmd="$code_sign_cmd &"
    fi
    echo "$code_sign_cmd"
    eval "$code_sign_cmd"
  fi
}

# Strip invalid architectures
strip_invalid_archs() {
  binary="$1"
  # Get architectures for current target binary
  binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
  # Intersect them with the architectures we are building for
  intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
  # If there are no archs supported by this binary then warn the user
  if [[ -z "$intersected_archs" ]]; then
    echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
    STRIP_BINARY_RETVAL=0
    return
  fi
  stripped=""
  for arch in $binary_archs; do
    if ! [[ "${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
  STRIP_BINARY_RETVAL=1
}


if [[ "$CONFIGURATION" == "Debug" ]]; then
  install_framework "${BUILT_PRODUCTS_DIR}/XYIAPKit/XYIAPKit.framework"
  install_framework "${BUILT_PRODUCTS_DIR}/YYModel/YYModel.framework"
fi
if [[ "$CONFIGURATION" == "Release" ]]; then
  install_framework "${BUILT_PRODUCTS_DIR}/XYIAPKit/XYIAPKit.framework"
  install_framework "${BUILT_PRODUCTS_DIR}/YYModel/YYModel.framework"
fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
  wait
fi


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-resources.sh
================================================
#!/bin/sh
set -e

mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"

RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
> "$RESOURCES_TO_COPY"

XCASSET_FILES=()

# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")

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"
    ;;
  3)
    TARGET_DEVICE_ARGS="--target-device tv"
    ;;
  4)
    TARGET_DEVICE_ARGS="--target-device watch"
    ;;
  *)
    TARGET_DEVICE_ARGS="--target-device mac"
    ;;
esac

install_resource()
{
  if [[ "$1" = /* ]] ; then
    RESOURCE_PATH="$1"
  else
    RESOURCE_PATH="${PODS_ROOT}/$1"
  fi
  if [[ ! -e "$RESOURCE_PATH" ]] ; then
    cat << EOM
error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
EOM
    exit 1
  fi
  case $RESOURCE_PATH in
    *.storyboard)
      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
      ;;
    *.xib)
      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
      ;;
    *.framework)
      echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
      mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
      echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
      rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
      ;;
    *.xcdatamodel)
      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true
      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
      ;;
    *.xcdatamodeld)
      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true
      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
      ;;
    *.xcmappingmodel)
      echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true
      xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
      ;;
    *.xcassets)
      ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
      XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
      ;;
    *)
      echo "$RESOURCE_PATH" || true
      echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
      ;;
  esac
}

mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_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
  # 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 != "${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 "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
fi


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-umbrella.h
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif


FOUNDATION_EXPORT double Pods_XYIAPKit_ExampleVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_XYIAPKit_ExampleVersionString[];



================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.debug.xcconfig
================================================
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit/XYIAPKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers"
OTHER_LDFLAGS = $(inherited) -framework "XYIAPKit" -framework "YYModel"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.modulemap
================================================
framework module Pods_XYIAPKit_Example {
  umbrella header "Pods-XYIAPKit_Example-umbrella.h"

  export *
  module * { export * }
}


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.release.xcconfig
================================================
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit/XYIAPKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers"
OTHER_LDFLAGS = $(inherited) -framework "XYIAPKit" -framework "YYModel"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleExecutable</key>
  <string>${EXECUTABLE_NAME}</string>
  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>${CURRENT_PROJECT_VERSION}</string>
  <key>NSPrincipalClass</key>
  <string></string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-acknowledgements.markdown
================================================
# Acknowledgements
This application makes use of the following third party libraries:
Generated by CocoaPods - https://cocoapods.org


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-acknowledgements.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>PreferenceSpecifiers</key>
	<array>
		<dict>
			<key>FooterText</key>
			<string>This application makes use of the following third party libraries:</string>
			<key>Title</key>
			<string>Acknowledgements</string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
		</dict>
		<dict>
			<key>FooterText</key>
			<string>Generated by CocoaPods - https://cocoapods.org</string>
			<key>Title</key>
			<string></string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
		</dict>
	</array>
	<key>StringsTable</key>
	<string>Acknowledgements</string>
	<key>Title</key>
	<string>Acknowledgements</string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-dummy.m
================================================
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_XYIAPKit_Tests : NSObject
@end
@implementation PodsDummy_Pods_XYIAPKit_Tests
@end


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-frameworks.sh
================================================
#!/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}"

# Used as a return value for each invocation of `strip_invalid_archs` function.
STRIP_BINARY_RETVAL=0

# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")

# Copies and strips a vendored framework
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="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"

  if [ -L "${source}" ]; then
      echo "Symlinked..."
      source="$(readlink "${source}")"
  fi

  # Use filter instead of exclude so missing patterns don't throw errors.
  echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
  rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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
}

# Copies and strips a vendored dSYM
install_dsym() {
  local source="$1"
  if [ -r "$source" ]; then
    # Copy the dSYM into a the targets temp dir.
    echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
    rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"

    local basename
    basename="$(basename -s .framework.dSYM "$source")"
    binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"

    # Strip invalid architectures so "fat" simulator / device frameworks work on device
    if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then
      strip_invalid_archs "$binary"
    fi

    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
      # Move the stripped file into its final destination.
      echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
      rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
    else
      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
      touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
    fi
  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}"
    local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'"

    if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
      code_sign_cmd="$code_sign_cmd &"
    fi
    echo "$code_sign_cmd"
    eval "$code_sign_cmd"
  fi
}

# Strip invalid architectures
strip_invalid_archs() {
  binary="$1"
  # Get architectures for current target binary
  binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
  # Intersect them with the architectures we are building for
  intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
  # If there are no archs supported by this binary then warn the user
  if [[ -z "$intersected_archs" ]]; then
    echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
    STRIP_BINARY_RETVAL=0
    return
  fi
  stripped=""
  for arch in $binary_archs; do
    if ! [[ "${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
  STRIP_BINARY_RETVAL=1
}

if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
  wait
fi


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-resources.sh
================================================
#!/bin/sh
set -e

mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"

RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
> "$RESOURCES_TO_COPY"

XCASSET_FILES=()

# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")

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"
    ;;
  3)
    TARGET_DEVICE_ARGS="--target-device tv"
    ;;
  4)
    TARGET_DEVICE_ARGS="--target-device watch"
    ;;
  *)
    TARGET_DEVICE_ARGS="--target-device mac"
    ;;
esac

install_resource()
{
  if [[ "$1" = /* ]] ; then
    RESOURCE_PATH="$1"
  else
    RESOURCE_PATH="${PODS_ROOT}/$1"
  fi
  if [[ ! -e "$RESOURCE_PATH" ]] ; then
    cat << EOM
error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
EOM
    exit 1
  fi
  case $RESOURCE_PATH in
    *.storyboard)
      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
      ;;
    *.xib)
      echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
      ;;
    *.framework)
      echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
      mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
      echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
      rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
      ;;
    *.xcdatamodel)
      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true
      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
      ;;
    *.xcdatamodeld)
      echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true
      xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
      ;;
    *.xcmappingmodel)
      echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true
      xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
      ;;
    *.xcassets)
      ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
      XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
      ;;
    *)
      echo "$RESOURCE_PATH" || true
      echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
      ;;
  esac
}

mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_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
  # 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 != "${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 "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
fi


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-umbrella.h
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif


FOUNDATION_EXPORT double Pods_XYIAPKit_TestsVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_XYIAPKit_TestsVersionString[];



================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.debug.xcconfig
================================================
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit/XYIAPKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.modulemap
================================================
framework module Pods_XYIAPKit_Tests {
  umbrella header "Pods-XYIAPKit_Tests-umbrella.h"

  export *
  module * { export * }
}


================================================
FILE: Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.release.xcconfig
================================================
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit/XYIAPKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods


================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleExecutable</key>
  <string>${EXECUTABLE_NAME}</string>
  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>0.8.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>${CURRENT_PROJECT_VERSION}</string>
  <key>NSPrincipalClass</key>
  <string></string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/ResourceBundle-XYIAPKit-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>BNDL</string>
  <key>CFBundleShortVersionString</key>
  <string>0.4.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1</string>
  <key>NSPrincipalClass</key>
  <string></string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/XYIAPKit-dummy.m
================================================
#import <Foundation/Foundation.h>
@interface PodsDummy_XYIAPKit : NSObject
@end
@implementation PodsDummy_XYIAPKit
@end


================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/XYIAPKit-prefix.pch
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif



================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/XYIAPKit-umbrella.h
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

#import "XYIAPKit.h"
#import "NSNotification+XYStore.h"
#import "XYReceiptRefreshService.h"
#import "XYStore.h"
#import "XYStoreProductService.h"
#import "XYStoreProtocol.h"
#import "XYStoreKeychainPersistence.h"
#import "XYStoreTransaction.h"
#import "XYStoreUserDefaultsPersistence.h"
#import "NSDate+XYStoreExtension.h"
#import "XYInAppReceipt.h"
#import "XYiTunesReceipt.h"
#import "XYiTunesResponse.h"
#import "XYStoreiTunesReceiptVerifier.h"

FOUNDATION_EXPORT double XYIAPKitVersionNumber;
FOUNDATION_EXPORT const unsigned char XYIAPKitVersionString[];



================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/XYIAPKit.modulemap
================================================
framework module XYIAPKit {
  umbrella header "XYIAPKit-umbrella.h"

  export *
  module * { export * }
}


================================================
FILE: Example/Pods/Target Support Files/XYIAPKit/XYIAPKit.xcconfig
================================================
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/YYModel"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
OTHER_LDFLAGS = -framework "Security" -framework "StoreKit"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../..
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES


================================================
FILE: Example/Pods/Target Support Files/YYModel/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleExecutable</key>
  <string>${EXECUTABLE_NAME}</string>
  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0.4</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>${CURRENT_PROJECT_VERSION}</string>
  <key>NSPrincipalClass</key>
  <string></string>
</dict>
</plist>


================================================
FILE: Example/Pods/Target Support Files/YYModel/YYModel-dummy.m
================================================
#import <Foundation/Foundation.h>
@interface PodsDummy_YYModel : NSObject
@end
@implementation PodsDummy_YYModel
@end


================================================
FILE: Example/Pods/Target Support Files/YYModel/YYModel-prefix.pch
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif



================================================
FILE: Example/Pods/Target Support Files/YYModel/YYModel-umbrella.h
================================================
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

#import "NSObject+YYModel.h"
#import "YYClassInfo.h"
#import "YYModel.h"

FOUNDATION_EXPORT double YYModelVersionNumber;
FOUNDATION_EXPORT const unsigned char YYModelVersionString[];



================================================
FILE: Example/Pods/Target Support Files/YYModel/YYModel.modulemap
================================================
framework module YYModel {
  umbrella header "YYModel-umbrella.h"

  export *
  module * { export * }
}


================================================
FILE: Example/Pods/Target Support Files/YYModel/YYModel.xcconfig
================================================
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/YYModel
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
OTHER_LDFLAGS = -framework "CoreFoundation" -framework "Foundation"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/YYModel
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES


================================================
FILE: Example/Pods/YYModel/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 ibireme <ibireme@gmail.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.



================================================
FILE: Example/Pods/YYModel/README.md
================================================
YYModel
==============

[![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://raw.githubusercontent.com/ibireme/YYModel/master/LICENSE)&nbsp;
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)&nbsp;
[![CocoaPods](http://img.shields.io/cocoapods/v/YYModel.svg?style=flat)](http://cocoapods.org/?q= YYModel)&nbsp;
[![CocoaPods](http://img.shields.io/cocoapods/p/YYModel.svg?style=flat)](http://cocoapods.org/?q= YYModel)&nbsp;
[![Build Status](https://travis-ci.org/ibireme/YYModel.svg?branch=master)](https://travis-ci.org/ibireme/YYModel)&nbsp;
[![codecov.io](https://codecov.io/github/ibireme/YYModel/coverage.svg?branch=master)](https://codecov.io/github/ibireme/YYModel?branch=master)

High performance model framework for iOS/OSX.<br/>
(It's a component of [YYKit](https://github.com/ibireme/YYKit))


Performance
==============

Time cost (process GithubUser 10000 times on iPhone 6):

![Benchmark result](https://raw.github.com/ibireme/YYModel/master/Benchmark/Result.png
)

See `Benchmark/ModelBenchmark.xcodeproj` for more benchmark case.


Features
==============
- **High performance**: The conversion performance is close to handwriting code.
- **Automatic type conversion**: The object types can be automatically converted.
- **Type Safe**: All data types will be verified to ensure type-safe during the conversion process.
- **Non-intrusive**: There is no need to make the model class inherit from other base class.
- **Lightwight**: This library contains only 5 files.
- **Docs and unit testing**: 100% docs coverage, 99.6% code coverage.

Usage
==============

###Simple model json convert

	// JSON:
	{
	    "uid":123456,
	    "name":"Harry",
	    "created":"1965-07-31T00:00:00+0000"
	}

	// Model:
	@interface User : NSObject
	@property UInt64 uid;
	@property NSString *name;
	@property NSDate *created;
	@end
	@implementation User
	@end

	
	// Convert json to model:
	User *user = [User yy_modelWithJSON:json];
	
	// Convert model to json:
	NSDictionary *json = [user yy_modelToJSONObject];


If the type of an object in JSON/Dictionary cannot be matched to the property of the model, the following automatic conversion is performed. If the automatic conversion failed, the value will be ignored.
<table>
  <thead>
    <tr>
      <th>JSON/Dictionary</th>
      <th>Model</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>NSString</td>
      <td>NSNumber,NSURL,SEL,Class</td>
    </tr>
    <tr>
      <td>NSNumber</td>
      <td>NSString</td>
    </tr>
    <tr>
      <td>NSString/NSNumber</td>
      <td>C number (BOOL,int,float,NSUInteger,UInt64,...)<br/>
      NaN and Inf will be ignored</td>
    </tr>
    <tr>
      <td>NSString</td>
      <td>NSDate parsed with these formats:<br/>
      yyyy-MM-dd<br/>
yyyy-MM-dd HH:mm:ss<br/>
yyyy-MM-dd'T'HH:mm:ss<br/>
yyyy-MM-dd'T'HH:mm:ssZ<br/>
EEE MMM dd HH:mm:ss Z yyyy
      </td>
    </tr>
    <tr>
      <td>NSDate</td>
      <td>NSString formatted with ISO8601:<br/>
      "YYYY-MM-dd'T'HH:mm:ssZ"</td>
    </tr>
    <tr>
      <td>NSValue</td>
      <td>struct (CGRect,CGSize,...)</td>
    </tr>
    <tr>
      <td>NSNull</td>
      <td>nil,0</td>
    </tr>
    <tr>
      <td>"no","false",...</td>
      <td>@(NO),0</td>
    </tr>
    <tr>
      <td>"yes","true",...</td>
      <td>@(YES),1</td>
    </tr>
  </tbody>
</table>



###Match model property to different JSON key

	// JSON:
	{
	    "n":"Harry Pottery",
	    "p": 256,
	    "ext" : {
	        "desc" : "A book written by J.K.Rowing."
	    },
	    "ID" : 100010
	}

	// Model:
	@interface Book : NSObject
	@property NSString *name;
	@property NSInteger page;
	@property NSString *desc;
	@property NSString *bookID;
	@end
	@implementation Book
	+ (NSDictionary *)modelCustomPropertyMapper {
	    return @{@"name" : @"n",
	             @"page" : @"p",
	             @"desc" : @"ext.desc",
	             @"bookID" : @[@"id",@"ID",@"book_id"]};
	}
	@end

You can map a json key (key path) or an array of json key (key path) to one or multiple property name. If there's no mapper for a property, it will use the property's name as default.

###Nested model

	// JSON
	{
	    "author":{
	        "name":"J.K.Rowling",
	        "birthday":"1965-07-31T00:00:00+0000"
	    },
	    "name":"Harry Potter",
	    "pages":256
	}

	// Model: (no need to do anything)
	@interface Author : NSObject
	@property NSString *name;
	@property NSDate *birthday;
	@end
	@implementation Author
	@end
	
	@interface Book : NSObject
	@property NSString *name;
	@property NSUInteger pages;
	@property Author *author;
	@end
	@implementation Book
	@end
	
	

### Container property

	@class Shadow, Border, Attachment;

	@interface Attributes
	@property NSString *name;
	@property NSArray *shadows; //Array<Shadow>
	@property NSSet *borders; //Set<Border>
	@property NSMutableDictionary *attachments; //Dict<NSString,Attachment>
	@end

	@implementation Attributes
	+ (NSDictionary *)modelContainerPropertyGenericClass {
		// value should be Class or Class name.
	    return @{@"shadows" : [Shadow class],
	             @"borders" : Border.class,
	             @"attachments" : @"Attachment" };
	}
	@end




### Whitelist and blacklist

	@interface User
	@property NSString *name;
	@property NSUInteger age;
	@end
	
	@implementation Attributes
	+ (NSArray *)modelPropertyBlacklist {
	    return @[@"test1", @"test2"];
	}
	+ (NSArray *)modelPropertyWhitelist {
	    return @[@"name"];
	}
	@end

###Data validate and custom transform
	
	// JSON:
	{
		"name":"Harry",
		"timestamp" : 1445534567
	}
	
	// Model:
	@interface User
	@property NSString *name;
	@property NSDate *createdAt;
	@end

	@implementation User
	- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
	    NSNumber *timestamp = dic[@"timestamp"];
	    if (![timestamp isKindOfClass:[NSNumber class]]) return NO;
	    _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];
	    return YES;
	}
	- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {
	    if (!_createdAt) return NO;
	    dic[@"timestamp"] = @(n.timeIntervalSince1970);
	    return YES;
	}
	@end

###Coding/Copying/hash/equal/description

	@interface YYShadow :NSObject <NSCoding, NSCopying>
	@property (nonatomic, copy) NSString *name;
	@property (nonatomic, assign) CGSize size;
	@end

	@implementation YYShadow
	- (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; }
	- (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; return [self yy_modelInitWithCoder:aDecoder]; }
	- (id)copyWithZone:(NSZone *)zone { return [self yy_modelCopy]; }
	- (NSUInteger)hash { return [self yy_modelHash]; }
	- (BOOL)isEqual:(id)object { return [self yy_modelIsEqual:object]; }
	- (NSString *)description { return [self yy_modelDescription]; }
	@end


Installation
==============

### CocoaPods

1. Add `pod 'YYModel'` to your Podfile.
2. Run `pod install` or `pod update`.
3. Import \<YYModel/YYModel.h\>.


### Carthage

1. Add `github "ibireme/YYModel"` to your Cartfile.
2. Run `carthage update --platform ios` and add the framework to your project.
3. Import \<YYModel/YYModel.h\>.


### Manually

1. Download all the files in the YYModel subdirectory.
2. Add the source files to your Xcode project.
3. Import `YYModel.h`.


Documentation
==============
Full API documentation is available on [CocoaDocs](http://cocoadocs.org/docsets/YYModel/).<br/>
You can also install documentation locally using [appledoc](https://github.com/tomaz/appledoc).


Requirements
==============
This library requires `iOS 6.0+` and `Xcode 7.0+`.


License
==============
YYModel is provided under the MIT license. See LICENSE file for details.


<br/><br/>
---
中文介绍
==============
高性能 iOS/OSX 模型转换框架。<br/>
(该项目是 [YYKit](https://github.com/ibireme/YYKit) 组件之一)


性能
==============
处理 GithubUser 数据 10000 次耗时统计 (iPhone 6):

![Benchmark result](https://raw.github.com/ibireme/YYModel/master/Benchmark/Result.png
)

更多测试代码和用例见 `Benchmark/ModelBenchmark.xcodeproj`。


特性
==============
- **高性能**: 模型转换性能接近手写解析代码。
- **自动类型转换**: 对象类型可以自动转换,详情见下方表格。
- **类型安全**: 转换过程中,所有的数据类型都会被检测一遍,以保证类型安全,避免崩溃问题。
- **无侵入性**: 模型无需继承自其他基类。
- **轻量**: 该框架只有 5 个文件 (包括.h文件)。
- **文档和单元测试**: 文档覆盖率100%, 代码覆盖率99.6%。

使用方法
==============

###简单的 Model 与 JSON 相互转换

	// JSON:
	{
	    "uid":123456,
	    "name":"Harry",
	    "created":"1965-07-31T00:00:00+0000"
	}

	// Model:
	@interface User : NSObject
	@property UInt64 uid;
	@property NSString *name;
	@property NSDate *created;
	@end
	@implementation User
	@end

	
	// 将 JSON (NSData,NSString,NSDictionary) 转换为 Model:
	User *user = [User yy_modelWithJSON:json];
	
	// 将 Model 转换为 JSON 对象:
	NSDictionary *json = [user yy_modelToJSONObject];

当 JSON/Dictionary 中的对象类型与 Model 属性不一致时,YYModel 将会进行如下自动转换。自动转换不支持的值将会被忽略,以避免各种潜在的崩溃问题。
<table>
  <thead>
    <tr>
      <th>JSON/Dictionary</th>
      <th>Model</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>NSString</td>
      <td>NSNumber,NSURL,SEL,Class</td>
    </tr>
    <tr>
      <td>NSNumber</td>
      <td>NSString</td>
    </tr>
    <tr>
      <td>NSString/NSNumber</td>
      <td>基础类型 (BOOL,int,float,NSUInteger,UInt64,...)<br/>
      NaN 和 Inf 会被忽略</td>
    </tr>
    <tr>
      <td>NSString</td>
      <td>NSDate 以下列格式解析:<br/>
      yyyy-MM-dd<br/>
yyyy-MM-dd HH:mm:ss<br/>
yyyy-MM-dd'T'HH:mm:ss<br/>
yyyy-MM-dd'T'HH:mm:ssZ<br/>
EEE MMM dd HH:mm:ss Z yyyy
      </td>
    </tr>
    <tr>
      <td>NSDate</td>
      <td>NSString 格式化为 ISO8601:<br/>
      "YYYY-MM-dd'T'HH:mm:ssZ"</td>
    </tr>
    <tr>
      <td>NSValue</td>
      <td>struct (CGRect,CGSize,...)</td>
    </tr>
    <tr>
      <td>NSNull</td>
      <td>nil,0</td>
    </tr>
    <tr>
      <td>"no","false",...</td>
      <td>@(NO),0</td>
    </tr>
    <tr>
      <td>"yes","true",...</td>
      <td>@(YES),1</td>
    </tr>
  </tbody>
</table>


###Model 属性名和 JSON 中的 Key 不相同

	// JSON:
	{
	    "n":"Harry Pottery",
	    "p": 256,
	    "ext" : {
	        "desc" : "A book written by J.K.Rowing."
	    },
	    "ID" : 100010
	}

	// Model:
	@interface Book : NSObject
	@property NSString *name;
	@property NSInteger page;
	@property NSString *desc;
	@property NSString *bookID;
	@end
	@implementation Book
	//返回一个 Dict,将 Model 属性名对映射到 JSON 的 Key。
	+ (NSDictionary *)modelCustomPropertyMapper {
	    return @{@"name" : @"n",
	             @"page" : @"p",
	             @"desc" : @"ext.desc",
	             @"bookID" : @[@"id",@"ID",@"book_id"]};
	}
	@end
	
你可以把一个或一组 json key (key path) 映射到一个或多个属性。如果一个属性没有映射关系,那默认会使用相同属性名作为映射。

在 json->model 的过程中:如果一个属性对应了多个 json key,那么转换过程会按顺序查找,并使用第一个不为空的值。
	
在 model->json 的过程中:如果一个属性对应了多个 json key (key path),那么转换过程仅会处理第一个 json key (key path);如果多个属性对应了同一个 json key,则转换过过程会使用其中任意一个不为空的值。

###Model 包含其他 Model

	// JSON
	{
	    "author":{
	        "name":"J.K.Rowling",
	        "birthday":"1965-07-31T00:00:00+0000"
	    },
	    "name":"Harry Potter",
	    "pages":256
	}

	// Model: 什么都不用做,转换会自动完成
	@interface Author : NSObject
	@property NSString *name;
	@property NSDate *birthday;
	@end
	@implementation Author
	@end
	
	@interface Book : NSObject
	@property NSString *name;
	@property NSUInteger pages;
	@property Author *author; //Book 包含 Author 属性
	@end
	@implementation Book
	@end
	
	

###容器类属性

	@class Shadow, Border, Attachment;

	@interface Attributes
	@property NSString *name;
	@property NSArray *shadows; //Array<Shadow>
	@property NSSet *borders; //Set<Border>
	@property NSMutableDictionary *attachments; //Dict<NSString,Attachment>
	@end

	@implementation Attributes
	// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。
	+ (NSDictionary *)modelContainerPropertyGenericClass {
	    return @{@"shadows" : [Shadow class],
	             @"borders" : Border.class,
	             @"attachments" : @"Attachment" };
	}
	@end




###黑名单与白名单

	@interface User
	@property NSString *name;
	@property NSUInteger age;
	@end
	
	@implementation Attributes
	// 如果实现了该方法,则处理过程中会忽略该列表内的所有属性
	+ (NSArray *)modelPropertyBlacklist {
	    return @[@"test1", @"test2"];
	}
	// 如果实现了该方法,则处理过程中不会处理该列表外的属性。
	+ (NSArray *)modelPropertyWhitelist {
	    return @[@"name"];
	}
	@end

###数据校验与自定义转换
	
	// JSON:
	{
		"name":"Harry",
		"timestamp" : 1445534567
	}
	
	// Model:
	@interface User
	@property NSString *name;
	@property NSDate *createdAt;
	@end

	@implementation User
	// 当 JSON 转为 Model 完成后,该方法会被调用。
	// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。
	// 你也可以在这里做一些自动转换不能完成的工作。
	- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
	    NSNumber *timestamp = dic[@"timestamp"];
	    if (![timestamp isKindOfClass:[NSNumber class]]) return NO;
	    _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];
	    return YES;
	}
	
	// 当 Model 转为 JSON 完成后,该方法会被调用。
	// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。
	// 你也可以在这里做一些自动转换不能完成的工作。
	- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {
	    if (!_createdAt) return NO;
	    dic[@"timestamp"] = @(n.timeIntervalSince1970);
	    return YES;
	}
	@end

###Coding/Copying/hash/equal/description

	@interface YYShadow :NSObject <NSCoding, NSCopying>
	@property (nonatomic, copy) NSString *name;
	@property (nonatomic, assign) CGSize size;
	@end

	@implementation YYShadow
	// 直接添加以下代码即可自动完成
	- (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; }
	- (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; return [self yy_modelInitWithCoder:aDecoder]; }
	- (id)copyWithZone:(NSZone *)zone { return [self yy_modelCopy]; }
	- (NSUInteger)hash { return [self yy_modelHash]; }
	- (BOOL)isEqual:(id)object { return [self yy_modelIsEqual:object]; }
	- (NSString *)description { return [self yy_modelDescription]; }
	@end


安装
==============

### CocoaPods

1. 在 Podfile 中添加 `pod 'YYModel'`。
2. 执行 `pod install` 或 `pod update`。
3. 导入 \<YYModel/YYModel.h\>。


### Carthage

1. 在 Cartfile 中添加 `github "ibireme/YYModel"`。
2. 执行 `carthage update --platform ios` 并将生成的 framework 添加到你的工程。
3. 导入 \<YYModel/YYModel.h\>。


### 手动安装

1. 下载 YYModel 文件夹内的所有内容。
2. 将 YYModel 内的源文件添加(拖放)到你的工程。
3. 导入 `YYModel.h`。


文档
==============
你可以在 [CocoaDocs](http://cocoadocs.org/docsets/YYModel/) 查看在线 API 文档,也可以用 [appledoc](https://github.com/tomaz/appledoc) 本地生成文档。


系统要求
==============
该项目最低支持 `iOS 6.0` 和 `Xcode 7.0`。


许可证
==============
YYModel 使用 MIT 许可证,详情见 LICENSE 文件。

相关链接
==============

[iOS JSON 模型转换库评测](http://blog.ibireme.com/2015/10/23/ios_model_framework_benchmark/)



================================================
FILE: Example/Pods/YYModel/YYModel/NSObject+YYModel.h
================================================
//
//  NSObject+YYModel.h
//  YYModel <https://github.com/ibireme/YYModel>
//
//  Created by ibireme on 15/5/10.
//  Copyright (c) 2015 ibireme.
//
//  This source code is licensed under the MIT-style license found in the
//  LICENSE file in the root directory of this source tree.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 Provide some data-model method:
 
 * Convert json to any object, or convert any object to json.
 * Set object properties with a key-value dictionary (like KVC).
 * Implementations of `NSCoding`, `NSCopying`, `-hash` and `-isEqual:`.
 
 See `YYModel` protocol for custom methods.
 
 
 Sample Code:
    
     ********************** json convertor *********************
     @interface YYAuthor : NSObject
     @property (nonatomic, strong) NSString *name;
     @property (nonatomic, assign) NSDate *birthday;
     @end
     @implementation YYAuthor
     @end
 
     @interface YYBook : NSObject
     @property (nonatomic, copy) NSString *name;
     @property (nonatomic, assign) NSUInteger pages;
     @property (nonatomic, strong) YYAuthor *author;
     @end
     @implementation YYBook
     @end
    
     int main() {
         // create model from json
         YYBook *book = [YYBook yy_modelWithJSON:@"{\"name\": \"Harry Potter\", \"pages\": 256, \"author\": {\"name\": \"J.K.Rowling\", \"birthday\": \"1965-07-31\" }}"];
 
         // convert model to json
         NSString *json = [book yy_modelToJSONString];
         // {"author":{"name":"J.K.Rowling","birthday":"1965-07-31T00:00:00+0000"},"name":"Harry Potter","pages":256}
     }
 
     ********************** Coding/Copying/hash/equal *********************
     @interface YYShadow :NSObject <NSCoding, NSCopying>
     @property (nonatomic, copy) NSString *name;
     @property (nonatomic, assign) CGSize size;
     @end
 
     @implementation YYShadow
     - (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; }
     - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; return [self yy_modelInitWithCoder:aDecoder]; }
     - (id)copyWithZone:(NSZone *)zone { return [self yy_modelCopy]; }
     - (NSUInteger)hash { return [self yy_modelHash]; }
     - (BOOL)isEqual:(id)object { return [self yy_modelIsEqual:object]; }
     @end
 
 */
@interface NSObject (YYModel)

/**
 Creates and returns a new instance of the receiver from a json.
 This method is thread-safe.
 
 @param json  A json object in `NSDictionary`, `NSString` or `NSData`.
 
 @return A new instance created from the json, or nil if an error occurs.
 */
+ (nullable instancetype)yy_modelWithJSON:(id)json;

/**
 Creates and returns a new instance of the receiver from a key-value dictionary.
 This method is thread-safe.
 
 @param dictionary  A key-value dictionary mapped to the instance's properties.
 Any invalid key-value pair in dictionary will be ignored.
 
 @return A new instance created from the dictionary, or nil if an error occurs.
 
 @discussion The key in `dictionary` will mapped to the reciever's property name,
 and the value will set to the property. If the value's type does not match the
 property, this method will try to convert the value based on these rules:
 
     `NSString` or `NSNumber` -> c number, such as BOOL, int, long, float, NSUInteger...
     `NSString` -> NSDate, parsed with format "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd HH:mm:ss" or "yyyy-MM-dd".
     `NSString` -> NSURL.
     `NSValue` -> struct or union, such as CGRect, CGSize, ...
     `NSString` -> SEL, Class.
 */
+ (nullable instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary;

/**
 Set the receiver's properties with a json object.
 
 @discussion Any invalid data in json will be ignored.
 
 @param json  A json object of `NSDictionary`, `NSString` or `NSData`, mapped to the
 receiver's properties.
 
 @return Whether succeed.
 */
- (BOOL)yy_modelSetWithJSON:(id)json;

/**
 Set the receiver's properties with a key-value dictionary.
 
 @param dic  A key-value dictionary mapped to the receiver's properties.
 Any invalid key-value pair in dictionary will be ignored.
 
 @discussion The key in `dictionary` will mapped to the reciever's property name,
 and the value will set to the property. If the value's type doesn't match the
 property, this method will try to convert the value based on these rules:
 
     `NSString`, `NSNumber` -> c number, such as BOOL, int, long, float, NSUInteger...
     `NSString` -> NSDate, parsed with format "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd HH:mm:ss" or "yyyy-MM-dd".
     `NSString` -> NSURL.
     `NSValue` -> struct or union, such as CGRect, CGSize, ...
     `NSString` -> SEL, Class.
 
 @return Whether succeed.
 */
- (BOOL)yy_modelSetWithDictionary:(NSDictionary *)dic;

/**
 Generate a json object from the receiver's properties.
 
 @return A json object in `NSDictionary` or `NSArray`, or nil if an error occurs.
 See [NSJSONSerialization isValidJSONObject] for more information.
 
 @discussion Any of the invalid property is ignored.
 If the reciver is `NSArray`, `NSDictionary` or `NSSet`, it just convert
 the inner object to json object.
 */
- (nullable id)yy_modelToJSONObject;

/**
 Generate a json string's data from the receiver's properties.
 
 @return A json string's data, or nil if an error occurs.
 
 @discussion Any of the invalid property is ignored.
 If the reciver is `NSArray`, `NSDictionary` or `NSSet`, it will also convert the 
 inner object to json string.
 */
- (nullable NSData *)yy_modelToJSONData;

/**
 Generate a json string from the receiver's properties.
 
 @return A json string, or nil if an error occurs.
 
 @discussion Any of the invalid property is ignored.
 If the reciver is `NSArray`, `NSDictionary` or `NSSet`, it will also convert the 
 inner object to json string.
 */
- (nullable NSString *)yy_modelToJSONString;

/**
 Copy a instance with the receiver's properties.
 
 @return A copied instance, or nil if an error occurs.
 */
- (nullable id)yy_modelCopy;

/**
 Encode the receiver's properties to a coder.
 
 @param aCoder  An archiver object.
 */
- (void)yy_modelEncodeWithCoder:(NSCoder *)aCoder;

/**
 Decode the receiver's properties from a decoder.
 
 @param aDecoder  An archiver object.
 
 @return self
 */
- (id)yy_modelInitWithCoder:(NSCoder *)aDecoder;

/**
 Get a hash code with the receiver's properties.
 
 @return Hash code.
 */
- (NSUInteger)yy_modelHash;

/**
 Compares the receiver with another object for equality, based on properties.
 
 @param model  Another object.
 
 @return `YES` if the reciever is equal to the object, otherwise `NO`.
 */
- (BOOL)yy_modelIsEqual:(id)model;

/**
 Description method for debugging purposes based on properties.
 
 @return A string that describes the contents of the receiver.
 */
- (NSString *)yy_modelDescription;

@end



/**
 Provide some data-model method for NSArray.
 */
@interface NSArray (YYModel)

/**
 Creates and returns an array from a json-array.
 This method is thread-safe.
 
 @param cls  The instance's class in array.
 @param json  A json array of `NSArray`, `NSString` or `NSData`.
              Example: [{"name","Mary"},{name:"Joe"}]
 
 @return A array, or nil if an error occurs.
 */
+ (nullable NSArray *)yy_modelArrayWithClass:(Class)cls json:(id)json;

@end



/**
 Provide some data-model method for NSDictionary.
 */
@interface NSDictionary (YYModel)

/**
 Creates and returns a dictionary from a json.
 This method is thread-safe.
 
 @param cls  The value instance's class in dictionary.
 @param json  A json dictionary of `NSDictionary`, `NSString` or `NSData`.
              Example: {"user1":{"name","Mary"}, "user2": {name:"Joe"}}
 
 @return A dictionary, or nil if an error occurs.
 */
+ (nullable NSDictionary *)yy_modelDictionaryWithClass:(Class)cls json:(id)json;
@end



/**
 If the default model transform does not fit to your model class, implement one or
 more method in this protocol to change the default key-value transform process.
 There's no need to add '<YYModel>' to your class header.
 */
@protocol YYModel <NSObject>
@optional

/**
 Custom property mapper.
 
 @discussion If the key in JSON/Dictionary does not match to the model's property name,
 implements this method and returns the additional mapper.
 
 Example:
    
    json: 
        {
            "n":"Harry Pottery",
            "p": 256,
            "ext" : {
                "desc" : "A book written by J.K.Rowling."
            },
            "ID" : 100010
        }
 
    model:
        @interface YYBook : NSObject
        @property NSString *name;
        @property NSInteger page;
        @property NSString *desc;
        @property NSString *bookID;
        @end
        
        @implementation YYBook
        + (NSDictionary *)modelCustomPropertyMapper {
            return @{@"name"  : @"n",
                     @"page"  : @"p",
                     @"desc"  : @"ext.desc",
                     @"bookID": @[@"id", @"ID", @"book_id"]};
        }
        @end
 
 @return A custom mapper for properties.
 */
+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;

/**
 The generic class mapper for container properties.
 
 @discussion If the property is a container object, such as NSArray/NSSet/NSDictionary,
 implements this method and returns a property->class mapper, tells which kind of 
 object will be add to the array/set/dictionary.
 
  Example:
        @class YYShadow, YYBorder, YYAttachment;
 
        @interface YYAttributes
        @property NSString *name;
        @property NSArray *shadows;
        @property NSSet *borders;
        @property NSDictionary *attachments;
        @end
 
        @implementation YYAttributes
        + (NSDictionary *)modelContainerPropertyGenericClass {
            return @{@"shadows" : [YYShadow class],
                     @"borders" : YYBorder.class,
                     @"attachments" : @"YYAttachment" };
        }
        @end
 
 @return A class mapper.
 */
+ (nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;

/**
 If you need to create instances of different classes during json->object transform,
 use the method to choose custom class based on dictionary data.
 
 @discussion If the model implements this method, it will be called to determine resulting class
 during `+modelWithJSON:`, `+modelWithDictionary:`, conveting object of properties of parent objects 
 (both singular and containers via `+modelContainerPropertyGenericClass`).
 
 Example:
        @class YYCircle, YYRectangle, YYLine;
 
        @implementation YYShape

        + (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {
            if (dictionary[@"radius"] != nil) {
                return [YYCircle class];
            } else if (dictionary[@"width"] != nil) {
                return [YYRectangle class];
            } else if (dictionary[@"y2"] != nil) {
                return [YYLine class];
            } else {
                return [self class];
            }
        }

        @end

 @param dictionary The json/kv dictionary.
 
 @return Class to create from this dictionary, `nil` to use current class.

 */
+ (nullable Class)modelCustomClassForDictionary:(NSDictionary *)dictionary;

/**
 All the properties in blacklist will be ignored in model transform process.
 Returns nil to ignore this feature.
 
 @return An array of property's name.
 */
+ (nullable NSArray<NSString *> *)modelPropertyBlacklist;

/**
 If a property is not in the whitelist, it will be ignored in model transform process.
 Returns nil to ignore this feature.
 
 @return An array of property's name.
 */
+ (nullable NSArray<NSString *> *)modelPropertyWhitelist;

/**
 This method's behavior is similar to `- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;`, 
 but be called before the model transform.
 
 @discussion If the model implements this method, it will be called before
 `+modelWithJSON:`, `+modelWithDictionary:`, `-modelSetWithJSON:` and `-modelSetWithDictionary:`.
 If this method returns nil, the transform process will ignore this model.
 
 @param dic  The json/kv dictionary.
 
 @return Returns the modified dictionary, or nil to ignore this model.
 */
- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;

/**
 If the default json-to-model transform does not fit to your model object, implement
 this method to do additional process. You can also use this method to validate the 
 model's properties.
 
 @discussion If the model implements this method, it will be called at the end of
 `+modelWithJSON:`, `+modelWithDictionary:`, `-modelSetWithJSON:` and `-modelSetWithDictionary:`.
 If this method returns NO, the transform process will ignore this model.
 
 @param dic  The json/kv dictionary.
 
 @return Returns YES if the model is valid, or NO to ignore this model.
 */
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;

/**
 If the default model-to-json transform does not fit to your model class, implement
 this method to do additional process. You can also use this method to validate the
 json dictionary.
 
 @discussion If the model implements this method, it will be called at the end of
 `-modelToJSONObject` and `-modelToJSONString`.
 If this method returns NO, the transform process will ignore this json dictionary.
 
 @param dic  The json dictionary.
 
 @return Returns YES if the model is valid, or NO to ignore this model.
 */
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;

@end

NS_ASSUME_NONNULL_END


================================================
FILE: Example/Pods/YYModel/YYModel/NSObject+YYModel.m
================================================
//
//  NSObject+YYModel.m
//  YYModel <https://github.com/ibireme/YYModel>
//
//  Created by ibireme on 15/5/10.
//  Copyright (c) 2015 ibireme.
//
//  This source code is licensed under the MIT-style license found in the
//  LICENSE file in the root directory of this source tree.
//

#import "NSObject+YYModel.h"
#import "YYClassInfo.h"
#import <objc/message.h>

#define force_inline __inline__ __attribute__((always_inline))

/// Foundation Class Type
typedef NS_ENUM (NSUInteger, YYEncodingNSType) {
    YYEncodingTypeNSUnknown = 0,
    YYEncodingTypeNSString,
    YYEncodingTypeNSMutableString,
    YYEncodingTypeNSValue,
    YYEncodingTypeNSNumber,
    YYEncodingTypeNSDecimalNumber,
    YYEncodingTypeNSData,
    YYEncodingTypeNSMutableData,
    YYEncodingTypeNSDate,
    YYEncodingTypeNSURL,
    YYEncodingTypeNSArray,
    YYEncodingTypeNSMutableArray,
    YYEncodingTypeNSDictionary,
    YYEncodingTypeNSMutableDictionary,
    YYEncodingTypeNSSet,
    YYEncodingTypeNSMutableSet,
};

/// Get the Foundation class type from property info.
static force_inline YYEncodingNSType YYClassGetNSType(Class cls) {
    if (!cls) return YYEncodingTypeNSUnknown;
    if ([cls isSubclassOfClass:[NSMutableString class]]) return YYEncodingTypeNSMutableString;
    if ([cls isSubclassOfClass:[NSString class]]) return YYEncodingTypeNSString;
    if ([cls isSubclassOfClass:[NSDecimalNumber class]]) return YYEncodingTypeNSDecimalNumber;
    if ([cls isSubclassOfClass:[NSNumber class]]) return YYEncodingTypeNSNumber;
    if ([cls isSubclassOfClass:[NSValue class]]) return YYEncodingTypeNSValue;
    if ([cls isSubclassOfClass:[NSMutableData class]]) return YYEncodingTypeNSMutableData;
    if ([cls isSubclassOfClass:[NSData class]]) return YYEncodingTypeNSData;
    if ([cls isSubclassOfClass:[NSDate class]]) return YYEncodingTypeNSDate;
    if ([cls isSubclassOfClass:[NSURL class]]) return YYEncodingTypeNSURL;
    if ([cls isSubclassOfClass:[NSMutableArray class]]) return YYEncodingTypeNSMutableArray;
    if ([cls isSubclassOfClass:[NSArray class]]) return YYEncodingTypeNSArray;
    if ([cls isSubclassOfClass:[NSMutableDictionary class]]) return YYEncodingTypeNSMutableDictionary;
    if ([cls isSubclassOfClass:[NSDictionary class]]) return YYEncodingTypeNSDictionary;
    if ([cls isSubclassOfClass:[NSMutableSet class]]) return YYEncodingTypeNSMutableSet;
    if ([cls isSubclassOfClass:[NSSet class]]) return YYEncodingTypeNSSet;
    return YYEncodingTypeNSUnknown;
}

/// Whether the type is c number.
static force_inline BOOL YYEncodingTypeIsCNumber(YYEncodingType type) {
    switch (type & YYEncodingTypeMask) {
        case YYEncodingTypeBool:
        case YYEncodingTypeInt8:
        case YYEncodingTypeUInt8:
        case YYEncodingTypeInt16:
        case YYEncodingTypeUInt16:
        case YYEncodingTypeInt32:
        case YYEncodingTypeUInt32:
        case YYEncodingTypeInt64:
        case YYEncodingTypeUInt64:
        case YYEncodingTypeFloat:
        case YYEncodingTypeDouble:
        case YYEncodingTypeLongDouble: return YES;
        default: return NO;
    }
}

/// Parse a number value from 'id'.
static force_inline NSNumber *YYNSNumberCreateFromID(__unsafe_unretained id value) {
    static NSCharacterSet *dot;
    static NSDictionary *dic;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dot = [NSCharacterSet characterSetWithRange:NSMakeRange('.', 1)];
        dic = @{@"TRUE" :   @(YES),
                @"True" :   @(YES),
                @"true" :   @(YES),
                @"FALSE" :  @(NO),
                @"False" :  @(NO),
                @"false" :  @(NO),
                @"YES" :    @(YES),
                @"Yes" :    @(YES),
                @"yes" :    @(YES),
                @"NO" :     @(NO),
                @"No" :     @(NO),
                @"no" :     @(NO),
                @"NIL" :    (id)kCFNull,
                @"Nil" :    (id)kCFNull,
                @"nil" :    (id)kCFNull,
                @"NULL" :   (id)kCFNull,
                @"Null" :   (id)kCFNull,
                @"null" :   (id)kCFNull,
                @"(NULL)" : (id)kCFNull,
                @"(Null)" : (id)kCFNull,
                @"(null)" : (id)kCFNull,
                @"<NULL>" : (id)kCFNull,
                @"<Null>" : (id)kCFNull,
                @"<null>" : (id)kCFNull};
    });
    
    if (!value || value == (id)kCFNull) return nil;
    if ([value isKindOfClass:[NSNumber class]]) return value;
    if ([value isKindOfClass:[NSString class]]) {
        NSNumber *num = dic[value];
        if (num) {
            if (num == (id)kCFNull) return nil;
            return num;
        }
        if ([(NSString *)value rangeOfCharacterFromSet:dot].location != NSNotFound) {
            const char *cstring = ((NSString *)value).UTF8String;
            if (!cstring) return nil;
            double num = atof(cstring);
            if (isnan(num) || isinf(num)) return nil;
            return @(num);
        } else {
            const char *cstring = ((NSString *)value).UTF8String;
            if (!cstring) return nil;
            return @(atoll(cstring));
        }
    }
    return nil;
}

/// Parse string to date.
static force_inline NSDate *YYNSDateFromString(__unsafe_unretained NSString *string) {
    typedef NSDate* (^YYNSDateParseBlock)(NSString *string);
    #define kParserNum 34
    static YYNSDateParseBlock blocks[kParserNum + 1] = {0};
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        {
            /*
             2014-01-20  // Google
             */
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
            formatter.dateFormat = @"yyyy-MM-dd";
            blocks[10] = ^(NSString *string) { return [formatter dateFromString:string]; };
        }
        
        {
            /*
             2014-01-20 12:24:48
             2014-01-20T12:24:48   // Google
             2014-01-20 12:24:48.000
             2014-01-20T12:24:48.000
             */
            NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
            formatter1.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter1.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
            formatter1.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss";
            
            NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
            formatter2.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter2.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
            formatter2.dateFormat = @"yyyy-MM-dd HH:mm:ss";

            NSDateFormatter *formatter3 = [[NSDateFormatter alloc] init];
            formatter3.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter3.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
            formatter3.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS";

            NSDateFormatter *formatter4 = [[NSDateFormatter alloc] init];
            formatter4.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter4.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
            formatter4.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS";
            
            blocks[19] = ^(NSString *string) {
                if ([string characterAtIndex:10] == 'T') {
                    return [formatter1 dateFromString:string];
                } else {
                    return [formatter2 dateFromString:string];
                }
            };

            blocks[23] = ^(NSString *string) {
                if ([string characterAtIndex:10] == 'T') {
                    return [formatter3 dateFromString:string];
                } else {
                    return [formatter4 dateFromString:string];
                }
            };
        }
        
        {
            /*
             2014-01-20T12:24:48Z        // Github, Apple
             2014-01-20T12:24:48+0800    // Facebook
             2014-01-20T12:24:48+12:00   // Google
             2014-01-20T12:24:48.000Z
             2014-01-20T12:24:48.000+0800
             2014-01-20T12:24:48.000+12:00
             */
            NSDateFormatter *formatter = [NSDateFormatter new];
            formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";

            NSDateFormatter *formatter2 = [NSDateFormatter new];
            formatter2.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter2.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";

            blocks[20] = ^(NSString *string) { return [formatter dateFromString:string]; };
            blocks[24] = ^(NSString *string) { return [formatter dateFromString:string]?: [formatter2 dateFromString:string]; };
            blocks[25] = ^(NSString *string) { return [formatter dateFromString:string]; };
            blocks[28] = ^(NSString *string) { return [formatter2 dateFromString:string]; };
            blocks[29] = ^(NSString *string) { return [formatter2 dateFromString:string]; };
        }
        
        {
            /*
             Fri Sep 04 00:12:21 +0800 2015 // Weibo, Twitter
             Fri Sep 04 00:12:21.000 +0800 2015
             */
            NSDateFormatter *formatter = [NSDateFormatter new];
            formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";

            NSDateFormatter *formatter2 = [NSDateFormatter new];
            formatter2.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            formatter2.dateFormat = @"EEE MMM dd HH:mm:ss.SSS Z yyyy";

            blocks[30] = ^(NSString *string) { return [formatter dateFromString:string]; };
            blocks[34] = ^(NSString *string) { return [formatter2 dateFromString:string]; };
        }
    });
    if (!string) return nil;
    if (string.length > kParserNum) return nil;
    YYNSDateParseBlock parser = blocks[string.length];
    if (!parser) return nil;
    return parser(string);
    #undef kParserNum
}


/// Get the 'NSBlock' class.
static force_inline Class YYNSBlockClass() {
    static Class cls;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        void (^block)(void) = ^{};
        cls = ((NSObject *)block).class;
        while (class_getSuperclass(cls) != [NSObject class]) {
            cls = class_getSuperclass(cls);
        }
    });
    return cls; // current is "NSBlock"
}



/**
 Get the ISO date formatter.
 
 ISO8601 format example:
 2010-07-09T16:13:30+12:00
 2011-01-11T11:11:11+0000
 2011-01-26T19:06:43Z
 
 length: 20/24/25
 */
static force_inline NSDateFormatter *YYISODateFormatter() {
    static NSDateFormatter *formatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        formatter = [[NSDateFormatter alloc] init];
        formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
        formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
    });
    return formatter;
}

/// Get the value with key paths from dictionary
/// The dic should be NSDictionary, and the keyPath should not be nil.
static force_inline id YYValueForKeyPath(__unsafe_unretained NSDictionary *dic, __unsafe_unretained NSArray *keyPaths) {
    id value = nil;
    for (NSUInteger i = 0, max = keyPaths.count; i < max; i++) {
        value = dic[keyPaths[i]];
        if (i + 1 < max) {
            if ([value isKindOfClass:[NSDictionary class]]) {
                dic = value;
            } else {
                return nil;
            }
        }
    }
    return value;
}

/// Get the value with multi key (or key path) from dictionary
/// The dic should be NSDictionary
static force_inline id YYValueForMultiKeys(__unsafe_unretained NSDictionary *dic, __unsafe_unretained NSArray *multiKeys) {
    id value = nil;
    for (NSString *key in multiKeys) {
        if ([key isKindOfClass:[NSString class]]) {
            value = dic[key];
            if (value) break;
        } else {
            value = YYValueForKeyPath(dic, (NSArray *)key);
            if (value) break;
        }
    }
    return value;
}




/// A property info in object model.
@interface _YYModelPropertyMeta : NSObject {
    @package
    NSString *_name;             ///< property's name
    YYEncodingType _type;        ///< property's type
    YYEncodingNSType _nsType;    ///< property's Foundation type
    BOOL _isCNumber;             ///< is c number type
    Class _cls;                  ///< property's class, or nil
    Class _genericCls;           ///< container's generic class, or nil if threr's no generic class
    SEL _getter;                 ///< getter, or nil if the instances cannot respond
    SEL _setter;                 ///< setter, or nil if the instances cannot respond
    BOOL _isKVCCompatible;       ///< YES if it can access with key-value coding
    BOOL _isStructAvailableForKeyedArchiver; ///< YES if the struct can encoded with keyed archiver/unarchiver
    BOOL _hasCustomClassFromDictionary; ///< class/generic class implements +modelCustomClassForDictionary:
    
    /*
     property->key:       _mappedToKey:key     _mappedToKeyPath:nil            _mappedToKeyArray:nil
     property->keyPath:   _mappedToKey:keyPath _mappedToKeyPath:keyPath(array) _mappedToKeyArray:nil
     property->keys:      _mappedToKey:keys[0] _mappedToKeyPath:nil/keyPath    _mappedToKeyArray:keys(array)
     */
    NSString *_mappedToKey;      ///< the key mapped to
    NSArray *_mappedToKeyPath;   ///< the key path mapped to (nil if the name is not key path)
    NSArray *_mappedToKeyArray;  ///< the key(NSString) or keyPath(NSArray) array (nil if not mapped to multiple keys)
    YYClassPropertyInfo *_info;  ///< property's info
    _YYModelPropertyMeta *_next; ///< next meta if there are multiple properties mapped to the same key.
}
@end

@implementation _YYModelPropertyMeta
+ (instancetype)metaWithClassInfo:(YYClassInfo *)classInfo propertyInfo:(YYClassPropertyInfo *)propertyInfo generic:(Class)generic {
    
    // support pseudo generic class with protocol name
    if (!generic && propertyInfo.protocols) {
        for (NSString *protocol in propertyInfo.protocols) {
            Class cls = objc_getClass(protocol.UTF8String);
            if (cls) {
                generic = cls;
                break;
            }
        }
    }
    
    _YYModelPropertyMeta *meta = [self new];
    meta->_name = propertyInfo.name;
    meta->_type = propertyInfo.type;
    meta->_info = propertyInfo;
    meta->_genericCls = generic;
    
    if ((meta->_type & YYEncodingTypeMask) == YYEncodingTypeObject) {
        meta->_nsType = YYClassGetNSType(propertyInfo.cls);
    } else {
        meta->_isCNumber = YYEncodingTypeIsCNumber(meta->_type);
    }
    if ((meta->_type & YYEncodingTypeMask) == YYEncodingTypeStruct) {
        /*
         It seems that NSKeyedUnarchiver cannot decode NSValue except these structs:
         */
        static NSSet *types = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSMutableSet *set = [NSMutableSet new];
            // 32 bit
            [set addObject:@"{CGSize=ff}"];
            [set addObject:@"{CGPoint=ff}"];
            [set addObject:@"{CGRect={CGPoint=ff}{CGSize=ff}}"];
            [set addObject:@"{CGAffineTransform=ffffff}"];
            [set addObject:@"{UIEdgeInsets=ffff}"];
            [set addObject:@"{UIOffset=ff}"];
            // 64 bit
            [set addObject:@"{CGSize=dd}"];
            [set addObject:@"{CGPoint=dd}"];
            [set addObject:@"{CGRect={CGPoint=dd}{CGSize=dd}}"];
            [set addObject:@"{CGAffineTransform=dddddd}"];
            [set addObject:@"{UIEdgeInsets=dddd}"];
            [set addObject:@"{UIOffset=dd}"];
            types = set;
        });
        if ([types containsObject:propertyInfo.typeEncoding]) {
            meta->_isStructAvailableForKeyedArchiver = YES;
        }
    }
    meta->_cls = propertyInfo.cls;
    
    if (generic) {
        meta->_hasCustomClassFromDictionary = [generic respondsToSelector:@selector(modelCustomClassForDictionary:)];
    } else if (meta->_cls && meta->_nsType == YYEncodingTypeNSUnknown) {
        meta->_hasCustomClassFromDictionary = [meta->_cls respondsToSelector:@selector(modelCustomClassForDictionary:)];
    }
    
    if (propertyInfo.getter) {
        if ([classInfo.cls instancesRespondToSelector:propertyInfo.getter]) {
            meta->_getter = propertyInfo.getter;
        }
    }
    if (propertyInfo.setter) {
        if ([classInfo.cls instancesRespondToSelector:propertyInfo.setter]) {
            meta->_setter = propertyInfo.setter;
        }
    }
    
    if (meta->_getter && meta->_setter) {
        /*
         KVC invalid type:
         long double
         pointer (such as SEL/CoreFoundation object)
         */
        switch (meta->_type & YYEncodingTypeMask) {
            case YYEncodingTypeBool:
            case YYEncodingTypeInt8:
            case YYEncodingTypeUInt8:
            case YYEncodingTypeInt16:
            case YYEncodingTypeUInt16:
            case YYEncodingTypeInt32:
            case YYEncodingTypeUInt32:
            case YYEncodingTypeInt64:
            case YYEncodingTypeUInt64:
            case YYEncodingTypeFloat:
            case YYEncodingTypeDouble:
            case YYEncodingTypeObject:
            case YYEncodingTypeClass:
            case YYEncodingTypeBlock:
            case YYEncodingTypeStruct:
            case YYEncodingTypeUnion: {
                meta->_isKVCCompatible = YES;
            } break;
            default: break;
        }
    }
    
    return meta;
}
@end


/// A class info in object model.
@interface _YYModelMeta : NSObject {
    @package
    YYClassInfo *_classInfo;
    /// Key:mapped key and key path, Value:_YYModelPropertyMeta.
    NSDictionary *_mapper;
    /// Array<_YYModelPropertyMeta>, all property meta of this model.
    NSArray *_allPropertyMetas;
    /// Array<_YYModelPropertyMeta>, property meta which is mapped to a key path.
    NSArray *_keyPathPropertyMetas;
    /// Array<_YYModelPropertyMeta>, property meta which is mapped to multi keys.
    NSArray *_multiKeysPropertyMetas;
    /// The number of mapped key (and key path), same to _mapper.count.
    NSUInteger _keyMappedCount;
    /// Model class type.
    YYEncodingNSType _nsType;
    
    BOOL _hasCustomWillTransformFromDictionary;
    BOOL _hasCustomTransformFromDictionary;
    BOOL _hasCustomTransformToDictionary;
    BOOL _hasCustomClassFromDictionary;
}
@end

@implementation _YYModelMeta
- (instancetype)initWithClass:(Class)cls {
    YYClassInfo *classInfo = [YYClassInfo classInfoWithClass:cls];
    if (!classInfo) return nil;
    self = [super init];
    
    // Get black list
    NSSet *blacklist = nil;
    if ([cls respondsToSelector:@selector(modelPropertyBlacklist)]) {
        NSArray *properties = [(id<YYModel>)cls modelPropertyBlacklist];
        if (properties) {
            blacklist = [NSSet setWithArray:properties];
        }
    }
    
    // Get white list
    NSSet *whitelist = nil;
    if ([cls respondsToSelector:@selector(modelPropertyWhitelist)]) {
        NSArray *properties = [(id<YYModel>)cls modelPropertyWhitelist];
        if (properties) {
            whitelist = [NSSet setWithArray:properties];
        }
    }
    
    // Get container property's generic class
    NSDictionary *genericMapper = nil;
    if ([cls respondsToSelector:@selector(modelContainerPropertyGenericClass)]) {
        genericMapper = [(id<YYModel>)cls modelContainerPropertyGenericClass];
        if (genericMapper) {
            NSMutableDictionary *tmp = [NSMutableDictionary new];
            [genericMapper enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
                if (![key isKindOfClass:[NSString class]]) return;
                Class meta = object_getClass(obj);
                if (!meta) return;
                if (class_isMetaClass(meta)) {
                    tmp[key] = obj;
                } else if ([obj isKindOfClass:[NSString class]]) {
                    Class cls = NSClassFromString(obj);
                    if (cls) {
                        tmp[key] = cls;
                    }
                }
            }];
            genericMapper = tmp;
        }
    }
    
    // Create all property metas.
    NSMutableDictionary *allPropertyMetas = [NSMutableDictionary new];
    YYClassInfo *curClassInfo = classInfo;
    while (curClassInfo && curClassInfo.superCls != nil) { // recursive parse super class, but ignore root class (NSObject/NSProxy)
        for (YYClassPropertyInfo *propertyInfo in curClassInfo.propertyInfos.allValues) {
            if (!propertyInfo.name) continue;
            if (blacklist && [blacklist containsObject:propertyInfo.name]) continue;
            if (whitelist && ![whitelist containsObject:propertyInfo.name]) continue;
            _YYModelPropertyMeta *meta = [_YYModelPropertyMeta metaWithClassInfo:classInfo
                                                                    propertyInfo:propertyInfo
                                                                         generic:genericMapper[propertyInfo.name]];
            if (!meta || !meta->_name) continue;
            if (!meta->_getter || !meta->_setter) continue;
            if (allPropertyMetas[meta->_name]) continue;
            allPropertyMetas[meta->_name] = meta;
        }
        curClassInfo = curClassInfo.superClassInfo;
    }
    if (allPropertyMetas.count) _allPropertyMetas = allPropertyMetas.allValues.copy;
    
    // create mapper
    NSMutableDictionary *mapper = [NSMutableDictionary new];
    NSMutableArray *keyPathPropertyMetas = [NSMutableArray new];
    NSMutableArray *multiKeysPropertyMetas = [NSMutableArray new];
    
    if ([cls respondsToSelector:@selector(modelCustomPropertyMapper)]) {
        NSDictionary *customMapper = [(id <YYModel>)cls modelCustomPropertyMapper];
        [customMapper enumerateKeysAndObjectsUsingBlock:^(NSString *propertyName, NSString *mappedToKey, BOOL *stop) {
            _YYModelPropertyMeta *propertyMeta = allPropertyMetas[propertyName];
            if (!propertyMeta) return;
            [allPropertyMetas removeObjectForKey:propertyName];
            
            if ([mappedToKey isKindOfClass:[NSString class]]) {
                if (mappedToKey.length == 0) return;
                
                propertyMeta->_mappedToKey = mappedToKey;
                NSArray *keyPath = [mappedToKey componentsSeparatedByString:@"."];
                for (NSString *onePath in keyPath) {
                    if (onePath.length == 0) {
                        NSMutableArray *tmp = keyPath.mutableCopy;
                        [tmp removeObject:@""];
                        keyPath = tmp;
                        break;
                    }
                }
                if (keyPath.count > 1) {
                    propertyMeta->_mappedToKeyPath = keyPath;
                    [keyPathPropertyMetas addObject:propertyMeta];
                }
                propertyMeta->_next = mapper[mappedToKey] ?: nil;
                mapper[mappedToKey] = propertyMeta;
                
            } else if ([mappedToKey isKindOfClass:[NSArray class]]) {
                
                NSMutableArray *mappedToKeyArray = [NSMutableArray new];
                for (NSString *oneKey in ((NSArray *)mappedToKey)) {
                    if (![oneKey isKindOfClass:[NSString class]]) continue;
                    if (oneKey.length == 0) continue;
                    
                    NSArray *keyPath = [oneKey componentsSeparatedByString:@"."];
                    if (keyPath.count > 1) {
                        [mappedToKeyArray addObject:keyPath];
                    } else {
                        [mappedToKeyArray addObject:oneKey];
                    }
                    
                    if (!propertyMeta->_mappedToKey) {
                        propertyMeta->_mappedToKey = oneKey;
                        propertyMeta->_mappedToKeyPath = keyPath.count > 1 ? keyPath : nil;
                    }
                }
                if (!propertyMeta->_mappedToKey) return;
                
                propertyMeta->_mappedToKeyArray = mappedToKeyArray;
                [multiKeysPropertyMetas addObject:propertyMeta];
                
                propertyMeta->_next = mapper[mappedToKey] ?: nil;
                mapper[mappedToKey] = propertyMeta;
            }
        }];
    }
    
    [allPropertyMetas enumerateKeysAndObjectsUsingBlock:^(NSString *name, _YYModelPropertyMeta *propertyMeta, BOOL *stop) {
        propertyMeta->_mappedToKey = name;
        propertyMeta->_next = mapper[name] ?: nil;
        mapper[name] = propertyMeta;
    }];
    
    if (mapper.count) _mapper = mapper;
    if (keyPathPropertyMetas) _keyPathPropertyMetas = keyPathPropertyMetas;
    if (multiKeysPropertyMetas) _multiKeysPropertyMetas = multiKeysPropertyMetas;
    
    _classInfo = classInfo;
    _keyMappedCount = _allPropertyMetas.count;
    _nsType = YYClassGetNSType(cls);
    _hasCustomWillTransformFromDictionary = ([cls instancesRespondToSelector:@selector(modelCustomWillTransformFromDictionary:)]);
    _hasCustomTransformFromDictionary = ([cls instancesRespondToSelector:@selector(modelCustomTransformFromDictionary:)]);
    _hasCustomTransformToDictionary = ([cls instancesRespondToSelector:@selector(modelCustomTransformToDictionary:)]);
    _hasCustomClassFromDictionary = ([cls respondsToSelector:@selector(modelCustomClassForDictionary:)]);
    
    return self;
}

/// Returns the cached model class meta
+ (instancetype)metaWithClass:(Class)cls {
    if (!cls) return nil;
    static CFMutableDictionaryRef cache;
    static dispatch_once_t onceToken;
    static dispatch_semaphore_t lock;
    dispatch_once(&onceToken, ^{
        cache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
        lock = dispatch_semaphore_create(1);
    });
    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    _YYModelMeta *meta = CFDictionaryGetValue(cache, (__bridge const void *)(cls));
    dispatch_semaphore_signal(lock);
    if (!meta || meta->_classInfo.needUpdate) {
        meta = [[_YYModelMeta alloc] initWithClass:cls];
        if (meta) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            CFDictionarySetValue(cache, (__bridge const void *)(cls), (__bridge const void *)(meta));
            dispatch_semaphore_signal(lock);
        }
    }
    return meta;
}

@end


/**
 Get number from property.
 @discussion Caller should hold strong reference to the parameters before this function returns.
 @param model Should not be nil.
 @param meta  Should not be nil, meta.isCNumber should be YES, meta.getter should not be nil.
 @return A number object, or nil if failed.
 */
static force_inline NSNumber *ModelCreateNumberFromProperty(__unsafe_unretained id model,
                                                            __unsafe_unretained _YYModelPropertyMeta *meta) {
    switch (meta->_type & YYEncodingTypeMask) {
        case YYEncodingTypeBool: {
            return @(((bool (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeInt8: {
            return @(((int8_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeUInt8: {
            return @(((uint8_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeInt16: {
            return @(((int16_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeUInt16: {
            return @(((uint16_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeInt32: {
            return @(((int32_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeUInt32: {
            return @(((uint32_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeInt64: {
            return @(((int64_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeUInt64: {
            return @(((uint64_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
        }
        case YYEncodingTypeFloat: {
            float num = ((float (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
            if (isnan(num) || isinf(num)) return nil;
            return @(num);
        }
        case YYEncodingTypeDouble: {
            double num = ((double (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
            if (isnan(num) || isinf(num)) return nil;
            return @(num);
        }
        case YYEncodingTypeLongDouble: {
            double num = ((long double (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
            if (isnan(num) || isinf(num)) return nil;
            return @(num);
        }
        default: return nil;
    }
}

/**
 Set number to property.
 @discussion Caller should hold strong reference to the parameters before this function returns.
 @param model Should not be nil.
 @param num   Can be nil.
 @param meta  Should not be nil, meta.isCNumber should be YES, meta.setter should not be nil.
 */
static force_inline void ModelSetNumberToProperty(__unsafe_unretained id model,
                                                  __unsafe_unretained NSNumber *num,
                                                  __unsafe_unretained _YYModelPropertyMeta *meta) {
    switch (meta->_type & YYEncodingTypeMask) {
        case YYEncodingTypeBool: {
            ((void (*)(id, SEL, bool))(void *) objc_msgSend)((id)model, meta->_setter, num.boolValue);
        } break;
        case YYEncodingTypeInt8: {
            ((void (*)(id, SEL, int8_t))(void *) objc_msgSend)((id)model, meta->_setter, (int8_t)num.charValue);
        } break;
        case YYEncodingTypeUInt8: {
            ((void (*)(id, SEL, uint8_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint8_t)num.unsignedCharValue);
        } break;
        case YYEncodingTypeInt16: {
            ((void (*)(id, SEL, int16_t))(void *) objc_msgSend)((id)model, meta->_setter, (int16_t)num.shortValue);
        } break;
        case YYEncodingTypeUInt16: {
            ((void (*)(id, SEL, uint16_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint16_t)num.unsignedShortValue);
        } break;
        case YYEncodingTypeInt32: {
            ((void (*)(id, SEL, int32_t))(void *) objc_msgSend)((id)model, meta->_setter, (int32_t)num.intValue);
        }
        case YYEncodingTypeUInt32: {
            ((void (*)(id, SEL, uint32_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint32_t)num.unsignedIntValue);
        } break;
        case YYEncodingTypeInt64: {
            if ([num isKindOfClass:[NSDecimalNumber class]]) {
                ((void (*)(id, SEL, int64_t))(void *) objc_msgSend)((id)model, meta->_setter, (int64_t)num.stringValue.longLongValue);
            } else {
                ((void (*)(id, SEL, uint64_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint64_t)num.longLongValue);
            }
        } break;
        case YYEncodingTypeUInt64: {
            if ([num isKindOfClass:[NSDecimalNumber class]]) {
                ((void (*)(id, SEL, int64_t))(void *) objc_msgSend)((id)model, meta->_setter, (int64_t)num.stringValue.longLongValue);
            } else {
                ((void (*)(id, SEL, uint64_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint64_t)num.unsignedLongLongValue);
            }
        } break;
        case YYEncodingTypeFloat: {
            float f = num.floatValue;
            if (isnan(f) || isinf(f)) f = 0;
            ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)model, meta->_setter, f);
        } break;
        case YYEncodingTypeDouble: {
            double d = num.doubleValue;
            if (isnan(d) || isinf(d)) d = 0;
            ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)model, meta->_setter, d);
        } break;
        case YYEncodingTypeLongDouble: {
            long double d = num.doubleValue;
            if (isnan(d) || isinf(d)) d = 0;
            ((void (*)(id, SEL, long double))(void *) objc_msgSend)((id)model, meta->_setter, (long double)d);
        } // break; commented for code coverage in next line
        default: break;
    }
}

/**
 Set value to model with a property meta.
 
 @discussion Caller should hold strong reference to the parameters before this function returns.
 
 @param model Should not be nil.
 @param value Should not be nil, but can be NSNull.
 @param meta  Should not be nil, and meta->_setter should not be nil.
 */
static void ModelSetValueForProperty(__unsafe_unretained id model,
                                     __unsafe_unretained id value,
                                     __unsafe_unretained _YYModelPropertyMeta *meta) {
    if (meta->_isCNumber) {
        NSNumber *num = YYNSNumberCreateFromID(value);
        ModelSetNumberToProperty(model, num, meta);
        if (num) [num class]; // hold the number
    } else if (meta->_nsType) {
        if (value == (id)kCFNull) {
            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)nil);
        } else {
            switch (meta->_nsType) {
                case YYEncodingTypeNSString:
                case YYEncodingTypeNSMutableString: {
                    if ([value isKindOfClass:[NSString class]]) {
                        if (meta->_nsType == YYEncodingTypeNSString) {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                        } else {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, ((NSString *)value).mutableCopy);
                        }
                    } else if ([value isKindOfClass:[NSNumber class]]) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                       meta->_setter,
                                                                       (meta->_nsType == YYEncodingTypeNSString) ?
                                                                       ((NSNumber *)value).stringValue :
                                                                       ((NSNumber *)value).stringValue.mutableCopy);
                    } else if ([value isKindOfClass:[NSData class]]) {
                        NSMutableString *string = [[NSMutableString alloc] initWithData:value encoding:NSUTF8StringEncoding];
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, string);
                    } else if ([value isKindOfClass:[NSURL class]]) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                       meta->_setter,
                                                                       (meta->_nsType == YYEncodingTypeNSString) ?
                                                                       ((NSURL *)value).absoluteString :
                                                                       ((NSURL *)value).absoluteString.mutableCopy);
                    } else if ([value isKindOfClass:[NSAttributedString class]]) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                       meta->_setter,
                                                                       (meta->_nsType == YYEncodingTypeNSString) ?
                                                                       ((NSAttributedString *)value).string :
                                                                       ((NSAttributedString *)value).string.mutableCopy);
                    }
                } break;
                    
                case YYEncodingTypeNSValue:
                case YYEncodingTypeNSNumber:
                case YYEncodingTypeNSDecimalNumber: {
                    if (meta->_nsType == YYEncodingTypeNSNumber) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, YYNSNumberCreateFromID(value));
                    } else if (meta->_nsType == YYEncodingTypeNSDecimalNumber) {
                        if ([value isKindOfClass:[NSDecimalNumber class]]) {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                        } else if ([value isKindOfClass:[NSNumber class]]) {
                            NSDecimalNumber *decNum = [NSDecimalNumber decimalNumberWithDecimal:[((NSNumber *)value) decimalValue]];
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, decNum);
                        } else if ([value isKindOfClass:[NSString class]]) {
                            NSDecimalNumber *decNum = [NSDecimalNumber decimalNumberWithString:value];
                            NSDecimal dec = decNum.decimalValue;
                            if (dec._length == 0 && dec._isNegative) {
                                decNum = nil; // NaN
                            }
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, decNum);
                        }
                    } else { // YYEncodingTypeNSValue
                        if ([value isKindOfClass:[NSValue class]]) {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                        }
                    }
                } break;
                    
                case YYEncodingTypeNSData:
                case YYEncodingTypeNSMutableData: {
                    if ([value isKindOfClass:[NSData class]]) {
                        if (meta->_nsType == YYEncodingTypeNSData) {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                        } else {
                            NSMutableData *data = ((NSData *)value).mutableCopy;
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, data);
                        }
                    } else if ([value isKindOfClass:[NSString class]]) {
                        NSData *data = [(NSString *)value dataUsingEncoding:NSUTF8StringEncoding];
                        if (meta->_nsType == YYEncodingTypeNSMutableData) {
                            data = ((NSData *)data).mutableCopy;
                        }
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, data);
                    }
                } break;
                    
                case YYEncodingTypeNSDate: {
                    if ([value isKindOfClass:[NSDate class]]) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                    } else if ([value isKindOfClass:[NSString class]]) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, YYNSDateFromString(value));
                    }
                } break;
                    
                case YYEncodingTypeNSURL: {
                    if ([value isKindOfClass:[NSURL class]]) {
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                    } else if ([value isKindOfClass:[NSString class]]) {
                        NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
                        NSString *str = [value stringByTrimmingCharactersInSet:set];
                        if (str.length == 0) {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, nil);
                        } else {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, [[NSURL alloc] initWithString:str]);
                        }
                    }
                } break;
                    
                case YYEncodingTypeNSArray:
                case YYEncodingTypeNSMutableArray: {
                    if (meta->_genericCls) {
                        NSArray *valueArr = nil;
                        if ([value isKindOfClass:[NSArray class]]) valueArr = value;
                        else if ([value isKindOfClass:[NSSet class]]) valueArr = ((NSSet *)value).allObjects;
                        if (valueArr) {
                            NSMutableArray *objectArr = [NSMutableArray new];
                            for (id one in valueArr) {
                                if ([one isKindOfClass:meta->_genericCls]) {
                                    [objectArr addObject:one];
                                } else if ([one isKindOfClass:[NSDictionary class]]) {
                                    Class cls = meta->_genericCls;
                                    if (meta->_hasCustomClassFromDictionary) {
                                        cls = [cls modelCustomClassForDictionary:one];
                                        if (!cls) cls = meta->_genericCls; // for xcode code coverage
                                    }
                                    NSObject *newOne = [cls new];
                                    [newOne yy_modelSetWithDictionary:one];
                                    if (newOne) [objectArr addObject:newOne];
                                }
                            }
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, objectArr);
                        }
                    } else {
                        if ([value isKindOfClass:[NSArray class]]) {
                            if (meta->_nsType == YYEncodingTypeNSArray) {
                                ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                            } else {
                                ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                               meta->_setter,
                                                                               ((NSArray *)value).mutableCopy);
                            }
                        } else if ([value isKindOfClass:[NSSet class]]) {
                            if (meta->_nsType == YYEncodingTypeNSArray) {
                                ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, ((NSSet *)value).allObjects);
                            } else {
                                ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                               meta->_setter,
                                                                               ((NSSet *)value).allObjects.mutableCopy);
                            }
                        }
                    }
                } break;
                    
                case YYEncodingTypeNSDictionary:
                case YYEncodingTypeNSMutableDictionary: {
                    if ([value isKindOfClass:[NSDictionary class]]) {
                        if (meta->_genericCls) {
                            NSMutableDictionary *dic = [NSMutableDictionary new];
                            [((NSDictionary *)value) enumerateKeysAndObjectsUsingBlock:^(NSString *oneKey, id oneValue, BOOL *stop) {
                                if ([oneValue isKindOfClass:[NSDictionary class]]) {
                                    Class cls = meta->_genericCls;
                                    if (meta->_hasCustomClassFromDictionary) {
                                        cls = [cls modelCustomClassForDictionary:oneValue];
                                        if (!cls) cls = meta->_genericCls; // for xcode code coverage
                                    }
                                    NSObject *newOne = [cls new];
                                    [newOne yy_modelSetWithDictionary:(id)oneValue];
                                    if (newOne) dic[oneKey] = newOne;
                                }
                            }];
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, dic);
                        } else {
                            if (meta->_nsType == YYEncodingTypeNSDictionary) {
                                ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
                            } else {
                                ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                               meta->_setter,
                                                                               ((NSDictionary *)value).mutableCopy);
                            }
                        }
                    }
                } break;
                    
                case YYEncodingTypeNSSet:
                case YYEncodingTypeNSMutableSet: {
                    NSSet *valueSet = nil;
                    if ([value isKindOfClass:[NSArray class]]) valueSet = [NSMutableSet setWithArray:value];
                    else if ([value isKindOfClass:[NSSet class]]) valueSet = ((NSSet *)value);
                    
                    if (meta->_genericCls) {
                        NSMutableSet *set = [NSMutableSet new];
                        for (id one in valueSet) {
                            if ([one isKindOfClass:meta->_genericCls]) {
                                [set addObject:one];
                            } else if ([one isKindOfClass:[NSDictionary class]]) {
                                Class cls = meta->_genericCls;
                                if (meta->_hasCustomClassFromDictionary) {
                                    cls = [cls modelCustomClassForDictionary:one];
                                    if (!cls) cls = meta->_genericCls; // for xcode code coverage
                                }
                                NSObject *newOne = [cls new];
                                [newOne yy_modelSetWithDictionary:one];
                                if (newOne) [set addObject:newOne];
                            }
                        }
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, set);
                    } else {
                        if (meta->_nsType == YYEncodingTypeNSSet) {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, valueSet);
                        } else {
                            ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
                                                                           meta->_setter,
                                                                           ((NSSet *)valueSet).mutableCopy);
                        }
                    }
                } // break; commented for code coverage in next line
                    
                default: break;
            }
        }
    } else {
        BOOL isNull = (value == (id)kCFNull);
        switch (meta->_type & YYEncodingTypeMask) {
            case YYEncodingTypeObject: {
                if (isNull) {
                    ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)nil);
                } else if ([value isKindOfClass:meta->_cls] || !meta->_cls) {
                    ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)value);
                } else if ([value isKindOfClass:[NSDictionary class]]) {
                    NSObject *one = nil;
                    if (meta->_getter) {
                        one = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
                    }
                    if (one) {
                        [one yy_modelSetWithDictionary:value];
                    } else {
                        Class cls = meta->_cls;
                        if (meta->_hasCustomClassFromDictionary) {
                            cls = [cls modelCustomClassForDictionary:value];
                            if (!cls) cls = meta->_genericCls; // for xcode code coverage
                        }
                        one = [cls new];
                        [one yy_modelSetWithDictionary:value];
                        ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)one);
                    }
                }
            } break;
                
            case YYEncodingTypeClass: {
                if (isNull) {
                    ((void (*)(id, SEL, Class))(void *) objc_msgSend)((id)model, meta->_setter, (Class)NULL);
                } else {
                    Class cls = nil;
                    if ([value isKindOfClass:[NSString class]]) {
                        cls = NSClassFromString(value);
                        if (cls) {
                            ((void (*)(id, SEL, Class))(void *) objc_msgSend)((id)model, meta->_setter, (Class)cls);
                        }
                    } else {
                        cls = object_getClass(value);
                        if (cls) {
                            if (class_isMetaClass(cls)) {
                                ((void (*)(id, SEL, Class))(void *) objc_msgSend)((id)model, meta->_setter, (Class)value);
                            }
                        }
                    }
                }
            } break;
                
            case  YYEncodingTypeSEL: {
                if (isNull) {
                    ((void (*)(id, SEL, SEL))(void *) objc_msgSend)((id)model, meta->_setter, (SEL)NULL);
                } else if ([value isKindOfClass:[NSString class]]) {
                    SEL sel = NSSelectorFromString(value);
                    if (sel) ((void (*)(id, SEL, SEL))(void *) objc_msgSend)((id)model, meta->_setter, (SEL)sel);
                }
            } break;
                
            case YYEncodingTypeBlock: {
                if (isNull) {
                    ((void (*)(id, SEL, void (^)()))(void *) objc_msgSend)((id)model, meta->_setter, (void (^)())NULL);
                } else if ([value isKindOfClass:YYNSBlockClass()]) {
                    ((void (*)(id, SEL, void (^)()))(void *) objc_msgSend)((id)model, meta->_setter, (void (^)())value);
                }
            } break;
                
            case YYEncodingTypeStruct:
            case YYEncodingTypeUnion:
            case YYEncodingTypeCArray: {
                if ([value isKindOfClass:[NSValue class]]) {
                    const char *valueType = ((NSValue *)value).objCType;
                    const char *metaType = meta->_info.typeEncoding.UTF8String;
                    if (valueType && metaType && strcmp(valueType, metaType) == 0) {
                        [model setValue:value forKey:meta->_name];
                    }
                }
            } break;
                
            case YYEncodingTypePointer:
            case YYEncodingTypeCString: {
                if (isNull) {
                    ((void (*)(id, SEL, void *))(void *) objc_msgSend)((id)model, meta->_setter, (void *)NULL);
                } else if ([value isKindOfClass:[NSValue class]]) {
                    NSValue *nsValue = value;
                    if (nsValue.objCType && strcmp(nsValue.objCType, "^v") == 0) {
                        ((void (*)(id, SEL, void *))(void *) objc_msgSend)((id)model, meta->_setter, nsValue.pointerValue);
                    }
                }
            } // break; commented for code coverage in next line
                
            default: break;
        }
    }
}


typedef struct {
    void *modelMeta;  ///< _YYModelMeta
    void *model;      ///< id (self)
    void *dictionary; ///< NSDictionary (json)
} ModelSetContext;

/**
 Apply function for dictionary, to set the key-value pair to model.
 
 @param _key     should not be nil, NSString.
 @param _value   should not be nil.
 @param _context _context.modelMeta and _context.model should not be nil.
 */
static void ModelSetWithDictionaryFunction(const void *_key, const void *_value, void *_context) {
    ModelSetContext *context = _context;
    __unsafe_unretained _YYModelMeta *meta = (__bridge _YYModelMeta *)(context->modelMeta);
    __unsafe_unretained _YYModelPropertyMeta *propertyMeta = [meta->_mapper objectForKey:(__bridge id)(_key)];
    __unsafe_unretained id model = (__bridge id)(context->model);
    while (propertyMeta) {
        if (propertyMeta->_setter) {
            ModelSetValueForProperty(model, (__bridge __unsafe_unretained id)_value, propertyMeta);
        }
        propertyMeta = propertyMeta->_next;
    };
}

/**
 Apply function for model property meta, to set dictionary to model.
 
 @param _propertyMeta should not be nil, _YYModelPropertyMeta.
 @param _context      _context.model and _context.dictionary should not be nil.
 */
static void ModelSetWithPropertyMetaArrayFunction(const void *_propertyMeta, void *_context) {
    ModelSetContext *context = _context;
    __unsafe_unret
Download .txt
gitextract_jyftf8bp/

├── .gitattributes
├── .gitignore
├── .travis.yml
├── Example/
│   ├── Podfile
│   ├── Pods/
│   │   ├── Local Podspecs/
│   │   │   └── XYIAPKit.podspec.json
│   │   ├── Pods.xcodeproj/
│   │   │   └── project.pbxproj
│   │   ├── Target Support Files/
│   │   │   ├── Pods-XYIAPKit_Example/
│   │   │   │   ├── Info.plist
│   │   │   │   ├── Pods-XYIAPKit_Example-acknowledgements.markdown
│   │   │   │   ├── Pods-XYIAPKit_Example-acknowledgements.plist
│   │   │   │   ├── Pods-XYIAPKit_Example-dummy.m
│   │   │   │   ├── Pods-XYIAPKit_Example-frameworks.sh
│   │   │   │   ├── Pods-XYIAPKit_Example-resources.sh
│   │   │   │   ├── Pods-XYIAPKit_Example-umbrella.h
│   │   │   │   ├── Pods-XYIAPKit_Example.debug.xcconfig
│   │   │   │   ├── Pods-XYIAPKit_Example.modulemap
│   │   │   │   └── Pods-XYIAPKit_Example.release.xcconfig
│   │   │   ├── Pods-XYIAPKit_Tests/
│   │   │   │   ├── Info.plist
│   │   │   │   ├── Pods-XYIAPKit_Tests-acknowledgements.markdown
│   │   │   │   ├── Pods-XYIAPKit_Tests-acknowledgements.plist
│   │   │   │   ├── Pods-XYIAPKit_Tests-dummy.m
│   │   │   │   ├── Pods-XYIAPKit_Tests-frameworks.sh
│   │   │   │   ├── Pods-XYIAPKit_Tests-resources.sh
│   │   │   │   ├── Pods-XYIAPKit_Tests-umbrella.h
│   │   │   │   ├── Pods-XYIAPKit_Tests.debug.xcconfig
│   │   │   │   ├── Pods-XYIAPKit_Tests.modulemap
│   │   │   │   └── Pods-XYIAPKit_Tests.release.xcconfig
│   │   │   ├── XYIAPKit/
│   │   │   │   ├── Info.plist
│   │   │   │   ├── ResourceBundle-XYIAPKit-Info.plist
│   │   │   │   ├── XYIAPKit-dummy.m
│   │   │   │   ├── XYIAPKit-prefix.pch
│   │   │   │   ├── XYIAPKit-umbrella.h
│   │   │   │   ├── XYIAPKit.modulemap
│   │   │   │   └── XYIAPKit.xcconfig
│   │   │   └── YYModel/
│   │   │       ├── Info.plist
│   │   │       ├── YYModel-dummy.m
│   │   │       ├── YYModel-prefix.pch
│   │   │       ├── YYModel-umbrella.h
│   │   │       ├── YYModel.modulemap
│   │   │       └── YYModel.xcconfig
│   │   └── YYModel/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       └── YYModel/
│   │           ├── NSObject+YYModel.h
│   │           ├── NSObject+YYModel.m
│   │           ├── YYClassInfo.h
│   │           ├── YYClassInfo.m
│   │           └── YYModel.h
│   ├── Tests/
│   │   ├── Tests-Info.plist
│   │   ├── Tests-Prefix.pch
│   │   ├── Tests.m
│   │   └── en.lproj/
│   │       └── InfoPlist.strings
│   ├── XYIAPKit/
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── Images.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── XYAppDelegate.h
│   │   ├── XYAppDelegate.m
│   │   ├── XYIAPKit-Info.plist
│   │   ├── XYIAPKit-Prefix.pch
│   │   ├── XYViewController.h
│   │   ├── XYViewController.m
│   │   ├── en.lproj/
│   │   │   └── InfoPlist.strings
│   │   └── main.m
│   ├── XYIAPKit.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── XYIAPKit-Example.xcscheme
│   └── XYIAPKit.xcworkspace/
│       ├── contents.xcworkspacedata
│       └── xcshareddata/
│           └── IDEWorkspaceChecks.plist
├── LICENSE
├── README.md
├── XYIAPKit/
│   ├── Assets/
│   │   ├── .gitkeep
│   │   └── AppleIncRootCertificate.cer
│   ├── Core/
│   │   ├── NSNotification+XYStore.h
│   │   ├── NSNotification+XYStore.m
│   │   ├── XYReceiptRefreshService.h
│   │   ├── XYReceiptRefreshService.m
│   │   ├── XYStore.h
│   │   ├── XYStore.m
│   │   ├── XYStoreProductService.h
│   │   ├── XYStoreProductService.m
│   │   └── XYStoreProtocol.h
│   ├── Persistence/
│   │   ├── KeychainPersistence/
│   │   │   ├── XYStoreKeychainPersistence.h
│   │   │   └── XYStoreKeychainPersistence.m
│   │   └── UserDefaultPersistence/
│   │       ├── XYStoreTransaction.h
│   │       ├── XYStoreTransaction.m
│   │       ├── XYStoreUserDefaultsPersistence.h
│   │       └── XYStoreUserDefaultsPersistence.m
│   ├── Receipt/
│   │   ├── LocalReceiptVerify/
│   │   │   ├── XYAppReceipt.h
│   │   │   ├── XYAppReceipt.m
│   │   │   ├── XYStoreAppReceiptVerifier.h
│   │   │   └── XYStoreAppReceiptVerifier.m
│   │   └── iTunesReceiptVerify/
│   │       ├── NSDate+XYStoreExtension.h
│   │       ├── NSDate+XYStoreExtension.m
│   │       ├── XYInAppReceipt.h
│   │       ├── XYInAppReceipt.m
│   │       ├── XYStoreiTunesReceiptVerifier.h
│   │       ├── XYStoreiTunesReceiptVerifier.m
│   │       ├── XYiTunesReceipt.h
│   │       ├── XYiTunesReceipt.m
│   │       ├── XYiTunesResponse.h
│   │       └── XYiTunesResponse.m
│   └── XYIAPKit.h
└── XYIAPKit.podspec
Condensed preview — 101 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (458K chars).
[
  {
    "path": ".gitattributes",
    "chars": 67,
    "preview": "*.c linguist-language=Objective-C\n*.c linguist-language=Objective-C"
  },
  {
    "path": ".gitignore",
    "chars": 619,
    "preview": "# OS X\n.DS_Store\n\n# Xcode\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.pers"
  },
  {
    "path": ".travis.yml",
    "chars": 537,
    "preview": "# references:\n# * http://www.objc.io/issue-6/travis-ci.html\n# * https://github.com/supermarin/xcpretty#usage\n\nosx_image:"
  },
  {
    "path": "Example/Podfile",
    "chars": 351,
    "preview": "use_frameworks!\n\ntarget 'XYIAPKit_Example' do\n  pod 'XYIAPKit', :path => '../'\n  pod 'XYIAPKit/Core', :path => '../'\n  p"
  },
  {
    "path": "Example/Pods/Local Podspecs/XYIAPKit.podspec.json",
    "chars": 1475,
    "preview": "{\n  \"name\": \"XYIAPKit\",\n  \"version\": \"0.8.0\",\n  \"summary\": \"In App purchase sdk, support auto-renewable subscription\",\n "
  },
  {
    "path": "Example/Pods/Pods.xcodeproj/project.pbxproj",
    "chars": 64496,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-acknowledgements.markdown",
    "chars": 2335,
    "preview": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## XYIAPKit\n\nCopyright (c) 2018 1"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-acknowledgements.plist",
    "chars": 3421,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-dummy.m",
    "chars": 146,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_XYIAPKit_Example : NSObject\n@end\n@implementation PodsDummy_P"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-frameworks.sh",
    "chars": 6822,
    "preview": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_D"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-resources.sh",
    "chars": 5528,
    "preview": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/re"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example-umbrella.h",
    "chars": 334,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.debug.xcconfig",
    "chars": 715,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/YYMode"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.modulemap",
    "chars": 132,
    "preview": "framework module Pods_XYIAPKit_Example {\n  umbrella header \"Pods-XYIAPKit_Example-umbrella.h\"\n\n  export *\n  module * { e"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Example/Pods-XYIAPKit_Example.release.xcconfig",
    "chars": 715,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/YYMode"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-acknowledgements.markdown",
    "chars": 133,
    "preview": "# Acknowledgements\nThis application makes use of the following third party libraries:\nGenerated by CocoaPods - https://c"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-acknowledgements.plist",
    "chars": 805,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-dummy.m",
    "chars": 142,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_XYIAPKit_Tests : NSObject\n@end\n@implementation PodsDummy_Pod"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-frameworks.sh",
    "chars": 6443,
    "preview": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_D"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-resources.sh",
    "chars": 5528,
    "preview": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/re"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests-umbrella.h",
    "chars": 330,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.debug.xcconfig",
    "chars": 643,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/YYMode"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.modulemap",
    "chars": 128,
    "preview": "framework module Pods_XYIAPKit_Tests {\n  umbrella header \"Pods-XYIAPKit_Tests-umbrella.h\"\n\n  export *\n  module * { expor"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-XYIAPKit_Tests/Pods-XYIAPKit_Tests.release.xcconfig",
    "chars": 643,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/YYMode"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/ResourceBundle-XYIAPKit-Info.plist",
    "chars": 733,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/XYIAPKit-dummy.m",
    "chars": 120,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_XYIAPKit : NSObject\n@end\n@implementation PodsDummy_XYIAPKit\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/XYIAPKit-prefix.pch",
    "chars": 195,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/XYIAPKit-umbrella.h",
    "chars": 756,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/XYIAPKit.modulemap",
    "chars": 106,
    "preview": "framework module XYIAPKit {\n  umbrella header \"XYIAPKit-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/XYIAPKit/XYIAPKit.xcconfig",
    "chars": 627,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/XYIAPKit\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGU"
  },
  {
    "path": "Example/Pods/Target Support Files/YYModel/Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Pods/Target Support Files/YYModel/YYModel-dummy.m",
    "chars": 118,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_YYModel : NSObject\n@end\n@implementation PodsDummy_YYModel\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/YYModel/YYModel-prefix.pch",
    "chars": 195,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "Example/Pods/Target Support Files/YYModel/YYModel-umbrella.h",
    "chars": 379,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "Example/Pods/Target Support Files/YYModel/YYModel.modulemap",
    "chars": 104,
    "preview": "framework module YYModel {\n  umbrella header \"YYModel-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/YYModel/YYModel.xcconfig",
    "chars": 556,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/YYModel\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS="
  },
  {
    "path": "Example/Pods/YYModel/LICENSE",
    "chars": 1095,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 ibireme <ibireme@gmail.com>\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "Example/Pods/YYModel/README.md",
    "chars": 14467,
    "preview": "YYModel\n==============\n\n[![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://raw.gith"
  },
  {
    "path": "Example/Pods/YYModel/YYModel/NSObject+YYModel.h",
    "chars": 13477,
    "preview": "//\n//  NSObject+YYModel.h\n//  YYModel <https://github.com/ibireme/YYModel>\n//\n//  Created by ibireme on 15/5/10.\n//  Cop"
  },
  {
    "path": "Example/Pods/YYModel/YYModel/NSObject+YYModel.m",
    "chars": 84713,
    "preview": "//\n//  NSObject+YYModel.m\n//  YYModel <https://github.com/ibireme/YYModel>\n//\n//  Created by ibireme on 15/5/10.\n//  Cop"
  },
  {
    "path": "Example/Pods/YYModel/YYModel/YYClassInfo.h",
    "chars": 8133,
    "preview": "//\n//  YYClassInfo.h\n//  YYModel <https://github.com/ibireme/YYModel>\n//\n//  Created by ibireme on 15/5/9.\n//  Copyright"
  },
  {
    "path": "Example/Pods/YYModel/YYModel/YYClassInfo.m",
    "chars": 12828,
    "preview": "//\n//  YYClassInfo.m\n//  YYModel <https://github.com/ibireme/YYModel>\n//\n//  Created by ibireme on 15/5/9.\n//  Copyright"
  },
  {
    "path": "Example/Pods/YYModel/YYModel/YYModel.h",
    "chars": 595,
    "preview": "//\n//  YYModel.h\n//  YYModel <https://github.com/ibireme/YYModel>\n//\n//  Created by ibireme on 15/5/10.\n//  Copyright (c"
  },
  {
    "path": "Example/Tests/Tests-Info.plist",
    "chars": 674,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/Tests/Tests-Prefix.pch",
    "chars": 132,
    "preview": "//  The contents of this file are implicitly included at the beginning of every test case source file.\n\n#ifdef __OBJC__\n"
  },
  {
    "path": "Example/Tests/Tests.m",
    "chars": 616,
    "preview": "//\n//  XYIAPKitTests.m\n//  XYIAPKitTests\n//\n//  Created by 1073605877 on 01/08/2018.\n//  Copyright (c) 2018 1073605877. "
  },
  {
    "path": "Example/Tests/en.lproj/InfoPlist.strings",
    "chars": 45,
    "preview": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Example/XYIAPKit/Base.lproj/LaunchScreen.storyboard",
    "chars": 1844,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "Example/XYIAPKit/Base.lproj/Main.storyboard",
    "chars": 1857,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "Example/XYIAPKit/Images.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1591,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "Example/XYIAPKit/XYAppDelegate.h",
    "chars": 274,
    "preview": "//\n//  XYAppDelegate.h\n//  XYIAPKit\n//\n//  Created by 1073605877 on 01/08/2018.\n//  Copyright (c) 2018 1073605877. All r"
  },
  {
    "path": "Example/XYIAPKit/XYAppDelegate.m",
    "chars": 2007,
    "preview": "//\n//  XYAppDelegate.m\n//  XYIAPKit\n//\n//  Created by 1073605877 on 01/08/2018.\n//  Copyright (c) 2018 1073605877. All r"
  },
  {
    "path": "Example/XYIAPKit/XYIAPKit-Info.plist",
    "chars": 1563,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/XYIAPKit/XYIAPKit-Prefix.pch",
    "chars": 321,
    "preview": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n"
  },
  {
    "path": "Example/XYIAPKit/XYViewController.h",
    "chars": 212,
    "preview": "//\n//  XYViewController.h\n//  XYIAPKit\n//\n//  Created by 1073605877 on 01/08/2018.\n//  Copyright (c) 2018 1073605877. Al"
  },
  {
    "path": "Example/XYIAPKit/XYViewController.m",
    "chars": 503,
    "preview": "//\n//  XYViewController.m\n//  XYIAPKit\n//\n//  Created by 1073605877 on 01/08/2018.\n//  Copyright (c) 2018 1073605877. Al"
  },
  {
    "path": "Example/XYIAPKit/en.lproj/InfoPlist.strings",
    "chars": 45,
    "preview": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Example/XYIAPKit/main.m",
    "chars": 333,
    "preview": "//\n//  main.m\n//  XYIAPKit\n//\n//  Created by 1073605877 on 01/08/2018.\n//  Copyright (c) 2018 1073605877. All rights res"
  },
  {
    "path": "Example/XYIAPKit.xcodeproj/project.pbxproj",
    "chars": 30039,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "Example/XYIAPKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 153,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:XYIAPKit.xcodep"
  },
  {
    "path": "Example/XYIAPKit.xcodeproj/xcshareddata/xcschemes/XYIAPKit-Example.xcscheme",
    "chars": 3814,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "Example/XYIAPKit.xcworkspace/contents.xcworkspacedata",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:XYIAPKit.xcode"
  },
  {
    "path": "Example/XYIAPKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "LICENSE",
    "chars": 1078,
    "preview": "Copyright (c) 2018 1073605877 <qichao.ma@quvideo.com>\n\nPermission is hereby granted, free of charge, to any person obtai"
  },
  {
    "path": "README.md",
    "chars": 4890,
    "preview": "# XYIAPKit\n\n[![CI Status](http://img.shields.io/travis/1073605877/XYIAPKit.svg?style=flat)](https://travis-ci.org/107360"
  },
  {
    "path": "XYIAPKit/Assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "XYIAPKit/Core/NSNotification+XYStore.h",
    "chars": 2097,
    "preview": "//\n//  NSNotification+XYStore.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/20.\n//\n\n#import <Foundation/Foundation.h>"
  },
  {
    "path": "XYIAPKit/Core/NSNotification+XYStore.m",
    "chars": 1615,
    "preview": "//\n//  NSNotification+XYStore.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/20.\n//\n\n#import \"NSNotification+XYStore.h"
  },
  {
    "path": "XYIAPKit/Core/XYReceiptRefreshService.h",
    "chars": 337,
    "preview": "//\n//  XYReceiptRefreshService.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/21.\n//\n\n#import <Foundation/Foundation.h"
  },
  {
    "path": "XYIAPKit/Core/XYReceiptRefreshService.m",
    "chars": 1411,
    "preview": "//\n//  XYReceiptRefreshService.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/21.\n//\n\n#import \"XYReceiptRefreshService"
  },
  {
    "path": "XYIAPKit/Core/XYStore.h",
    "chars": 4172,
    "preview": "//\n//  XYStore.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import <Foundation/Foundation.h>\n#import <Store"
  },
  {
    "path": "XYIAPKit/Core/XYStore.m",
    "chars": 31361,
    "preview": "//\n//  XYStore.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import \"XYStore.h\"\n#import \"XYStoreProductServi"
  },
  {
    "path": "XYIAPKit/Core/XYStoreProductService.h",
    "chars": 746,
    "preview": "//\n//  XYStoreProductService.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/21.\n//\n\n#import <Foundation/Foundation.h>\n"
  },
  {
    "path": "XYIAPKit/Core/XYStoreProductService.m",
    "chars": 2093,
    "preview": "//\n//  XYStoreProductService.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/21.\n//\n\n#import \"XYStoreProductService.h\"\n"
  },
  {
    "path": "XYIAPKit/Core/XYStoreProtocol.h",
    "chars": 3114,
    "preview": "//\n//  XYStoreProtocol.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/20.\n//\n\n#ifndef XYStoreProtocol_h\n#define XYStor"
  },
  {
    "path": "XYIAPKit/Persistence/KeychainPersistence/XYStoreKeychainPersistence.h",
    "chars": 1647,
    "preview": "//\n//  XYStoreKeychainPersistence.h\n//  AFNetworking\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import <Foundation/F"
  },
  {
    "path": "XYIAPKit/Persistence/KeychainPersistence/XYStoreKeychainPersistence.m",
    "chars": 5978,
    "preview": "//\n//  XYStoreKeychainPersistence.m\n//  AFNetworking\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import \"XYStoreKeych"
  },
  {
    "path": "XYIAPKit/Persistence/UserDefaultPersistence/XYStoreTransaction.h",
    "chars": 614,
    "preview": "//\n//  XYStoreTransaction.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import <Foundation/Foundation.h>\n#im"
  },
  {
    "path": "XYIAPKit/Persistence/UserDefaultPersistence/XYStoreTransaction.m",
    "chars": 2266,
    "preview": "//\n//  XYStoreTransaction.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import \"XYStoreTransaction.h\"\n\nNSStr"
  },
  {
    "path": "XYIAPKit/Persistence/UserDefaultPersistence/XYStoreUserDefaultsPersistence.h",
    "chars": 2521,
    "preview": "//\n//  XYStoreUserDefaultsPersistence.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import <Foundation/Found"
  },
  {
    "path": "XYIAPKit/Persistence/UserDefaultPersistence/XYStoreUserDefaultsPersistence.m",
    "chars": 5230,
    "preview": "//\n//  XYStoreUserDefaultsPersistence.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import \"XYStoreUserDefau"
  },
  {
    "path": "XYIAPKit/Receipt/LocalReceiptVerify/XYAppReceipt.h",
    "chars": 8308,
    "preview": "//\n//  XYAppReceipt.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import <Foundation/Foundation.h>\n\n/** Repr"
  },
  {
    "path": "XYIAPKit/Receipt/LocalReceiptVerify/XYAppReceipt.m",
    "chars": 13941,
    "preview": "//\n//  XYAppReceipt.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import \"XYAppReceipt.h\"\n#import <UIKit/UIK"
  },
  {
    "path": "XYIAPKit/Receipt/LocalReceiptVerify/XYStoreAppReceiptVerifier.h",
    "chars": 1058,
    "preview": "//\n//  XYStoreAppReceiptVerifier.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import <Foundation/Foundation"
  },
  {
    "path": "XYIAPKit/Receipt/LocalReceiptVerify/XYStoreAppReceiptVerifier.m",
    "chars": 3432,
    "preview": "//\n//  XYStoreAppReceiptVerifier.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/19.\n//\n\n#import \"XYStoreAppReceiptVeri"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/NSDate+XYStoreExtension.h",
    "chars": 540,
    "preview": "//\n//  NSDate+XYStoreExtension.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/3.\n//\n\n#import <Foundation/Foundation.h>"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/NSDate+XYStoreExtension.m",
    "chars": 1300,
    "preview": "//\n//  NSDate+XYStoreExtension.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/3.\n//\n\n#import \"NSDate+XYStoreExtension."
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYInAppReceipt.h",
    "chars": 7994,
    "preview": "//\n//  XYInAppReceipt.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/3.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n 具体"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYInAppReceipt.m",
    "chars": 1252,
    "preview": "//\n//  XYInAppReceipt.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/3.\n//\n\n#import \"XYInAppReceipt.h\"\n#import \"NSDate"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYStoreiTunesReceiptVerifier.h",
    "chars": 1510,
    "preview": "//\n//  XYStoreiTunesReceiptVerifier.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/2.\n//\n\n#import <Foundation/Foundati"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYStoreiTunesReceiptVerifier.m",
    "chars": 12072,
    "preview": "//\n//  XYStoreiTunesReceiptVerifier.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/2.\n//\n\n#import \"XYStoreiTunesReceip"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesReceipt.h",
    "chars": 1795,
    "preview": "//\n//  XYiTunesReceipt.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/2.\n//\n\n#import <Foundation/Foundation.h>\n#import"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesReceipt.m",
    "chars": 1267,
    "preview": "//\n//  XYiTunesReceipt.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/2.\n//\n\n#import \"XYiTunesReceipt.h\"\n#import \"NSDa"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesResponse.h",
    "chars": 4785,
    "preview": "//\n//  XYiTunesResponse.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/2.\n//\n\n#import <Foundation/Foundation.h>\n#impor"
  },
  {
    "path": "XYIAPKit/Receipt/iTunesReceiptVerify/XYiTunesResponse.m",
    "chars": 461,
    "preview": "//\n//  XYiTunesResponse.m\n//  Pods\n//\n//  Created by qichao.ma on 2018/5/2.\n//\n\n#import \"XYiTunesResponse.h\"\n\n@implement"
  },
  {
    "path": "XYIAPKit/XYIAPKit.h",
    "chars": 157,
    "preview": "//\n//  XYIAPKit.h\n//  Pods\n//\n//  Created by qichao.ma on 2018/4/21.\n//\n\n#ifndef XYIAPKit_h\n#define XYIAPKit_h\n\n#import "
  },
  {
    "path": "XYIAPKit.podspec",
    "chars": 1789,
    "preview": "#\n# Be sure to run `pod lib lint XYIAPKit.podspec' to ensure this is a\n# valid spec before submitting.\n#\n# Any lines sta"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the MQCCoder/XYIAPKit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 101 files (414.4 KB), approximately 115.6k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!