├── .gitignore ├── LICENSE ├── Podfile ├── Podfile.lock ├── Pods ├── Crashlytics │ ├── Crashlytics.framework │ │ ├── README │ │ └── submit │ ├── OSX │ │ └── Crashlytics.framework │ │ │ ├── Crashlytics │ │ │ ├── Headers │ │ │ ├── Modules │ │ │ ├── Resources │ │ │ ├── Versions │ │ │ ├── A │ │ │ │ ├── Crashlytics │ │ │ │ ├── Headers │ │ │ │ │ ├── ANSCompatibility.h │ │ │ │ │ ├── Answers.h │ │ │ │ │ ├── CLSAttributes.h │ │ │ │ │ ├── CLSLogging.h │ │ │ │ │ ├── CLSReport.h │ │ │ │ │ ├── CLSStackFrame.h │ │ │ │ │ └── Crashlytics.h │ │ │ │ ├── Modules │ │ │ │ │ └── module.modulemap │ │ │ │ └── Resources │ │ │ │ │ └── Info.plist │ │ │ └── Current │ │ │ ├── run │ │ │ ├── submit │ │ │ └── uploadDSYM │ ├── README.md │ └── submit ├── Fabric │ ├── Fabric.framework │ │ ├── README │ │ └── run │ ├── OSX │ │ └── Fabric.framework │ │ │ ├── Fabric │ │ │ ├── Headers │ │ │ ├── Modules │ │ │ ├── Resources │ │ │ ├── Versions │ │ │ ├── A │ │ │ │ ├── Fabric │ │ │ │ ├── Headers │ │ │ │ │ ├── FABAttributes.h │ │ │ │ │ └── Fabric.h │ │ │ │ ├── Modules │ │ │ │ │ └── module.modulemap │ │ │ │ └── Resources │ │ │ │ │ └── Info.plist │ │ │ └── Current │ │ │ ├── run │ │ │ └── uploadDSYM │ ├── README.md │ ├── run │ ├── upload-symbols │ └── uploadDSYM ├── HappyDNS │ ├── HappyDNS │ │ ├── Assessment │ │ │ ├── QNAssessment.h │ │ │ ├── QNAssessment.m │ │ │ ├── QNIpModel.h │ │ │ └── QNIpModel.m │ │ ├── Common │ │ │ ├── QNDnsManager.h │ │ │ ├── QNDnsManager.m │ │ │ ├── QNDomain.h │ │ │ ├── QNDomain.m │ │ │ ├── QNLruCache.h │ │ │ ├── QNLruCache.m │ │ │ ├── QNNetworkInfo.h │ │ │ ├── QNNetworkInfo.m │ │ │ ├── QNRecord.h │ │ │ ├── QNRecord.m │ │ │ └── QNResolverDelegate.h │ │ ├── HappyDNS.h │ │ ├── Http │ │ │ ├── QNDnspodEnterprise.h │ │ │ ├── QNDnspodEnterprise.m │ │ │ ├── QNDnspodFree.h │ │ │ ├── QNDnspodFree.m │ │ │ ├── QNNiuDns.h │ │ │ └── QNNiuDns.m │ │ ├── Local │ │ │ ├── QNHijackingDetectWrapper.h │ │ │ ├── QNHijackingDetectWrapper.m │ │ │ ├── QNHosts.h │ │ │ ├── QNHosts.m │ │ │ ├── QNResolvUtil.h │ │ │ ├── QNResolvUtil.m │ │ │ ├── QNResolver.h │ │ │ ├── QNResolver.m │ │ │ ├── QNTxtResolver.h │ │ │ └── QNTxtResolver.m │ │ ├── QNRefresher.h │ │ ├── QNRefresher.m │ │ └── Util │ │ │ ├── QNDes.h │ │ │ ├── QNDes.m │ │ │ ├── QNGetAddrInfo.h │ │ │ ├── QNGetAddrInfo.m │ │ │ ├── QNHex.h │ │ │ ├── QNHex.m │ │ │ ├── QNIP.h │ │ │ ├── QNIP.m │ │ │ ├── QNMD5.h │ │ │ └── QNMD5.m │ ├── LICENSE │ └── README.md ├── MASShortcut │ ├── Framework │ │ ├── MASDictionaryTransformer.h │ │ ├── MASDictionaryTransformer.m │ │ ├── MASHotKey.h │ │ ├── MASHotKey.m │ │ ├── MASKeyCodes.h │ │ ├── MASKeyMasks.h │ │ ├── MASLocalization.h │ │ ├── MASLocalization.m │ │ ├── MASShortcut.h │ │ ├── MASShortcut.m │ │ ├── MASShortcut.modulemap │ │ ├── MASShortcutBinder.h │ │ ├── MASShortcutBinder.m │ │ ├── MASShortcutMonitor.h │ │ ├── MASShortcutMonitor.m │ │ ├── MASShortcutValidator.h │ │ ├── MASShortcutValidator.m │ │ ├── MASShortcutView+Bindings.h │ │ ├── MASShortcutView+Bindings.m │ │ ├── MASShortcutView.h │ │ ├── MASShortcutView.m │ │ └── Shortcut.h │ ├── LICENSE │ ├── README.md │ ├── cs.lproj │ │ └── Localizable.strings │ ├── de.lproj │ │ └── Localizable.strings │ ├── en.lproj │ │ └── Localizable.strings │ ├── es.lproj │ │ └── Localizable.strings │ ├── fr.lproj │ │ └── Localizable.strings │ ├── it.lproj │ │ └── Localizable.strings │ ├── ja.lproj │ │ └── Localizable.strings │ ├── ko.lproj │ │ └── Localizable.strings │ ├── nl.lproj │ │ └── Localizable.strings │ ├── pl.lproj │ │ └── Localizable.strings │ ├── ru.lproj │ │ └── Localizable.strings │ ├── zh-Hans.lproj │ │ └── Localizable.strings │ └── zh-Hant.lproj │ │ └── Localizable.strings ├── Manifest.lock ├── Pods.xcodeproj │ └── project.pbxproj ├── Qiniu │ ├── LICENSE │ ├── QiniuSDK │ │ ├── BigData │ │ │ ├── QNPipeline.h │ │ │ └── QNPipeline.m │ │ ├── Common │ │ │ ├── QNALAssetFile.h │ │ │ ├── QNALAssetFile.m │ │ │ ├── QNAsyncRun.h │ │ │ ├── QNAsyncRun.m │ │ │ ├── QNCrc32.h │ │ │ ├── QNCrc32.m │ │ │ ├── QNEtag.h │ │ │ ├── QNEtag.m │ │ │ ├── QNFile.h │ │ │ ├── QNFile.m │ │ │ ├── QNFileDelegate.h │ │ │ ├── QNPHAssetFile.h │ │ │ ├── QNPHAssetFile.m │ │ │ ├── QNPHAssetResource.h │ │ │ ├── QNPHAssetResource.m │ │ │ ├── QNSystem.h │ │ │ ├── QNSystem.m │ │ │ ├── QNUrlSafeBase64.h │ │ │ ├── QNUrlSafeBase64.m │ │ │ ├── QNVersion.h │ │ │ ├── QN_GTM_Base64.h │ │ │ └── QN_GTM_Base64.m │ │ ├── Http │ │ │ ├── QNHttpDelegate.h │ │ │ ├── QNResponseInfo.h │ │ │ ├── QNResponseInfo.m │ │ │ ├── QNSessionManager.h │ │ │ ├── QNSessionManager.m │ │ │ ├── QNUserAgent.h │ │ │ └── QNUserAgent.m │ │ ├── QiniuSDK.h │ │ ├── Recorder │ │ │ ├── QNFileRecorder.h │ │ │ ├── QNFileRecorder.m │ │ │ └── QNRecorderDelegate.h │ │ └── Storage │ │ │ ├── QNConfiguration.h │ │ │ ├── QNConfiguration.m │ │ │ ├── QNFormUpload.h │ │ │ ├── QNFormUpload.m │ │ │ ├── QNResumeUpload.h │ │ │ ├── QNResumeUpload.m │ │ │ ├── QNUpToken.h │ │ │ ├── QNUpToken.m │ │ │ ├── QNUploadManager.h │ │ │ ├── QNUploadManager.m │ │ │ ├── QNUploadOption+Private.h │ │ │ ├── QNUploadOption.h │ │ │ └── QNUploadOption.m │ └── README.md ├── RNCryptor │ ├── LICENSE │ ├── README.md │ └── Sources │ │ ├── Cryptor │ │ └── include │ │ │ └── RNCryptor.h │ │ └── RNCryptor │ │ └── RNCryptor.swift └── Target Support Files │ ├── HappyDNS │ ├── HappyDNS-dummy.m │ ├── HappyDNS-prefix.pch │ ├── HappyDNS-umbrella.h │ ├── HappyDNS.modulemap │ ├── HappyDNS.xcconfig │ └── Info.plist │ ├── MASShortcut │ ├── Info.plist │ ├── MASShortcut-dummy.m │ ├── MASShortcut-prefix.pch │ ├── MASShortcut-umbrella.h │ ├── MASShortcut.modulemap │ ├── MASShortcut.xcconfig │ └── ResourceBundle-MASShortcut-Info.plist │ ├── Pods-cuImage │ ├── Info.plist │ ├── Pods-cuImage-acknowledgements.markdown │ ├── Pods-cuImage-acknowledgements.plist │ ├── Pods-cuImage-dummy.m │ ├── Pods-cuImage-frameworks.sh │ ├── Pods-cuImage-resources.sh │ ├── Pods-cuImage-umbrella.h │ ├── Pods-cuImage.debug.xcconfig │ ├── Pods-cuImage.modulemap │ └── Pods-cuImage.release.xcconfig │ ├── Qiniu │ ├── Info.plist │ ├── Qiniu-dummy.m │ ├── Qiniu-prefix.pch │ ├── Qiniu-umbrella.h │ ├── Qiniu.modulemap │ └── Qiniu.xcconfig │ └── RNCryptor │ ├── Info.plist │ ├── RNCryptor-dummy.m │ ├── RNCryptor-prefix.pch │ ├── RNCryptor-umbrella.h │ ├── RNCryptor.modulemap │ └── RNCryptor.xcconfig ├── README.md ├── cuImage.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── hulz.xcuserdatad │ └── xcschemes │ ├── cuImage.xcscheme │ └── xcschememanagement.plist ├── cuImage.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── cuImage ├── AboutWindowController.swift ├── AppDelegate.swift ├── AppImageView.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── AppIcon@1024pt.png │ │ ├── AppIcon@128pt.png │ │ ├── AppIcon@16pt.png │ │ ├── AppIcon@256pt-1.png │ │ ├── AppIcon@256pt.png │ │ ├── AppIcon@32pt-1.png │ │ ├── AppIcon@32pt.png │ │ ├── AppIcon@512pt-1.png │ │ ├── AppIcon@512pt.png │ │ ├── AppIcon@64pt.png │ │ └── Contents.json │ ├── Contents.json │ ├── Hosts │ │ ├── Contents.json │ │ └── QiniuHost.imageset │ │ │ ├── Contents.json │ │ │ ├── QiniuHost.png │ │ │ ├── QiniuHost@2x.png │ │ │ └── QiniuHost@3x.png │ ├── Misc │ │ ├── Contents.json │ │ ├── DraggingDestinationBox.imageset │ │ │ ├── Contents.json │ │ │ ├── DraggingDestinationBox.png │ │ │ ├── DraggingDestinationBox@2x.png │ │ │ └── DraggingDestinationBox@3x.png │ │ ├── FailedIndicator.imageset │ │ │ ├── Contents.json │ │ │ ├── InvalidIndicator.png │ │ │ ├── InvalidIndicator@2x.png │ │ │ └── InvalidIndicator@3x.png │ │ ├── StatusItemIcon.imageset │ │ │ ├── Contents.json │ │ │ ├── StatusItemIcon.png │ │ │ ├── StatusItemIcon@2x.png │ │ │ └── StatusItemIcon@3x.png │ │ └── SucceededIndicator.imageset │ │ │ ├── Contents.json │ │ │ ├── ValidIndicator.png │ │ │ ├── ValidIndicator@2x.png │ │ │ └── ValidIndicator@3x.png │ ├── Preferences │ │ ├── Contents.json │ │ ├── GeneralPreferences.imageset │ │ │ ├── Contents.json │ │ │ ├── GeneralPreferences.png │ │ │ ├── GeneralPreferences@2x.png │ │ │ └── GeneralPreferences@3x.png │ │ ├── HostsPreferences.imageset │ │ │ ├── Contents.json │ │ │ ├── HostsPreferences.png │ │ │ ├── HostsPreferences@2x.png │ │ │ └── HostsPreferences@3x.png │ │ └── ShortcutsPreferences.imageset │ │ │ ├── Contents.json │ │ │ ├── ShortcutsPreferences.png │ │ │ ├── ShortcutsPreferences@2x.png │ │ │ └── ShortcutsPreferences@3x.png │ ├── Sounds │ │ ├── AlertSound.dataset │ │ │ ├── AlertSound.aiff │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── DropSound.dataset │ │ │ ├── Contents.json │ │ │ └── restore from trash.aif │ └── UploadProgress │ │ ├── Contents.json │ │ ├── UploadProgress0.imageset │ │ ├── Contents.json │ │ ├── UploadProgress0.png │ │ ├── UploadProgress0@2x.png │ │ └── UploadProgress0@3x.png │ │ ├── UploadProgress1.imageset │ │ ├── Contents.json │ │ ├── UploadProgress1.png │ │ ├── UploadProgress1@2x.png │ │ └── UploadProgress1@3x.png │ │ ├── UploadProgress10.imageset │ │ ├── Contents.json │ │ ├── UploadProgress10.png │ │ ├── UploadProgress10@2x.png │ │ └── UploadProgress10@3x.png │ │ ├── UploadProgress11.imageset │ │ ├── Contents.json │ │ ├── UploadProgress11.png │ │ ├── UploadProgress11@2x.png │ │ └── UploadProgress11@3x.png │ │ ├── UploadProgress12.imageset │ │ ├── Contents.json │ │ ├── UploadProgress12.png │ │ ├── UploadProgress12@2x.png │ │ └── UploadProgress12@3x.png │ │ ├── UploadProgress2.imageset │ │ ├── Contents.json │ │ ├── UploadProgress2.png │ │ ├── UploadProgress2@2x.png │ │ └── UploadProgress2@3x.png │ │ ├── UploadProgress3.imageset │ │ ├── Contents.json │ │ ├── UploadProgress3.png │ │ ├── UploadProgress3@2x.png │ │ └── UploadProgress3@3x.png │ │ ├── UploadProgress4.imageset │ │ ├── Contents.json │ │ ├── UploadProgress4.png │ │ ├── UploadProgress4@2x.png │ │ └── UploadProgress4@3x.png │ │ ├── UploadProgress5.imageset │ │ ├── Contents.json │ │ ├── UploadProgress5.png │ │ ├── UploadProgress5@2x.png │ │ └── UploadProgress5@3x.png │ │ ├── UploadProgress6.imageset │ │ ├── Contents.json │ │ ├── UploadProgress6.png │ │ ├── UploadProgress6@2x.png │ │ └── UploadProgress6@3x.png │ │ ├── UploadProgress7.imageset │ │ ├── Contents.json │ │ ├── UploadProgress7.png │ │ ├── UploadProgress7@2x.png │ │ └── UploadProgress7@3x.png │ │ ├── UploadProgress8.imageset │ │ ├── Contents.json │ │ ├── UploadProgress8.png │ │ ├── UploadProgress8@2x.png │ │ └── UploadProgress8@3x.png │ │ └── UploadProgress9.imageset │ │ ├── Contents.json │ │ ├── UploadProgress9.png │ │ ├── UploadProgress9@2x.png │ │ └── UploadProgress9@3x.png ├── Base.lproj │ ├── AboutWindowController.xib │ ├── GeneralPreferencesPaneController.xib │ ├── HostsPreferencesPaneController.xib │ ├── MainMenu.xib │ ├── PreferencesWindowController.xib │ ├── QiniuHostInfoViewController.xib │ ├── ShortcutsPreferencesPaneController.xib │ └── StatusItemController.xib ├── BasePreferencesPaneController.swift ├── BaseViewController.swift ├── BaseWindowController.swift ├── Constants.swift ├── CoreDataController.swift ├── Data+Base64.swift ├── DataModel.xcdatamodeld │ └── DataModel.xcdatamodel │ │ └── contents ├── Date+Formatter.swift ├── GeneralPreferencesPaneController.swift ├── Host.swift ├── HostInfo.swift ├── HostInfoViewController.swift ├── HostsPreferencesPaneController.swift ├── Info.plist ├── IntegerToStringTransformer.swift ├── LocalizedStrings.swift ├── MASShortcut+Convenience.swift ├── Model.xcdatamodeld │ └── Model.xcdatamodel │ │ └── contents ├── NSAlert+Convenience.swift ├── NSAttributedString+Convenience.swift ├── NSBitmapImageFileType+String.swift ├── NSImage+Convenience.swift ├── NSMenuItem+KeyEquivalent.swift ├── NSPasteboard+Convenience.swift ├── NSUserNotificationCenter+Convenience.swift ├── PreferenceManager.swift ├── PreferencesWindowController.swift ├── QiniuHost.swift ├── QiniuHostInfo.swift ├── QiniuHostInfoViewController.swift ├── ServicesProvider.swift ├── ShortcutManager.swift ├── ShortcutsPreferencesPaneController.swift ├── StatusItemController.swift ├── StatusItemView.swift ├── String+Crypto.swift ├── String+Random.swift ├── URL+Convenience.swift ├── UploadManager.swift ├── Utilities.swift ├── cuImage-Bridging-Header.h ├── cuImage.entitlements └── zh-Hans.lproj │ ├── AboutWindowController.strings │ ├── GeneralPreferencesPaneController.strings │ ├── HostsPreferencesPaneController.strings │ ├── Localizable.strings │ ├── MainMenu.strings │ ├── PreferencesWindowController.strings │ ├── QiniuHostInfoViewController.strings │ ├── ServicesMenu.strings │ ├── ShortcutsPreferencesPaneController.strings │ └── StatusItemController.strings ├── cuImageLauncher ├── AppDelegate.h ├── AppDelegate.m ├── AppDelegate.swift ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ └── MainMenu.xib ├── Info.plist ├── cuImageLauncher.entitlements ├── main.m └── zh-Hans.lproj │ └── MainMenu.strings └── cuImageTests ├── Info.plist ├── NSPasteboardTests.swift ├── QiniuHostTests.swift ├── StringTests.swift └── URLTests.swift /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2017] [Lizhen Hu] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.11' 2 | inhibit_all_warnings! 3 | use_frameworks! 4 | 5 | target 'cuImage' do 6 | pod 'MASShortcut' 7 | pod 'RNCryptor', '~> 5.0' 8 | pod 'Qiniu', '~> 7.0' 9 | pod 'Fabric' 10 | pod 'Crashlytics' 11 | end 12 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Crashlytics (3.10.7): 3 | - Fabric (~> 1.7.11) 4 | - Fabric (1.7.11) 5 | - HappyDNS (0.3.14) 6 | - MASShortcut (2.3.6) 7 | - Qiniu (7.2.4): 8 | - HappyDNS (~> 0.3) 9 | - RNCryptor (5.0.3) 10 | 11 | DEPENDENCIES: 12 | - Crashlytics 13 | - Fabric 14 | - MASShortcut 15 | - Qiniu (~> 7.0) 16 | - RNCryptor (~> 5.0) 17 | 18 | SPEC REPOS: 19 | https://github.com/cocoapods/specs.git: 20 | - Crashlytics 21 | - Fabric 22 | - HappyDNS 23 | - MASShortcut 24 | - Qiniu 25 | - RNCryptor 26 | 27 | SPEC CHECKSUMS: 28 | Crashlytics: ccaac42660eb9351b9960c0d66106b0bcf99f4fa 29 | Fabric: f233c9492b3bbc1f04e3882986740f7988a58edb 30 | HappyDNS: dc6a164ee81979093123c241c6353bcf0218add6 31 | MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa 32 | Qiniu: 65384bca1cdb0480a68d9b9b8f54db53418c0355 33 | RNCryptor: c93d19029dcf7ff160aca0f24d6c9e7b0d82f664 34 | 35 | PODFILE CHECKSUM: 54242a6e77a2865c727b66b1224eb70d546c2242 36 | 37 | COCOAPODS: 1.5.3 38 | -------------------------------------------------------------------------------- /Pods/Crashlytics/Crashlytics.framework/README: -------------------------------------------------------------------------------- 1 | We've now combined all our supported platforms into a single podspec. As a result, we moved our submit script to a new location for Cocoapods projects: ${PODS_ROOT}/Crashlytics/submit. To avoid breaking functionality that references the old location of the submit, we've placed this dummy script that calls to the correct location, while providing a helpful warning if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! 2 | -------------------------------------------------------------------------------- /Pods/Crashlytics/Crashlytics.framework/submit: -------------------------------------------------------------------------------- 1 | if [[ -z $PODS_ROOT ]]; then 2 | echo "error: The submit binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Crashlytics/submit'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the submit binary to fix this issue." 3 | else 4 | echo "warning: The submit script is now located at '$"{"PODS_ROOT"}"/Crashlytics/submit'. To remove this warning, update your path to point to this new location." 5 | sh "${PODS_ROOT}/Crashlytics/submit" "$@" 6 | fi 7 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Crashlytics: -------------------------------------------------------------------------------- 1 | Versions/Current/Crashlytics -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Crashlytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Crashlytics -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/ANSCompatibility.h: -------------------------------------------------------------------------------- 1 | // 2 | // ANSCompatibility.h 3 | // AnswersKit 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #pragma once 9 | 10 | #if !__has_feature(nullability) 11 | #define nonnull 12 | #define nullable 13 | #define _Nullable 14 | #define _Nonnull 15 | #endif 16 | 17 | #ifndef NS_ASSUME_NONNULL_BEGIN 18 | #define NS_ASSUME_NONNULL_BEGIN 19 | #endif 20 | 21 | #ifndef NS_ASSUME_NONNULL_END 22 | #define NS_ASSUME_NONNULL_END 23 | #endif 24 | 25 | #if __has_feature(objc_generics) 26 | #define ANS_GENERIC_NSARRAY(type) NSArray 27 | #define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 28 | #else 29 | #define ANS_GENERIC_NSARRAY(type) NSArray 30 | #define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 31 | #endif 32 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/CLSAttributes.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSAttributes.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #pragma once 9 | 10 | #define CLS_DEPRECATED(x) __attribute__ ((deprecated(x))) 11 | 12 | #if !__has_feature(nullability) 13 | #define nonnull 14 | #define nullable 15 | #define _Nullable 16 | #define _Nonnull 17 | #endif 18 | 19 | #ifndef NS_ASSUME_NONNULL_BEGIN 20 | #define NS_ASSUME_NONNULL_BEGIN 21 | #endif 22 | 23 | #ifndef NS_ASSUME_NONNULL_END 24 | #define NS_ASSUME_NONNULL_END 25 | #endif 26 | 27 | #if __has_feature(objc_generics) 28 | #define CLS_GENERIC_NSARRAY(type) NSArray 29 | #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 30 | #else 31 | #define CLS_GENERIC_NSARRAY(type) NSArray 32 | #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 33 | #endif 34 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/CLSStackFrame.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSStackFrame.h 3 | // Crashlytics 4 | // 5 | // Copyright 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | #import "CLSAttributes.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /** 14 | * 15 | * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to 16 | * record information about non-ObjC/C++ exceptions. All information included here will be displayed 17 | * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the 18 | * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities 19 | * in the process. 20 | * 21 | **/ 22 | @interface CLSStackFrame : NSObject 23 | 24 | + (instancetype)stackFrame; 25 | + (instancetype)stackFrameWithAddress:(NSUInteger)address; 26 | + (instancetype)stackFrameWithSymbol:(NSString *)symbol; 27 | 28 | @property (nonatomic, copy, nullable) NSString *symbol; 29 | @property (nonatomic, copy, nullable) NSString *rawSymbol; 30 | @property (nonatomic, copy, nullable) NSString *library; 31 | @property (nonatomic, copy, nullable) NSString *fileName; 32 | @property (nonatomic, assign) uint32_t lineNumber; 33 | @property (nonatomic, assign) uint64_t offset; 34 | @property (nonatomic, assign) uint64_t address; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Crashlytics { 2 | header "Crashlytics.h" 3 | header "Answers.h" 4 | header "ANSCompatibility.h" 5 | header "CLSLogging.h" 6 | header "CLSReport.h" 7 | header "CLSStackFrame.h" 8 | header "CLSAttributes.h" 9 | 10 | export * 11 | 12 | link "z" 13 | link "c++" 14 | } 15 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 17G65 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | Crashlytics 11 | CFBundleIdentifier 12 | com.twitter.crashlytics.mac 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Crashlytics 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 3.10.7 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 130 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 9F2000 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 17E189 37 | DTSDKName 38 | macosx10.13 39 | DTXcode 40 | 0941 41 | DTXcodeBuild 42 | 9F2000 43 | NSHumanReadableCopyright 44 | Copyright © 2016 Crashlytics, Inc. All rights reserved. 45 | UIDeviceFamily 46 | 47 | 1 48 | 2 49 | 3 50 | 4 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/submit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Crashlytics/OSX/Crashlytics.framework/submit -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Crashlytics/OSX/Crashlytics.framework/uploadDSYM -------------------------------------------------------------------------------- /Pods/Crashlytics/README.md: -------------------------------------------------------------------------------- 1 | ![Crashlytics Header](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-crashlytics-header.png) 2 | 3 | Part of [Google Fabric](https://get.fabric.io), [Crashlytics](http://try.crashlytics.com/) offers the most powerful, yet lightest weight crash reporting solution for iOS. Crashlytics also provides real-time analytics through [Answers](https://answers.io/) and app distributions to testers using [Beta](http://try.crashlytics.com/beta/). 4 | 5 | ## Setup 6 | 7 | 1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app. 8 | 9 | 1. Open Fabric.app, login and select the Crashlytics SDK. 10 | 11 | ![Fabric Plugin](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-plugin.png) 12 | 13 | 1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode. 14 | 15 | ![Fabric Installation Options](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-pod-installation-option.png) 16 | 17 | 1. Select the Podfile option and follow the installation instructions to update your Podfile. **Note:** the Crashlytics Pod includes Answers. If you have Answers included as a separate Pod it should be removed from your Podfile to avoid duplicate symbol errors. 18 | 19 | ``` 20 | pod 'Fabric' 21 | pod 'Crashlytics' 22 | ``` 23 | 24 | 1. Run `pod install` 25 | 26 | 1. Add a Run Script Build Phase and build your app. 27 | 28 | ![Fabric Run Script Build Phase](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-rsbp.png) 29 | 30 | 1. Initialize the SDK by inserting code outlined in the Fabric.app. 31 | 32 | 1. Run your app to finish the installation. 33 | 34 | ## Resources 35 | 36 | * [Documentation](https://docs.fabric.io/apple/crashlytics/overview.html) 37 | * [Forums](https://stackoverflow.com/questions/tagged/google-fabric) 38 | * [Website](http://try.crashlytics.com/) 39 | * Follow us on Twitter: [@fabric](https://twitter.com/fabric) and [@crashlytics](https://twitter.com/crashlytics) 40 | -------------------------------------------------------------------------------- /Pods/Crashlytics/submit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Crashlytics/submit -------------------------------------------------------------------------------- /Pods/Fabric/Fabric.framework/README: -------------------------------------------------------------------------------- 1 | We've now combined all our supported platforms into a single podspec. As a result, we moved our run script to a new location for Cocoapods projects: ${PODS_ROOT}/Fabric/run. To avoid breaking builds that reference the old location of the run script, we've placed this dummy script that calls to the correct location, while providing a helpful warning in Xcode if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! 2 | -------------------------------------------------------------------------------- /Pods/Fabric/Fabric.framework/run: -------------------------------------------------------------------------------- 1 | if [[ -z $PODS_ROOT ]]; then 2 | echo "error: The run binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Fabric/run'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the run binary to fix this issue." 3 | else 4 | echo "warning: The run script is now located at '$"{"PODS_ROOT"}"/Fabric/run'. To remove this warning, update your Run Script Build Phase to point to this new location." 5 | sh "${PODS_ROOT}/Fabric/run" "$@" 6 | fi 7 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Fabric: -------------------------------------------------------------------------------- 1 | Versions/Current/Fabric -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Fabric: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Fabric/OSX/Fabric.framework/Versions/A/Fabric -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Headers/FABAttributes.h: -------------------------------------------------------------------------------- 1 | // 2 | // FABAttributes.h 3 | // Fabric 4 | // 5 | // Copyright (C) 2015 Twitter, Inc. 6 | // 7 | // Licensed under the Apache License, Version 2.0 (the "License"); 8 | // you may not use this file except in compliance with the License. 9 | // You may obtain a copy of the License at 10 | // 11 | // http://www.apache.org/licenses/LICENSE-2.0 12 | // 13 | // Unless required by applicable law or agreed to in writing, software 14 | // distributed under the License is distributed on an "AS IS" BASIS, 15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | // See the License for the specific language governing permissions and 17 | // limitations under the License. 18 | // 19 | 20 | #pragma once 21 | 22 | #define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) 23 | 24 | #if !__has_feature(nullability) 25 | #define nonnull 26 | #define nullable 27 | #define _Nullable 28 | #define _Nonnull 29 | #endif 30 | 31 | #ifndef NS_ASSUME_NONNULL_BEGIN 32 | #define NS_ASSUME_NONNULL_BEGIN 33 | #endif 34 | 35 | #ifndef NS_ASSUME_NONNULL_END 36 | #define NS_ASSUME_NONNULL_END 37 | #endif 38 | 39 | 40 | /** 41 | * The following macros are defined here to provide 42 | * backwards compatability. If you are still using 43 | * them you should migrate to the native nullability 44 | * macros. 45 | */ 46 | #define fab_nullable nullable 47 | #define fab_nonnull nonnull 48 | #define FAB_NONNULL __fab_nonnull 49 | #define FAB_NULLABLE __fab_nullable 50 | #define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN 51 | #define FAB_END_NONNULL NS_ASSUME_NONNULL_END 52 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Fabric { 2 | umbrella header "Fabric.h" 3 | 4 | export * 5 | module * { export * } 6 | } -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 17G65 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Fabric 11 | CFBundleIdentifier 12 | io.fabric.sdk.mac 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Fabric 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.7.11 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 70 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 9F2000 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 17E189 37 | DTSDKName 38 | macosx10.13 39 | DTXcode 40 | 0941 41 | DTXcodeBuild 42 | 9F2000 43 | NSHumanReadableCopyright 44 | Copyright © 2015 Twitter. All rights reserved. 45 | UIDeviceFamily 46 | 47 | 1 48 | 2 49 | 3 50 | 4 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Fabric/OSX/Fabric.framework/uploadDSYM -------------------------------------------------------------------------------- /Pods/Fabric/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Fabric/upload-symbols: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Fabric/upload-symbols -------------------------------------------------------------------------------- /Pods/Fabric/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/Pods/Fabric/uploadDSYM -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Assessment/QNAssessment.h: -------------------------------------------------------------------------------- 1 | // 2 | // Assessment.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/19. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNJudge : NSObject 12 | 13 | @end 14 | 15 | @interface QNAssessment : NSObject 16 | 17 | - (void)submitErrorRecord; 18 | - (void)submitSpeedRecord; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Assessment/QNAssessment.m: -------------------------------------------------------------------------------- 1 | // 2 | // Assessment.m 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/19. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNAssessment.h" 10 | 11 | @implementation QNAssessment 12 | 13 | - (void)submitErrorRecord { 14 | } 15 | - (void)submitSpeedRecord { 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Assessment/QNIpModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // HistoryModel.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/19. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNIpModel : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Assessment/QNIpModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // HistoryModel.m 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/19. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNIpModel.h" 10 | 11 | @implementation QNIpModel 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNDomain.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNDomain.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNDomain : NSObject 12 | @property (nonatomic, strong, readonly) NSString *domain; 13 | 14 | // 用来判断劫持 15 | @property (nonatomic, readonly) BOOL hasCname; 16 | // 用来判断劫持 17 | @property (nonatomic, readonly) int maxTtl; 18 | 19 | @property (nonatomic, readonly) BOOL hostsFirst; 20 | 21 | - (instancetype)init:(NSString *)domain; 22 | 23 | - (instancetype)init:(NSString *)domain hostsFirst:(BOOL)hostsFirst hasCname:(BOOL)hasCname; 24 | 25 | - (instancetype)init:(NSString *)domain hostsFirst:(BOOL)hostsFirst hasCname:(BOOL)hasCname maxTtl:(int)maxTtl; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNDomain.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNDomain.m 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNDomain.h" 10 | 11 | @implementation QNDomain 12 | - (instancetype)init:(NSString *)domain { 13 | return [self init:domain hostsFirst:NO hasCname:NO maxTtl:0]; 14 | } 15 | 16 | - (instancetype)init:(NSString *)domain hostsFirst:(BOOL)hostsFirst hasCname:(BOOL)hasCname { 17 | return [self init:domain hostsFirst:hostsFirst hasCname:hasCname maxTtl:0]; 18 | } 19 | 20 | - (instancetype)init:(NSString *)domain hostsFirst:(BOOL)hostsFirst hasCname:(BOOL)hasCname maxTtl:(int)maxTtl { 21 | if (self = [super init]) { 22 | _domain = domain; 23 | _hasCname = hasCname; 24 | _maxTtl = maxTtl; 25 | _hostsFirst = hostsFirst; 26 | } 27 | return self; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNLruCache.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNLruCache.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/5. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNLruCache : NSObject 12 | 13 | - (instancetype)init:(NSUInteger)limit; 14 | 15 | - (void)removeAllObjects; 16 | 17 | - (void)removeObjectForKey:(NSString *)key; 18 | 19 | - (id)objectForKey:(NSString *)key; 20 | 21 | - (void)setObject:(id)obj forKey:(NSString *)key; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNNetworkInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNNetworkInfo.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/25. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern const int kQNNO_NETWORK; 12 | extern const int kQNWIFI; 13 | extern const int kQNMOBILE; 14 | 15 | extern const int kQNISP_GENERAL; 16 | extern const int kQNISP_CTC; 17 | extern const int kQNISP_DIANXIN; 18 | extern const int kQNISP_CNC; 19 | extern const int kQNISP_LIANTONG; 20 | extern const int kQNISP_CMCC; 21 | extern const int kQNISP_YIDONG; 22 | extern const int kQNISP_OTHER; 23 | 24 | @interface QNNetworkInfo : NSObject 25 | 26 | @property (nonatomic, readonly) int networkConnection; 27 | @property (nonatomic, readonly) int provider; 28 | 29 | - (instancetype)init:(int)connecton provider:(int)provider; 30 | 31 | - (BOOL)isEqual:(id)other; 32 | - (BOOL)isEqualToInfo:(QNNetworkInfo *)info; 33 | 34 | + (instancetype)noNet; 35 | 36 | + (instancetype)normal; 37 | 38 | + (BOOL)isNetworkChanged; 39 | 40 | + (NSString *)getIp; 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNRecord.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNRecord.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * A 记录 13 | */ 14 | extern const int kQNTypeA; 15 | 16 | /** 17 | * AAAA 记录 18 | */ 19 | extern const int kQNTypeAAAA; 20 | 21 | /** 22 | * Cname 记录 23 | */ 24 | extern const int kQNTypeCname; 25 | 26 | /** 27 | * Txt 记录 28 | */ 29 | extern const int kQNTypeTXT; 30 | 31 | @interface QNRecord : NSObject 32 | @property (nonatomic, strong, readonly) NSString *value; 33 | @property (nonatomic, readonly) int ttl; 34 | @property (nonatomic, readonly) int type; 35 | @property (nonatomic, readonly) long long timeStamp; 36 | 37 | - (instancetype)init:(NSString *)value 38 | ttl:(int)ttl 39 | type:(int)type; 40 | 41 | - (BOOL)expired:(long long)time; 42 | @end 43 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNRecord.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNRecord.m 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNRecord.h" 10 | 11 | const int kQNTypeA = 1; 12 | const int kQNTypeAAAA = 28; 13 | const int kQNTypeCname = 5; 14 | const int kQNTypeTXT = 16; 15 | 16 | @implementation QNRecord 17 | - (instancetype)init:(NSString *)value 18 | ttl:(int)ttl 19 | type:(int)type { 20 | if (self = [super init]) { 21 | _value = value; 22 | _type = type; 23 | _ttl = ttl; 24 | _timeStamp = [[NSDate date] timeIntervalSince1970]; 25 | } 26 | return self; 27 | } 28 | 29 | - (BOOL)expired:(long long)time { 30 | return time > _timeStamp + _ttl; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Common/QNResolverDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNResolverDelegate.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern const int kQNDomainHijackingCode; 12 | extern const int kQNDomainNotOwnCode; 13 | extern const int kQNDomainSeverError; 14 | 15 | #define QN_DNS_DEFAULT_TIMEOUT 20 //seconds 16 | 17 | @class QNDomain; 18 | @class QNNetworkInfo; 19 | @protocol QNResolverDelegate 20 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError **)error; 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/HappyDNS.h: -------------------------------------------------------------------------------- 1 | // 2 | // HappyDNS.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/24. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "QNDnsManager.h" 12 | #import "QNDnspodEnterprise.h" 13 | #import "QNDnspodFree.h" 14 | #import "QNDomain.h" 15 | #import "QNHijackingDetectWrapper.h" 16 | #import "QNIP.h" 17 | #import "QNNetworkInfo.h" 18 | #import "QNRecord.h" 19 | #import "QNResolver.h" 20 | #import "QNResolverDelegate.h" 21 | 22 | #import "QNGetAddrInfo.h" -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Http/QNDnspodEnterprise.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNDnspodEnterprise.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/7/31. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNResolverDelegate.h" 10 | #import 11 | 12 | extern const int kQN_ENCRYPT_FAILED; 13 | extern const int kQN_DECRYPT_FAILED; 14 | 15 | @interface QNDnspodEnterprise : NSObject 16 | 17 | - (instancetype)initWithId:(NSString *)userId 18 | key:(NSString *)key; 19 | 20 | - (instancetype)initWithId:(NSString *)userId 21 | key:(NSString *)key 22 | server:(NSString *)server; 23 | 24 | - (instancetype)initWithId:(NSString *)userId 25 | key:(NSString *)key 26 | server:(NSString *)server 27 | timeout:(NSUInteger)time; 28 | 29 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error; 30 | @end 31 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Http/QNDnspodFree.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNDnspodFree.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNResolverDelegate.h" 10 | #import 11 | 12 | @interface QNDnspodFree : NSObject 13 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error; 14 | 15 | - (instancetype)init; 16 | - (instancetype)initWithServer:(NSString *)server; 17 | - (instancetype)initWithServer:(NSString *)server 18 | timeout:(NSUInteger)time; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Http/QNNiuDns.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNNiuDns.h 3 | // HappyDNS 4 | // 5 | // Created by 何昊宇 on 2018/3/8. 6 | // Copyright © 2018年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNResolverDelegate.h" 10 | #import 11 | 12 | @interface QNNiuDns : NSObject 13 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error; 14 | 15 | @property (nonatomic, strong, readonly) NSString *accountId; 16 | 17 | @property (nonatomic, strong, readonly) NSString *encryptKey; 18 | 19 | /** 20 | * 单位 s 21 | */ 22 | @property (nonatomic, assign, readonly) long expireTime; 23 | 24 | 25 | @property (nonatomic, assign, readonly) BOOL isHttps; 26 | 27 | @property (nonatomic, assign, readonly) BOOL isNeedEncrypted; 28 | 29 | /** 30 | * http DNS 加密初始化 31 | */ 32 | - (instancetype)initWithAccountId:(NSString *)accountId 33 | encryptKey:(NSString *)encryptKey 34 | expireTime:(long)expireTime 35 | isHttps:(BOOL)isHttps 36 | isNeedEncrypted:(BOOL)isNeedEncrypted; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Local/QNHijackingDetectWrapper.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNHijackingDetectWrapper.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/7/16. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "QNResolverDelegate.h" 12 | 13 | @class QNResolver; 14 | @interface QNHijackingDetectWrapper : NSObject 15 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error; 16 | - (instancetype)initWithResolver:(QNResolver *)resolver; 17 | @end 18 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Local/QNHijackingDetectWrapper.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNHijackingDetectWrapper.m 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/7/16. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNHijackingDetectWrapper.h" 10 | #import "QNDomain.h" 11 | #import "QNRecord.h" 12 | #import "QNResolver.h" 13 | 14 | @interface QNHijackingDetectWrapper () 15 | @property (nonatomic, readonly) QNResolver *resolver; 16 | @end 17 | 18 | @implementation QNHijackingDetectWrapper 19 | 20 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error { 21 | NSArray *result = [_resolver query:domain networkInfo:netInfo error:error]; 22 | if (((!domain.hasCname) && domain.maxTtl == 0) || result == nil || result.count == 0) { 23 | return result; 24 | } 25 | BOOL hasCname = NO; 26 | BOOL outOfTtl = NO; 27 | for (int i = 0; i < result.count; i++) { 28 | QNRecord *record = [result objectAtIndex:i]; 29 | if (record.type == kQNTypeCname) { 30 | hasCname = YES; 31 | } 32 | if (domain.maxTtl > 0 && record.type == kQNTypeA && record.ttl > domain.maxTtl) { 33 | outOfTtl = YES; 34 | } 35 | } 36 | if ((domain.hasCname && !hasCname) || outOfTtl) { 37 | if (error != nil) { 38 | *error = [[NSError alloc] initWithDomain:domain.domain code:kQNDomainHijackingCode userInfo:nil]; 39 | } 40 | return nil; 41 | } 42 | return result; 43 | } 44 | - (instancetype)initWithResolver:(QNResolver *)resolver { 45 | if (self = [super init]) { 46 | _resolver = resolver; 47 | } 48 | return self; 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Local/QNHosts.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNHosts.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNResolverDelegate.h" 10 | #import 11 | 12 | @interface QNHosts : NSObject 13 | 14 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo; 15 | - (void)put:(NSString *)domain ip:(NSString *)ip; 16 | - (void)put:(NSString *)domain ip:(NSString *)ip provider:(int)provider; 17 | - (instancetype)init; 18 | @end 19 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Local/QNResolvUtil.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNResolv.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/5/28. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #ifndef QNResolv_h 10 | #define QNResolv_h 11 | 12 | extern BOOL isV6(NSString *address); 13 | 14 | extern int setup_dns_server(void *res, NSString *dns_server, NSUInteger timeout); 15 | 16 | #endif /* QNResolv_h */ 17 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Local/QNResolver.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNResolver.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/6/23. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNResolverDelegate.h" 10 | #import 11 | 12 | @interface QNResolver : NSObject 13 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error; 14 | 15 | // @deprecated typo 16 | - (instancetype)initWithAddres:(NSString *)address DEPRECATED_ATTRIBUTE; 17 | 18 | - (instancetype)initWithAddress:(NSString *)address; 19 | 20 | - (instancetype)initWithAddress:(NSString *)address 21 | timeout:(NSUInteger)time; 22 | 23 | + (instancetype)systemResolver; 24 | + (NSString *)systemDnsServer; 25 | @end 26 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Local/QNTxtResolver.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNTxtResolver.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/1/5. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNResolverDelegate.h" 10 | #import 11 | 12 | @interface QNTxtResolver : NSObject 13 | - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error; 14 | 15 | /** 16 | * 根据服务器地址进行初始化 17 | * 18 | * @param address DNS 服务器地址,nil 表示系统的 19 | */ 20 | - (instancetype)initWithAddress:(NSString *)address; 21 | 22 | - (instancetype)initWithAddress:(NSString *)address timeout:(NSUInteger)time; 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/QNRefresher.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNRefresher.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/20. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNRefresher : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/QNRefresher.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNRefresher.m 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/20. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNRefresher.h" 10 | 11 | @implementation QNRefresher 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Util/QNDes.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNDes.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/8/1. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern const int kQN_ENCRYPT_FAILED; 12 | extern const int kQN_DECRYPT_FAILED; 13 | 14 | @interface QNDes : NSObject 15 | 16 | - (NSData *)encrypt:(NSData *)input; 17 | 18 | - (NSData *)decrpyt:(NSData *)input; 19 | 20 | - (instancetype)init:(NSData *)key; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Util/QNGetAddrInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNGetAddrInfo.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/7/19. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #ifndef QNGetAddrInfo_h 10 | #define QNGetAddrInfo_h 11 | 12 | #ifdef __cplusplus 13 | extern "C" { 14 | #endif 15 | 16 | typedef struct qn_ips_ret { 17 | char *ips[1]; 18 | } qn_ips_ret; 19 | 20 | typedef qn_ips_ret *(*qn_dns_callback)(const char *host); 21 | 22 | typedef void (*qn_ip_report_callback)(const char *ip, int code, int time_ms); 23 | 24 | extern void qn_free_ips_ret(qn_ips_ret *ip_list); 25 | 26 | extern int qn_getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res); 27 | 28 | extern void qn_freeaddrinfo(struct addrinfo *ai); 29 | 30 | extern void qn_set_dns_callback(qn_dns_callback cb); 31 | 32 | extern void qn_set_ip_report_callback(qn_ip_report_callback cb); 33 | 34 | extern void qn_ip_report(const struct addrinfo *info, int code, int time_ms); 35 | 36 | #ifdef __cplusplus 37 | }; 38 | #endif 39 | 40 | #endif /* QNGetAddrInfo_h */ 41 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Util/QNHex.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNHex.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 15/7/31. 6 | // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | char *qn_encodeHexData(char *output_buf, const char *data, int data_size, BOOL up); 12 | 13 | @interface QNHex : NSObject 14 | 15 | + (NSString *)encodeHexData:(NSData *)data; 16 | + (NSString *)encodeHexString:(NSString *)str; 17 | 18 | + (NSData *)decodeHexString:(NSString *)hex; 19 | + (NSString *)decodeHexToString:(NSString *)hex; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Util/QNIP.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNIPV6.h 3 | // HappyDNS 4 | // 5 | // Created by bailong on 16/5/25. 6 | // Copyright © 2016年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern int qn_localIp(char *buf, int buf_size); 12 | extern void qn_nat64(char *buf, int buf_size, uint32_t ipv4_addr); 13 | 14 | @interface QNIP : NSObject 15 | 16 | + (BOOL)isV6; 17 | 18 | + (NSString *)adaptiveIp:(NSString *)ipv4; 19 | 20 | + (NSString *)local; 21 | 22 | // ipv6 in url like http://[::xxx]/ 23 | + (NSString *)ipHost:(NSString *)ip; 24 | 25 | + (NSString *)nat64:(NSString *)ip; 26 | 27 | + (BOOL)isIpV6FullySupported; 28 | 29 | + (BOOL)mayBeIpV4:(NSString *)domain; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Util/QNMD5.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNMD5.h 3 | // HappyDNS_Mac 4 | // 5 | // Created by 何昊宇 on 2018/4/25. 6 | // Copyright © 2018年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNMD5 : NSObject 12 | 13 | +(NSString *)MD5:(NSString *)string; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Pods/HappyDNS/HappyDNS/Util/QNMD5.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNMD5.m 3 | // HappyDNS_Mac 4 | // 5 | // Created by 何昊宇 on 2018/4/25. 6 | // Copyright © 2018年 Qiniu Cloud Storage. All rights reserved. 7 | // 8 | 9 | #import "QNMD5.h" 10 | #import 11 | 12 | @implementation QNMD5 13 | 14 | + (NSString *)MD5:(NSString *)string{ 15 | 16 | const char* input = [string UTF8String]; 17 | unsigned char result[CC_MD5_DIGEST_LENGTH]; 18 | CC_MD5(input, (CC_LONG)strlen(input), result); 19 | 20 | NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; 21 | for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { 22 | [digest appendFormat:@"%02x", result[i]]; 23 | } 24 | 25 | return digest; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /Pods/HappyDNS/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2016 Qiniu, Ltd. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASDictionaryTransformer.h: -------------------------------------------------------------------------------- 1 | extern NSString *const MASDictionaryTransformerName; 2 | 3 | /** 4 | Converts shortcuts for storage in user defaults. 5 | 6 | User defaults can’t stored custom types directly, they have to 7 | be serialized to `NSData` or some other supported type like an 8 | `NSDictionary`. In Cocoa Bindings, the conversion can be done 9 | using value transformers like this one. 10 | 11 | There’s a built-in transformer (`NSKeyedUnarchiveFromDataTransformerName`) 12 | that converts any `NSCoding` types to `NSData`, but with shortcuts 13 | it makes sense to use a dictionary instead – the defaults look better 14 | when inspected with the `defaults` command-line utility and the 15 | format is compatible with an older sortcut library called Shortcut 16 | Recorder. 17 | */ 18 | @interface MASDictionaryTransformer : NSValueTransformer 19 | @end 20 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASDictionaryTransformer.m: -------------------------------------------------------------------------------- 1 | #import "MASDictionaryTransformer.h" 2 | #import "MASShortcut.h" 3 | 4 | NSString *const MASDictionaryTransformerName = @"MASDictionaryTransformer"; 5 | 6 | static NSString *const MASKeyCodeKey = @"keyCode"; 7 | static NSString *const MASModifierFlagsKey = @"modifierFlags"; 8 | 9 | @implementation MASDictionaryTransformer 10 | 11 | + (BOOL) allowsReverseTransformation 12 | { 13 | return YES; 14 | } 15 | 16 | // Storing nil values as an empty dictionary lets us differ between 17 | // “not available, use default value” and “explicitly set to none”. 18 | // See http://stackoverflow.com/questions/5540760 for details. 19 | - (NSDictionary*) reverseTransformedValue: (MASShortcut*) shortcut 20 | { 21 | if (shortcut == nil) { 22 | return [NSDictionary dictionary]; 23 | } else { 24 | return @{ 25 | MASKeyCodeKey: @([shortcut keyCode]), 26 | MASModifierFlagsKey: @([shortcut modifierFlags]) 27 | }; 28 | } 29 | } 30 | 31 | - (MASShortcut*) transformedValue: (NSDictionary*) dictionary 32 | { 33 | // We have to be defensive here as the value may come from user defaults. 34 | if (![dictionary isKindOfClass:[NSDictionary class]]) { 35 | return nil; 36 | } 37 | 38 | id keyCodeBox = [dictionary objectForKey:MASKeyCodeKey]; 39 | id modifierFlagsBox = [dictionary objectForKey:MASModifierFlagsKey]; 40 | 41 | SEL integerValue = @selector(integerValue); 42 | if (![keyCodeBox respondsToSelector:integerValue] || ![modifierFlagsBox respondsToSelector:integerValue]) { 43 | return nil; 44 | } 45 | 46 | return [MASShortcut 47 | shortcutWithKeyCode:[keyCodeBox integerValue] 48 | modifierFlags:[modifierFlagsBox integerValue]]; 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASHotKey.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | extern FourCharCode const MASHotKeySignature; 4 | 5 | @interface MASHotKey : NSObject 6 | 7 | @property(readonly) UInt32 carbonID; 8 | @property(copy) dispatch_block_t action; 9 | 10 | + (instancetype) registeredHotKeyWithShortcut: (MASShortcut*) shortcut; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASHotKey.m: -------------------------------------------------------------------------------- 1 | #import "MASHotKey.h" 2 | 3 | FourCharCode const MASHotKeySignature = 'MASS'; 4 | 5 | @interface MASHotKey () 6 | @property(assign) EventHotKeyRef hotKeyRef; 7 | @property(assign) UInt32 carbonID; 8 | @end 9 | 10 | @implementation MASHotKey 11 | 12 | - (instancetype) initWithShortcut: (MASShortcut*) shortcut 13 | { 14 | self = [super init]; 15 | 16 | static UInt32 CarbonHotKeyID = 0; 17 | 18 | _carbonID = ++CarbonHotKeyID; 19 | EventHotKeyID hotKeyID = { .signature = MASHotKeySignature, .id = _carbonID }; 20 | 21 | OSStatus status = RegisterEventHotKey([shortcut carbonKeyCode], [shortcut carbonFlags], 22 | hotKeyID, GetEventDispatcherTarget(), 0, &_hotKeyRef); 23 | 24 | if (status != noErr) { 25 | return nil; 26 | } 27 | 28 | return self; 29 | } 30 | 31 | + (instancetype) registeredHotKeyWithShortcut: (MASShortcut*) shortcut 32 | { 33 | return [[self alloc] initWithShortcut:shortcut]; 34 | } 35 | 36 | - (void) dealloc 37 | { 38 | if (_hotKeyRef) { 39 | UnregisterEventHotKey(_hotKeyRef); 40 | _hotKeyRef = NULL; 41 | } 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASKeyCodes.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "MASKeyMasks.h" 4 | 5 | // These glyphs are missed in Carbon.h 6 | enum { 7 | kMASShortcutGlyphEject = 0x23CF, 8 | kMASShortcutGlyphClear = 0x2715, 9 | kMASShortcutGlyphDeleteLeft = 0x232B, 10 | kMASShortcutGlyphDeleteRight = 0x2326, 11 | kMASShortcutGlyphLeftArrow = 0x2190, 12 | kMASShortcutGlyphRightArrow = 0x2192, 13 | kMASShortcutGlyphUpArrow = 0x2191, 14 | kMASShortcutGlyphDownArrow = 0x2193, 15 | kMASShortcutGlyphEscape = 0x238B, 16 | kMASShortcutGlyphHelp = 0x003F, 17 | kMASShortcutGlyphPageDown = 0x21DF, 18 | kMASShortcutGlyphPageUp = 0x21DE, 19 | kMASShortcutGlyphTabRight = 0x21E5, 20 | kMASShortcutGlyphReturn = 0x2305, 21 | kMASShortcutGlyphReturnR2L = 0x21A9, 22 | kMASShortcutGlyphPadClear = 0x2327, 23 | kMASShortcutGlyphNorthwestArrow = 0x2196, 24 | kMASShortcutGlyphSoutheastArrow = 0x2198, 25 | }; 26 | 27 | NS_INLINE NSString* NSStringFromMASKeyCode(unsigned short ch) 28 | { 29 | return [NSString stringWithFormat:@"%C", ch]; 30 | } 31 | 32 | NS_INLINE NSUInteger MASPickCocoaModifiers(NSUInteger flags) 33 | { 34 | return (flags & (NSEventModifierFlagControl | NSEventModifierFlagShift | NSEventModifierFlagOption | NSEventModifierFlagCommand)); 35 | } 36 | 37 | NS_INLINE UInt32 MASCarbonModifiersFromCocoaModifiers(NSUInteger cocoaFlags) 38 | { 39 | return 40 | (cocoaFlags & NSEventModifierFlagCommand ? cmdKey : 0) 41 | | (cocoaFlags & NSEventModifierFlagOption ? optionKey : 0) 42 | | (cocoaFlags & NSEventModifierFlagControl ? controlKey : 0) 43 | | (cocoaFlags & NSEventModifierFlagShift ? shiftKey : 0); 44 | } 45 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASKeyMasks.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // https://github.com/shpakovski/MASShortcut/issues/99 4 | // 5 | // Long story short: NSControlKeyMask and friends were replaced with NSEventModifierFlagControl 6 | // and similar in macOS Sierra. The project builds fine & clean, but including MASShortcut in 7 | // a project with deployment target set to 10.12 results in several deprecation warnings because 8 | // of the control masks. Simply replacing the old symbols with the new ones isn’t an option, 9 | // since it breaks the build on older SDKs – in Travis, for example. 10 | // 11 | // It should be safe to remove this whole thing once the 10.12 SDK is ubiquitous. 12 | 13 | #if __MAC_OS_X_VERSION_MAX_ALLOWED < 101200 14 | #define NSEventModifierFlagCommand NSCommandKeyMask 15 | #define NSEventModifierFlagControl NSControlKeyMask 16 | #define NSEventModifierFlagOption NSAlternateKeyMask 17 | #define NSEventModifierFlagShift NSShiftKeyMask 18 | #endif 19 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASLocalization.h: -------------------------------------------------------------------------------- 1 | /** 2 | Reads a localized string from the framework’s bundle. 3 | 4 | Normally you would use NSLocalizedString to read the localized 5 | strings, but that’s just a shortcut for loading the strings from 6 | the main bundle. And once the framework ends up in an app, the 7 | main bundle will be the app’s bundle and won’t contain our strings. 8 | So we introduced this helper function that makes sure to load the 9 | strings from the framework’s bundle. Please avoid using 10 | NSLocalizedString throughout the framework, it wouldn’t work 11 | properly. 12 | */ 13 | NSString *MASLocalizedString(NSString *key, NSString *comment); -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASLocalization.m: -------------------------------------------------------------------------------- 1 | #import "MASLocalization.h" 2 | #import "MASShortcut.h" 3 | 4 | static NSString *const MASLocalizationTableName = @"Localizable"; 5 | static NSString *const MASPlaceholderLocalizationString = @"XXX"; 6 | 7 | // The CocoaPods trickery here is needed because when the code 8 | // is built as a part of CocoaPods, it won’t make a separate framework 9 | // and the Localized.strings file won’t be bundled correctly. 10 | // See https://github.com/shpakovski/MASShortcut/issues/74 11 | NSString *MASLocalizedString(NSString *key, NSString *comment) { 12 | static NSBundle *localizationBundle = nil; 13 | static dispatch_once_t onceToken; 14 | dispatch_once(&onceToken, ^{ 15 | NSBundle *frameworkBundle = [NSBundle bundleForClass:[MASShortcut class]]; 16 | // first we'll check if resources bundle was copied to MASShortcut framework bundle when !use_frameworks option is active 17 | NSURL *cocoaPodsBundleURL = [frameworkBundle URLForResource:@"MASShortcut" withExtension:@"bundle"]; 18 | if (cocoaPodsBundleURL) { 19 | localizationBundle = [NSBundle bundleWithURL: cocoaPodsBundleURL]; 20 | } else { 21 | // trying to fetch cocoapods bundle from main bundle 22 | cocoaPodsBundleURL = [[NSBundle mainBundle] URLForResource: @"MASShortcut" withExtension:@"bundle"]; 23 | if (cocoaPodsBundleURL) { 24 | localizationBundle = [NSBundle bundleWithURL: cocoaPodsBundleURL]; 25 | } else { 26 | // fallback to framework bundle 27 | localizationBundle = frameworkBundle; 28 | } 29 | } 30 | }); 31 | return [localizationBundle localizedStringForKey:key 32 | value:MASPlaceholderLocalizationString 33 | table:MASLocalizationTableName]; 34 | } 35 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASShortcut.modulemap: -------------------------------------------------------------------------------- 1 | framework module MASShortcut { 2 | umbrella header "Shortcut.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASShortcutMonitor.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | /** 4 | Executes action when a shortcut is pressed. 5 | 6 | There can only be one instance of this class, otherwise things 7 | will probably not work. (There’s a Carbon event handler inside 8 | and there can only be one Carbon event handler of a given type.) 9 | */ 10 | @interface MASShortcutMonitor : NSObject 11 | 12 | - (instancetype) init __unavailable; 13 | + (instancetype) sharedMonitor; 14 | 15 | /** 16 | Register a shortcut along with an action. 17 | 18 | Attempting to insert an already registered shortcut probably won’t work. 19 | It may burn your house or cut your fingers. You have been warned. 20 | */ 21 | - (BOOL) registerShortcut: (MASShortcut*) shortcut withAction: (dispatch_block_t) action; 22 | - (BOOL) isShortcutRegistered: (MASShortcut*) shortcut; 23 | 24 | - (void) unregisterShortcut: (MASShortcut*) shortcut; 25 | - (void) unregisterAllShortcuts; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASShortcutValidator.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | /** 4 | This class is used by the recording control to tell which shortcuts are acceptable. 5 | 6 | There are two kinds of shortcuts that are not considered acceptable: shortcuts that 7 | are too simple (like single letter keys) and shortcuts that are already used by the 8 | operating system. 9 | */ 10 | @interface MASShortcutValidator : NSObject 11 | 12 | /** 13 | Set to `YES` if you want to accept Option-something shortcuts. 14 | 15 | `NO` by default, since Option-something shortcuts are often used by system, 16 | for example Option-G will type the © sign. This also applies to Option-Shift 17 | shortcuts – in other words, shortcut recorder will not accept shortcuts like 18 | Option-Shift-K by default. (Again, since Option-Shift-K inserts the Apple 19 | logo sign by default.) 20 | */ 21 | @property(assign) BOOL allowAnyShortcutWithOptionModifier; 22 | 23 | + (instancetype) sharedValidator; 24 | 25 | - (BOOL) isShortcutValid: (MASShortcut*) shortcut; 26 | - (BOOL) isShortcut: (MASShortcut*) shortcut alreadyTakenInMenu: (NSMenu*) menu explanation: (NSString**) explanation; 27 | - (BOOL) isShortcutAlreadyTakenBySystem: (MASShortcut*) shortcut explanation: (NSString**) explanation; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASShortcutView+Bindings.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcutView.h" 2 | 3 | /** 4 | A simplified interface to bind the recorder value to user defaults. 5 | 6 | You can bind the `shortcutValue` to user defaults using the standard 7 | `bind:toObject:withKeyPath:options:` call, but since that’s a lot to type 8 | and read, here’s a simpler option. 9 | 10 | Setting the `associatedUserDefaultsKey` binds the view’s shortcut value 11 | to the given user defaults key. You can supply a value transformer to convert 12 | values between user defaults and `MASShortcut`. If you don’t supply 13 | a transformer, the `NSUnarchiveFromDataTransformerName` will be used 14 | automatically. 15 | 16 | Set `associatedUserDefaultsKey` to `nil` to disconnect the binding. 17 | */ 18 | @interface MASShortcutView (Bindings) 19 | 20 | @property(copy) NSString *associatedUserDefaultsKey; 21 | 22 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer; 23 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASShortcutView+Bindings.m: -------------------------------------------------------------------------------- 1 | #import "MASShortcutView+Bindings.h" 2 | 3 | @implementation MASShortcutView (Bindings) 4 | 5 | - (NSString*) associatedUserDefaultsKey 6 | { 7 | NSDictionary* bindingInfo = [self infoForBinding:MASShortcutBinding]; 8 | if (bindingInfo != nil) { 9 | NSString *keyPath = [bindingInfo objectForKey:NSObservedKeyPathKey]; 10 | NSString *key = [keyPath stringByReplacingOccurrencesOfString:@"values." withString:@""]; 11 | return key; 12 | } else { 13 | return nil; 14 | } 15 | } 16 | 17 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer 18 | { 19 | // Break previous binding if any 20 | NSString *currentKey = [self associatedUserDefaultsKey]; 21 | if (currentKey != nil) { 22 | [self unbind:currentKey]; 23 | } 24 | 25 | // Stop if the new binding is nil 26 | if (newKey == nil) { 27 | return; 28 | } 29 | 30 | NSDictionary *options = transformer ? 31 | @{NSValueTransformerBindingOption:transformer} : 32 | nil; 33 | 34 | [self bind:MASShortcutBinding 35 | toObject:[NSUserDefaultsController sharedUserDefaultsController] 36 | withKeyPath:[@"values." stringByAppendingString:newKey] 37 | options:options]; 38 | } 39 | 40 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName 41 | { 42 | [self setAssociatedUserDefaultsKey:newKey withTransformer:[NSValueTransformer valueTransformerForName:transformerName]]; 43 | } 44 | 45 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey 46 | { 47 | [self setAssociatedUserDefaultsKey:newKey withTransformerName:NSKeyedUnarchiveFromDataTransformerName]; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/MASShortcutView.h: -------------------------------------------------------------------------------- 1 | @class MASShortcut, MASShortcutValidator; 2 | 3 | extern NSString *const MASShortcutBinding; 4 | 5 | typedef enum { 6 | MASShortcutViewStyleDefault = 0, // Height = 19 px 7 | MASShortcutViewStyleTexturedRect, // Height = 25 px 8 | MASShortcutViewStyleRounded, // Height = 43 px 9 | MASShortcutViewStyleFlat 10 | } MASShortcutViewStyle; 11 | 12 | @interface MASShortcutView : NSView 13 | 14 | @property (nonatomic, strong) MASShortcut *shortcutValue; 15 | @property (nonatomic, strong) MASShortcutValidator *shortcutValidator; 16 | @property (nonatomic, getter = isRecording) BOOL recording; 17 | @property (nonatomic, getter = isEnabled) BOOL enabled; 18 | @property (nonatomic, copy) void (^shortcutValueChange)(MASShortcutView *sender); 19 | @property (nonatomic, assign) MASShortcutViewStyle style; 20 | 21 | /// Returns custom class for drawing control. 22 | + (Class)shortcutCellClass; 23 | 24 | - (void)setAcceptsFirstResponder:(BOOL)value; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Pods/MASShortcut/Framework/Shortcut.h: -------------------------------------------------------------------------------- 1 | #import "MASKeyMasks.h" 2 | #import "MASShortcut.h" 3 | #import "MASShortcutValidator.h" 4 | #import "MASShortcutMonitor.h" 5 | #import "MASShortcutBinder.h" 6 | #import "MASDictionaryTransformer.h" 7 | #import "MASShortcutView.h" 8 | #import "MASShortcutView+Bindings.h" 9 | -------------------------------------------------------------------------------- /Pods/MASShortcut/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2013, Vadim Shpakovski 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 17 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /Pods/MASShortcut/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "取消"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "点击以记录新快捷键"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "删除快捷键"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "键盘快捷键"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "好"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "记录快捷键"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "快捷键已清除"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "快捷键已设置"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "空格键"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "按键组合“%@”无法使用"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "当前按键组合无法使用,因为它已经用作其他系统全局快捷键。\n如果您真的想使用这个按键组合,大部分系统全局快捷键能在“系统偏好设置”里的“键盘”和“鼠标”面板中重设。"; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "当前快捷键无法使用,因为它已用作菜单项“%@”的快捷键。"; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "若要记录新的快捷键,单击此按钮,然后键入新的快捷键,或者按“delete键”删除已经存在的快捷键。"; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "键入新快捷键"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "键入快捷键"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "还原快捷键"; 48 | -------------------------------------------------------------------------------- /Pods/MASShortcut/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "取消"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "點選以記錄新快捷鍵"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "刪除快捷鍵"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "鍵盤快捷鍵"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "好"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "記錄快捷鍵"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "快捷鍵已清除"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "快捷鍵已設定"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "空格鍵"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "按鍵組合“%@”無法使用"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "當前按鍵組合無法使用,因為它已經用作其他系統全局快捷鍵。\n如果您真的想使用這個按鍵組合,大部分系統全局快捷鍵能在“系統偏好設定”裡的“鍵盤”和“滑鼠”面板中重設。"; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "當前快捷鍵無法使用,因為它已用作選單項“%@”的快捷鍵。"; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "若要記錄新的快捷鍵,單擊此按鈕,然後鍵入新的快捷鍵,或者按“delete鍵”刪除已經存在的快捷鍵。"; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "鍵入新快捷鍵"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "鍵入快捷鍵"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "還原快捷鍵"; 48 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Crashlytics (3.10.7): 3 | - Fabric (~> 1.7.11) 4 | - Fabric (1.7.11) 5 | - HappyDNS (0.3.14) 6 | - MASShortcut (2.3.6) 7 | - Qiniu (7.2.4): 8 | - HappyDNS (~> 0.3) 9 | - RNCryptor (5.0.3) 10 | 11 | DEPENDENCIES: 12 | - Crashlytics 13 | - Fabric 14 | - MASShortcut 15 | - Qiniu (~> 7.0) 16 | - RNCryptor (~> 5.0) 17 | 18 | SPEC REPOS: 19 | https://github.com/cocoapods/specs.git: 20 | - Crashlytics 21 | - Fabric 22 | - HappyDNS 23 | - MASShortcut 24 | - Qiniu 25 | - RNCryptor 26 | 27 | SPEC CHECKSUMS: 28 | Crashlytics: ccaac42660eb9351b9960c0d66106b0bcf99f4fa 29 | Fabric: f233c9492b3bbc1f04e3882986740f7988a58edb 30 | HappyDNS: dc6a164ee81979093123c241c6353bcf0218add6 31 | MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa 32 | Qiniu: 65384bca1cdb0480a68d9b9b8f54db53418c0355 33 | RNCryptor: c93d19029dcf7ff160aca0f24d6c9e7b0d82f664 34 | 35 | PODFILE CHECKSUM: 54242a6e77a2865c727b66b1224eb70d546c2242 36 | 37 | COCOAPODS: 1.5.3 38 | -------------------------------------------------------------------------------- /Pods/Qiniu/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2016 Qiniu, Ltd. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/BigData/QNPipeline.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNPipeline.h 3 | // QiniuSDK 4 | // 5 | // Created by BaiLong on 2017/7/25. 6 | // Copyright © 2017年 Qiniu. All rights reserved. 7 | // 8 | 9 | #ifndef QNPipeline_h 10 | #define QNPipeline_h 11 | 12 | @class QNResponseInfo; 13 | 14 | @interface QNPipelineConfig : NSObject 15 | 16 | /** 17 | * 上报打点域名 18 | */ 19 | @property (copy, nonatomic, readonly) NSString *host; 20 | 21 | /** 22 | * 超时时间 单位 秒 23 | */ 24 | @property (assign) UInt32 timeoutInterval; 25 | 26 | - (instancetype)initWithHost:(NSString *)host; 27 | 28 | - (instancetype)init; 29 | 30 | @end 31 | 32 | /** 33 | * 上传完成后的回调函数 34 | * 35 | * @param info 上下文信息,包括状态码,错误值 36 | * @param key 上传时指定的key,原样返回 37 | * @param resp 上传成功会返回文件信息,失败为nil; 可以通过此值是否为nil 判断上传结果 38 | */ 39 | typedef void (^QNPipelineCompletionHandler)(QNResponseInfo *info); 40 | 41 | @interface QNPipeline : NSObject 42 | 43 | - (instancetype)init:(QNPipelineConfig *)config; 44 | 45 | - (void)pumpRepo:(NSString *)repo 46 | event:(NSDictionary *)data 47 | token:(NSString *)token 48 | handler:(QNPipelineCompletionHandler)handler; 49 | 50 | - (void)pumpRepo:(NSString *)repo 51 | events:(NSArray *)data 52 | token:(NSString *)token 53 | handler:(QNPipelineCompletionHandler)handler; 54 | 55 | @end 56 | 57 | #endif /* QNPipeline_h */ 58 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNALAssetFile.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNALAssetFile.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/7/25. 6 | // Copyright (c) 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "QNFileDelegate.h" 12 | 13 | #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) 14 | @class ALAsset; 15 | @interface QNALAssetFile : NSObject 16 | 17 | /** 18 | * 打开指定文件 19 | * 20 | * @param path 文件路径 21 | * @param error 输出的错误信息 22 | * 23 | * @return 实例 24 | */ 25 | - (instancetype)init:(ALAsset *)asset 26 | error:(NSError *__autoreleasing *)error; 27 | @end 28 | #endif -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNALAssetFile.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNALAssetFile.m 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/7/25. 6 | // Copyright (c) 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNALAssetFile.h" 10 | 11 | #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED 12 | #import 13 | 14 | #import "QNResponseInfo.h" 15 | 16 | @interface QNALAssetFile () 17 | 18 | @property (nonatomic) ALAsset *asset; 19 | 20 | @property (readonly) int64_t fileSize; 21 | 22 | @property (readonly) int64_t fileModifyTime; 23 | 24 | @end 25 | 26 | @implementation QNALAssetFile 27 | - (instancetype)init:(ALAsset *)asset 28 | error:(NSError *__autoreleasing *)error { 29 | if (self = [super init]) { 30 | NSDate *createTime = [asset valueForProperty:ALAssetPropertyDate]; 31 | int64_t t = 0; 32 | if (createTime != nil) { 33 | t = [createTime timeIntervalSince1970]; 34 | } 35 | _fileModifyTime = t; 36 | _fileSize = asset.defaultRepresentation.size; 37 | _asset = asset; 38 | } 39 | 40 | return self; 41 | } 42 | 43 | - (NSData *)read:(long)offset 44 | size:(long)size { 45 | ALAssetRepresentation *rep = [self.asset defaultRepresentation]; 46 | Byte *buffer = (Byte *)malloc(size); 47 | NSUInteger buffered = [rep getBytes:buffer fromOffset:offset length:size error:nil]; 48 | 49 | return [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 50 | } 51 | 52 | - (NSData *)readAll { 53 | return [self read:0 size:(long)_fileSize]; 54 | } 55 | 56 | - (void)close { 57 | } 58 | 59 | - (NSString *)path { 60 | ALAssetRepresentation *rep = [self.asset defaultRepresentation]; 61 | return [rep url].path; 62 | } 63 | 64 | - (int64_t)modifyTime { 65 | return _fileModifyTime; 66 | } 67 | 68 | - (int64_t)size { 69 | return _fileSize; 70 | } 71 | @end 72 | #endif 73 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNAsyncRun.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNAsyncRun.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/17. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | typedef void (^QNRun)(void); 10 | 11 | void QNAsyncRun(QNRun run); 12 | 13 | void QNAsyncRunInMain(QNRun run); 14 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNAsyncRun.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNAsyncRun.m 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/17. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNAsyncRun.h" 10 | #import 11 | 12 | void QNAsyncRun(QNRun run) { 13 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 14 | run(); 15 | }); 16 | } 17 | 18 | void QNAsyncRunInMain(QNRun run) { 19 | dispatch_async(dispatch_get_main_queue(), ^(void) { 20 | run(); 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNCrc32.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNCrc.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14-9-29. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * 生成crc32 校验码 13 | */ 14 | @interface QNCrc32 : NSObject 15 | 16 | /** 17 | * 文件校验 18 | * 19 | * @param filePath 文件路径 20 | * @param error 文件读取错误 21 | * 22 | * @return 校验码 23 | */ 24 | + (UInt32)file:(NSString *)filePath 25 | error:(NSError **)error; 26 | 27 | /** 28 | * 二进制字节校验 29 | * 30 | * @param data 二进制数据 31 | * 32 | * @return 校验码 33 | */ 34 | + (UInt32)data:(NSData *)data; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNCrc32.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNCrc.m 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14-9-29. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "QNConfiguration.h" 12 | #import "QNCrc32.h" 13 | 14 | @implementation QNCrc32 15 | 16 | + (UInt32)data:(NSData *)data { 17 | uLong crc = crc32(0L, Z_NULL, 0); 18 | 19 | crc = crc32(crc, [data bytes], (uInt)[data length]); 20 | return (UInt32)crc; 21 | } 22 | 23 | + (UInt32)file:(NSString *)filePath 24 | error:(NSError **)error { 25 | @autoreleasepool { 26 | NSData *data = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:error]; 27 | if (*error != nil) { 28 | return 0; 29 | } 30 | 31 | int len = (int)[data length]; 32 | int count = (len + kQNBlockSize - 1) / kQNBlockSize; 33 | 34 | uLong crc = crc32(0L, Z_NULL, 0); 35 | for (int i = 0; i < count; i++) { 36 | int offset = i * kQNBlockSize; 37 | int size = (len - offset) > kQNBlockSize ? kQNBlockSize : (len - offset); 38 | NSData *d = [data subdataWithRange:NSMakeRange(offset, (unsigned int)size)]; 39 | crc = crc32(crc, [d bytes], (uInt)[d length]); 40 | } 41 | return (UInt32)crc; 42 | } 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNEtag.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNEtag.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/4. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * 服务器 hash etag 生成 13 | */ 14 | @interface QNEtag : NSObject 15 | 16 | /** 17 | * 文件etag 18 | * 19 | * @param filePath 文件路径 20 | * @param error 输出文件读取错误 21 | * 22 | * @return etag 23 | */ 24 | + (NSString *)file:(NSString *)filePath 25 | error:(NSError **)error; 26 | 27 | /** 28 | * 二进制数据etag 29 | * 30 | * @param data 数据 31 | * 32 | * @return etag 33 | */ 34 | + (NSString *)data:(NSData *)data; 35 | @end 36 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNEtag.m: -------------------------------------------------------------------------------- 1 | // 2 | // QNEtag.m 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/4. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #include 10 | 11 | #import "QNConfiguration.h" 12 | #import "QNEtag.h" 13 | #import "QNUrlSafeBase64.h" 14 | 15 | @implementation QNEtag 16 | + (NSString *)file:(NSString *)filePath 17 | error:(NSError **)error { 18 | @autoreleasepool { 19 | NSData *data = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:error]; 20 | if (error && *error) { 21 | return 0; 22 | } 23 | return [QNEtag data:data]; 24 | } 25 | } 26 | 27 | + (NSString *)data:(NSData *)data { 28 | if (data == nil || [data length] == 0) { 29 | return @"Fto5o-5ea0sNMlW_75VgGJCv2AcJ"; 30 | } 31 | int len = (int)[data length]; 32 | int count = (len + kQNBlockSize - 1) / kQNBlockSize; 33 | 34 | NSMutableData *retData = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH + 1]; 35 | UInt8 *ret = [retData mutableBytes]; 36 | 37 | NSMutableData *blocksSha1 = nil; 38 | UInt8 *pblocksSha1 = ret + 1; 39 | if (count > 1) { 40 | blocksSha1 = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH * count]; 41 | pblocksSha1 = [blocksSha1 mutableBytes]; 42 | } 43 | 44 | for (int i = 0; i < count; i++) { 45 | int offset = i * kQNBlockSize; 46 | int size = (len - offset) > kQNBlockSize ? kQNBlockSize : (len - offset); 47 | NSData *d = [data subdataWithRange:NSMakeRange(offset, (unsigned int)size)]; 48 | CC_SHA1([d bytes], (CC_LONG)size, pblocksSha1 + i * CC_SHA1_DIGEST_LENGTH); 49 | } 50 | if (count == 1) { 51 | ret[0] = 0x16; 52 | } else { 53 | ret[0] = 0x96; 54 | CC_SHA1(pblocksSha1, (CC_LONG)CC_SHA1_DIGEST_LENGTH * count, ret + 1); 55 | } 56 | 57 | return [QNUrlSafeBase64 encodeData:retData]; 58 | } 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNFile.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNFile.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/7/25. 6 | // Copyright (c) 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNFileDelegate.h" 10 | #import 11 | 12 | @interface QNFile : NSObject 13 | /** 14 | * 打开指定文件 15 | * 16 | * @param path 文件路径 17 | * @param error 输出的错误信息 18 | * 19 | * @return 实例 20 | */ 21 | - (instancetype)init:(NSString *)path 22 | error:(NSError *__autoreleasing *)error; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNFileDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNFileDelegate.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/7/25. 6 | // Copyright (c) 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * 文件处理接口,支持ALAsset, NSFileHandle, NSData 13 | */ 14 | @protocol QNFileDelegate 15 | 16 | /** 17 | * 从指定偏移读取数据 18 | * 19 | * @param offset 偏移地址 20 | * @param size 大小 21 | * 22 | * @return 数据 23 | */ 24 | - (NSData *)read:(long)offset 25 | size:(long)size; 26 | 27 | /** 28 | * 读取所有文件内容 29 | * 30 | * @return 数据 31 | */ 32 | - (NSData *)readAll; 33 | 34 | /** 35 | * 关闭文件 36 | * 37 | */ 38 | - (void)close; 39 | 40 | /** 41 | * 文件路径 42 | * 43 | * @return 文件路径 44 | */ 45 | - (NSString *)path; 46 | 47 | /** 48 | * 文件修改时间 49 | * 50 | * @return 修改时间 51 | */ 52 | - (int64_t)modifyTime; 53 | 54 | /** 55 | * 文件大小 56 | * 57 | * @return 文件大小 58 | */ 59 | - (int64_t)size; 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNPHAssetFile.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNPHAssetFile.h 3 | // Pods 4 | // 5 | // Created by 何舒 on 15/10/21. 6 | // 7 | // 8 | 9 | #import 10 | 11 | #import "QNFileDelegate.h" 12 | 13 | #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) 14 | @class PHAsset; 15 | @interface QNPHAssetFile : NSObject 16 | /** 17 | * 打开指定文件 18 | * 19 | * @param path 文件路径 20 | * @param error 输出的错误信息 21 | * 22 | * @return 实例 23 | */ 24 | - (instancetype)init:(PHAsset *)phAsset 25 | error:(NSError *__autoreleasing *)error; 26 | @end 27 | #endif 28 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNPHAssetResource.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNPHAssetResource.h 3 | // QiniuSDK 4 | // 5 | // Created by 何舒 on 16/2/14. 6 | // Copyright © 2016年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "QNFileDelegate.h" 12 | 13 | #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 90100) 14 | 15 | @class PHAssetResource; 16 | 17 | @interface QNPHAssetResource : NSObject 18 | 19 | /** 20 | * 打开指定文件 21 | * 22 | * @param path PHLivePhoto的PHAssetResource文件 23 | * @param error 输出的错误信息 24 | * 25 | * @return 实例 26 | */ 27 | - (instancetype)init:(PHAssetResource *)phAssetResource 28 | error:(NSError *__autoreleasing *)error; 29 | 30 | @end 31 | #endif 32 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNSystem.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNSystem.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/10/13. 6 | // Copyright © 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #ifndef QNSystem_h 10 | #define QNSystem_h 11 | 12 | BOOL hasNSURLSession(); 13 | 14 | BOOL hasAts(); 15 | 16 | BOOL allowsArbitraryLoads(); 17 | 18 | BOOL isIpV6FullySupported(); 19 | 20 | #endif /* QNSystem_h */ 21 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNUrlSafeBase64.h: -------------------------------------------------------------------------------- 1 | // 2 | // QiniuSDK 3 | // 4 | // Created by bailong on 14-9-28. 5 | // Copyright (c) 2014年 Qiniu. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | /** 11 | * url safe base64 编码类, 对/ 做了处理 12 | */ 13 | @interface QNUrlSafeBase64 : NSObject 14 | 15 | /** 16 | * 字符串编码 17 | * 18 | * @param source 字符串 19 | * 20 | * @return base64 字符串 21 | */ 22 | + (NSString *)encodeString:(NSString *)source; 23 | 24 | /** 25 | * 二进制数据编码 26 | * 27 | * @param source 二进制数据 28 | * 29 | * @return base64字符串 30 | */ 31 | + (NSString *)encodeData:(NSData *)source; 32 | 33 | /** 34 | * 字符串解码 35 | * 36 | * @param base64 字符串 37 | * 38 | * @return 数据 39 | */ 40 | + (NSData *)decodeString:(NSString *)data; 41 | @end 42 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNUrlSafeBase64.m: -------------------------------------------------------------------------------- 1 | // 2 | // QiniuSDK 3 | // 4 | // Created by bailong on 14-9-28. 5 | // Copyright (c) 2014年 Qiniu. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "QNUrlSafeBase64.h" 11 | 12 | #import "QN_GTM_Base64.h" 13 | 14 | @implementation QNUrlSafeBase64 15 | 16 | + (NSString *)encodeString:(NSString *)sourceString { 17 | NSData *data = [NSData dataWithBytes:[sourceString UTF8String] length:[sourceString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; 18 | return [self encodeData:data]; 19 | } 20 | 21 | + (NSString *)encodeData:(NSData *)data { 22 | return [QN_GTM_Base64 stringByWebSafeEncodingData:data padded:YES]; 23 | } 24 | 25 | + (NSData *)decodeString:(NSString *)data { 26 | return [QN_GTM_Base64 webSafeDecodeString:data]; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Common/QNVersion.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNVersion.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14-9-29. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * sdk 版本 13 | */ 14 | static const NSString *kQiniuVersion = @"7.2.4"; 15 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Http/QNHttpDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @class QNResponseInfo; 4 | 5 | typedef void (^QNInternalProgressBlock)(long long totalBytesWritten, long long totalBytesExpectedToWrite); 6 | typedef void (^QNCompleteBlock)(QNResponseInfo *info, NSDictionary *resp); 7 | typedef BOOL (^QNCancelBlock)(void); 8 | 9 | /** 10 | * Http 客户端接口 11 | */ 12 | @protocol QNHttpDelegate 13 | 14 | - (void)multipartPost:(NSString *)url 15 | withData:(NSData *)data 16 | withParams:(NSDictionary *)params 17 | withFileName:(NSString *)key 18 | withMimeType:(NSString *)mime 19 | withCompleteBlock:(QNCompleteBlock)completeBlock 20 | withProgressBlock:(QNInternalProgressBlock)progressBlock 21 | withCancelBlock:(QNCancelBlock)cancelBlock 22 | withAccess:(NSString *)access; 23 | 24 | - (void)post:(NSString *)url 25 | withData:(NSData *)data 26 | withParams:(NSDictionary *)params 27 | withHeaders:(NSDictionary *)headers 28 | withCompleteBlock:(QNCompleteBlock)completeBlock 29 | withProgressBlock:(QNInternalProgressBlock)progressBlock 30 | withCancelBlock:(QNCancelBlock)cancelBlock 31 | withAccess:(NSString *)access; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Http/QNSessionManager.h: -------------------------------------------------------------------------------- 1 | #import "QNHttpDelegate.h" 2 | #import 3 | 4 | #import "QNConfiguration.h" 5 | 6 | #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) 7 | 8 | @interface QNSessionManager : NSObject 9 | 10 | - (instancetype)initWithProxy:(NSDictionary *)proxyDict 11 | timeout:(UInt32)timeout 12 | urlConverter:(QNUrlConvert)converter 13 | dns:(QNDnsManager *)dns; 14 | 15 | - (void)multipartPost:(NSString *)url 16 | withData:(NSData *)data 17 | withParams:(NSDictionary *)params 18 | withFileName:(NSString *)key 19 | withMimeType:(NSString *)mime 20 | withCompleteBlock:(QNCompleteBlock)completeBlock 21 | withProgressBlock:(QNInternalProgressBlock)progressBlock 22 | withCancelBlock:(QNCancelBlock)cancelBlock 23 | withAccess:(NSString *)access; 24 | 25 | - (void)post:(NSString *)url 26 | withData:(NSData *)data 27 | withParams:(NSDictionary *)params 28 | withHeaders:(NSDictionary *)headers 29 | withCompleteBlock:(QNCompleteBlock)completeBlock 30 | withProgressBlock:(QNInternalProgressBlock)progressBlock 31 | withCancelBlock:(QNCancelBlock)cancelBlock 32 | withAccess:(NSString *)access; 33 | 34 | - (void)get:(NSString *)url 35 | withHeaders:(NSDictionary *)headers 36 | withCompleteBlock:(QNCompleteBlock)completeBlock; 37 | 38 | @end 39 | 40 | #endif 41 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Http/QNUserAgent.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNUserAgent.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14-9-29. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * UserAgent 13 | * 14 | */ 15 | 16 | @interface QNUserAgent : NSObject 17 | 18 | /** 19 | * 用户id 20 | */ 21 | @property (copy, nonatomic, readonly) NSString *id; 22 | 23 | /** 24 | * UserAgent 字串 25 | */ 26 | - (NSString *)description; 27 | 28 | /** 29 | * UserAgent + AK 字串 30 | */ 31 | - (NSString *)getUserAgent:(NSString *)access; 32 | 33 | /** 34 | * 单例 35 | */ 36 | + (instancetype)sharedInstance; 37 | @end 38 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/QiniuSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // QiniuSDK.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14-9-28. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "QNConfiguration.h" 12 | #import "QNFileRecorder.h" 13 | #import "QNPipeline.h" 14 | #import "QNResponseInfo.h" 15 | #import "QNUploadManager.h" 16 | #import "QNUploadOption.h" 17 | #import "QNUrlSafeBase64.h" 18 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Recorder/QNFileRecorder.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNFileRecorder.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/5. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNRecorderDelegate.h" 10 | #import 11 | 12 | /** 13 | * 将上传记录保存到文件系统中 14 | */ 15 | @interface QNFileRecorder : NSObject 16 | 17 | /** 18 | * 用指定保存的目录进行初始化 19 | * 20 | * @param directory 目录 21 | * @param error 输出的错误信息 22 | * 23 | * @return 实例 24 | */ 25 | + (instancetype)fileRecorderWithFolder:(NSString *)directory 26 | error:(NSError *__autoreleasing *)error; 27 | 28 | /** 29 | * 用指定保存的目录,以及是否进行base64编码进行初始化, 30 | * 31 | * @param directory 目录 32 | * @param encode 为避免因为特殊字符或含有/,无法保存持久化记录,故用此参数指定是否要base64编码 33 | * @param error 输出错误信息 34 | * 35 | * @return 实例 36 | */ 37 | + (instancetype)fileRecorderWithFolder:(NSString *)directory 38 | encodeKey:(BOOL)encode 39 | error:(NSError *__autoreleasing *)error; 40 | 41 | /** 42 | * 从外部手动删除记录,如无特殊需求,不建议使用 43 | * 44 | * @param key 持久化记录key 45 | * @param dir 目录 46 | * @param encode 是否encode 47 | */ 48 | + (void)removeKey:(NSString *)key 49 | directory:(NSString *)dir 50 | encodeKey:(BOOL)encode; 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Recorder/QNRecorderDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNRecorderDelegate.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/5. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * 为持久化上传记录,根据上传的key以及文件名 生成持久化的记录key 13 | * 14 | * @param uploadKey 上传的key 15 | * @param filePath 文件名 16 | * 17 | * @return 根据uploadKey, filepath 算出的记录key 18 | */ 19 | typedef NSString * (^QNRecorderKeyGenerator)(NSString *uploadKey, NSString *filePath); 20 | 21 | /** 22 | * 持久化记录接口,可以实现将记录持久化到文件,数据库等 23 | */ 24 | @protocol QNRecorderDelegate 25 | 26 | /** 27 | * 保存记录 28 | * 29 | * @param key 持久化记录的key 30 | * @param value 持久化记录上传状态信息 31 | * 32 | * @return 错误信息,成功为nil 33 | */ 34 | - (NSError *)set:(NSString *)key 35 | data:(NSData *)value; 36 | 37 | /** 38 | * 取出保存的持久化上传状态信息 39 | * 40 | * @param key 持久化记录key 41 | * 42 | * @return 上传中间状态信息 43 | */ 44 | - (NSData *)get:(NSString *)key; 45 | 46 | /** 47 | * 删除持久化记录,一般在上传成功后自动调用 48 | * 49 | * @param key 持久化记录key 50 | * 51 | * @return 错误信息,成功为nil 52 | */ 53 | - (NSError *)del:(NSString *)key; 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Storage/QNFormUpload.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNFormUpload.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/1/4. 6 | // Copyright (c) 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNHttpDelegate.h" 10 | #import "QNUpToken.h" 11 | #import "QNUploadManager.h" 12 | #import 13 | 14 | @interface QNFormUpload : NSObject 15 | 16 | - (instancetype)initWithData:(NSData *)data 17 | withKey:(NSString *)key 18 | withToken:(QNUpToken *)token 19 | withCompletionHandler:(QNUpCompletionHandler)block 20 | withOption:(QNUploadOption *)option 21 | withHttpManager:(id)http 22 | withConfiguration:(QNConfiguration *)config; 23 | 24 | - (void)put; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Storage/QNResumeUpload.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNResumeUpload.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/1. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNFileDelegate.h" 10 | #import "QNHttpDelegate.h" 11 | #import "QNUpToken.h" 12 | #import "QNUploadManager.h" 13 | #import 14 | 15 | @interface QNResumeUpload : NSObject 16 | 17 | - (instancetype)initWithFile:(id)file 18 | withKey:(NSString *)key 19 | withToken:(QNUpToken *)token 20 | withCompletionHandler:(QNUpCompletionHandler)block 21 | withOption:(QNUploadOption *)option 22 | withRecorder:(id)recorder 23 | withRecorderKey:(NSString *)recorderKey 24 | withHttpManager:(id)http 25 | withConfiguration:(QNConfiguration *)config; 26 | 27 | - (void)run; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Storage/QNUpToken.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNUpToken.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 15/6/7. 6 | // Copyright (c) 2015年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface QNUpToken : NSObject 12 | 13 | + (instancetype)parse:(NSString *)token; 14 | 15 | @property (copy, nonatomic, readonly) NSString *access; 16 | @property (copy, nonatomic, readonly) NSString *bucket; 17 | @property (copy, nonatomic, readonly) NSString *token; 18 | 19 | @property (readonly) BOOL hasReturnUrl; 20 | 21 | - (NSString *)index; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/Qiniu/QiniuSDK/Storage/QNUploadOption+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // QNUploadOption+Private.h 3 | // QiniuSDK 4 | // 5 | // Created by bailong on 14/10/5. 6 | // Copyright (c) 2014年 Qiniu. All rights reserved. 7 | // 8 | 9 | #import "QNUploadOption.h" 10 | 11 | @interface QNUploadOption (Private) 12 | 13 | @property (nonatomic, getter=priv_isCancelled, readonly) BOOL cancelled; 14 | @end 15 | -------------------------------------------------------------------------------- /Pods/RNCryptor/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Rob Napier 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /Pods/Target Support Files/HappyDNS/HappyDNS-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_HappyDNS : NSObject 3 | @end 4 | @implementation PodsDummy_HappyDNS 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HappyDNS/HappyDNS-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HappyDNS/HappyDNS-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "QNAssessment.h" 14 | #import "QNIpModel.h" 15 | #import "QNDnsManager.h" 16 | #import "QNDomain.h" 17 | #import "QNLruCache.h" 18 | #import "QNNetworkInfo.h" 19 | #import "QNRecord.h" 20 | #import "QNResolverDelegate.h" 21 | #import "HappyDNS.h" 22 | #import "QNDnspodEnterprise.h" 23 | #import "QNDnspodFree.h" 24 | #import "QNNiuDns.h" 25 | #import "QNHijackingDetectWrapper.h" 26 | #import "QNHosts.h" 27 | #import "QNResolver.h" 28 | #import "QNResolvUtil.h" 29 | #import "QNTxtResolver.h" 30 | #import "QNRefresher.h" 31 | #import "QNDes.h" 32 | #import "QNGetAddrInfo.h" 33 | #import "QNHex.h" 34 | #import "QNIP.h" 35 | #import "QNMD5.h" 36 | 37 | FOUNDATION_EXPORT double HappyDNSVersionNumber; 38 | FOUNDATION_EXPORT const unsigned char HappyDNSVersionString[]; 39 | 40 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HappyDNS/HappyDNS.modulemap: -------------------------------------------------------------------------------- 1 | framework module HappyDNS { 2 | umbrella header "HappyDNS-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HappyDNS/HappyDNS.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/HappyDNS 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = -l"resolv" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/HappyDNS 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HappyDNS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.3.14 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.3.6 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/MASShortcut-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_MASShortcut : NSObject 3 | @end 4 | @implementation PodsDummy_MASShortcut 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/MASShortcut-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/MASShortcut-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "MASDictionaryTransformer.h" 14 | #import "MASHotKey.h" 15 | #import "MASKeyCodes.h" 16 | #import "MASKeyMasks.h" 17 | #import "MASLocalization.h" 18 | #import "MASShortcut.h" 19 | #import "MASShortcutBinder.h" 20 | #import "MASShortcutMonitor.h" 21 | #import "MASShortcutValidator.h" 22 | #import "MASShortcutView+Bindings.h" 23 | #import "MASShortcutView.h" 24 | #import "Shortcut.h" 25 | 26 | FOUNDATION_EXPORT double MASShortcutVersionNumber; 27 | FOUNDATION_EXPORT const unsigned char MASShortcutVersionString[]; 28 | 29 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/MASShortcut.modulemap: -------------------------------------------------------------------------------- 1 | framework module MASShortcut { 2 | umbrella header "MASShortcut-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = -framework "AppKit" -framework "Carbon" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/MASShortcut 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/MASShortcut/ResourceBundle-MASShortcut-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 2.3.6 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-cuImage/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-cuImage/Pods-cuImage-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_cuImage : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_cuImage 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-cuImage/Pods-cuImage-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_cuImageVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_cuImageVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-cuImage/Pods-cuImage.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CODE_SIGN_IDENTITY = 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/HappyDNS" "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut" "${PODS_CONFIGURATION_BUILD_DIR}/Qiniu" "${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor" "${PODS_ROOT}/Crashlytics/OSX" "${PODS_ROOT}/Fabric/OSX" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' 6 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HappyDNS/HappyDNS.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Qiniu/Qiniu.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor/RNCryptor.framework/Headers" 7 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Crashlytics" -framework "Fabric" -framework "HappyDNS" -framework "MASShortcut" -framework "Qiniu" -framework "RNCryptor" -framework "Security" -framework "SystemConfiguration" 8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 | PODS_BUILD_DIR = ${BUILD_DIR} 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 12 | PODS_ROOT = ${SRCROOT}/Pods 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-cuImage/Pods-cuImage.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_cuImage { 2 | umbrella header "Pods-cuImage-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-cuImage/Pods-cuImage.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CODE_SIGN_IDENTITY = 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/HappyDNS" "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut" "${PODS_CONFIGURATION_BUILD_DIR}/Qiniu" "${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor" "${PODS_ROOT}/Crashlytics/OSX" "${PODS_ROOT}/Fabric/OSX" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' 6 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HappyDNS/HappyDNS.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Qiniu/Qiniu.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor/RNCryptor.framework/Headers" 7 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Crashlytics" -framework "Fabric" -framework "HappyDNS" -framework "MASShortcut" -framework "Qiniu" -framework "RNCryptor" -framework "Security" -framework "SystemConfiguration" 8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 | PODS_BUILD_DIR = ${BUILD_DIR} 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 12 | PODS_ROOT = ${SRCROOT}/Pods 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Qiniu/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 7.2.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Qiniu/Qiniu-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Qiniu : NSObject 3 | @end 4 | @implementation PodsDummy_Qiniu 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Qiniu/Qiniu-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Qiniu/Qiniu-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "QNPipeline.h" 14 | #import "QNALAssetFile.h" 15 | #import "QNAsyncRun.h" 16 | #import "QNCrc32.h" 17 | #import "QNEtag.h" 18 | #import "QNFile.h" 19 | #import "QNFileDelegate.h" 20 | #import "QNPHAssetFile.h" 21 | #import "QNPHAssetResource.h" 22 | #import "QNSystem.h" 23 | #import "QNUrlSafeBase64.h" 24 | #import "QNVersion.h" 25 | #import "QN_GTM_Base64.h" 26 | #import "QNHttpDelegate.h" 27 | #import "QNResponseInfo.h" 28 | #import "QNSessionManager.h" 29 | #import "QNUserAgent.h" 30 | #import "QiniuSDK.h" 31 | #import "QNFileRecorder.h" 32 | #import "QNRecorderDelegate.h" 33 | #import "QNConfiguration.h" 34 | #import "QNFormUpload.h" 35 | #import "QNResumeUpload.h" 36 | #import "QNUploadManager.h" 37 | #import "QNUploadOption+Private.h" 38 | #import "QNUploadOption.h" 39 | #import "QNUpToken.h" 40 | 41 | FOUNDATION_EXPORT double QiniuVersionNumber; 42 | FOUNDATION_EXPORT const unsigned char QiniuVersionString[]; 43 | 44 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Qiniu/Qiniu.modulemap: -------------------------------------------------------------------------------- 1 | framework module Qiniu { 2 | umbrella header "Qiniu-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Qiniu/Qiniu.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Qiniu 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/HappyDNS" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | OTHER_LDFLAGS = -l"z" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Qiniu 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RNCryptor/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 5.0.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RNCryptor/RNCryptor-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_RNCryptor : NSObject 3 | @end 4 | @implementation PodsDummy_RNCryptor 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RNCryptor/RNCryptor-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RNCryptor/RNCryptor-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "RNCryptor.h" 14 | 15 | FOUNDATION_EXPORT double RNCryptorVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char RNCryptorVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RNCryptor/RNCryptor.modulemap: -------------------------------------------------------------------------------- 1 | framework module RNCryptor { 2 | umbrella header "RNCryptor-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RNCryptor/RNCryptor.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/RNCryptor 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | cuImage可以用来方便地上传图片到远程图床并获取Markdown格式的URL。 2 | 3 | # 功能 4 | 5 | * 图片上传完成后自动复制URL。 6 | * 在“上传历史”中查看已上传图片。 7 | * 批量上传图片。 8 | * 通过截图或复制上传图片。 9 | * 通过拖拽上传图片。 10 | * 通过”服务“菜单上传图片。 11 | * 通过全局快捷键上传图片。 12 | * 上传之前压缩图片。 13 | * 支持BMP/JPEG/PNG/GIF/TIFF等多种文件格式。 14 | 15 | 只支持七牛云,已兼容七牛云华东、华北、华南及北美的存储区域。 16 | 17 |



18 | 19 | # 演示 20 | 21 | ![](http://ohcoqbf8e.bkt.clouddn.com/20170210160422_0rO4r8_cuImageDemo.gif) 22 | 23 | # 技巧 24 | 25 | * 如果希望让上传的图片更小,可在偏好设置中勾选“在上传前使用JPEG压缩图片”,还可以调整压缩质量哦: 26 | 27 | ![](http://ohcoqbf8e.bkt.clouddn.com/20170206205206_8mQFec_JPEG_Compression.jpeg) 28 | 29 | * 在偏好设置中,填好主机信息后按⌘D可校验信息是否正确,按↩可保存信息。 30 | 31 | # 反馈 32 | 33 | 期待大家的积极反馈,比如增加哪些新功能,新增全局快捷键等等。如果喜欢cuImage就顺手给个小星星啦。当然也可以直接给我发邮件哈,邮件地址:[ihulizhenfoxmail.com]😘 34 | 35 | 有需要的小伙伴们赶紧收下吧~ 36 | -------------------------------------------------------------------------------- /cuImage.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /cuImage.xcodeproj/xcuserdata/hulz.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | cuImage.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | cuImageLauncher.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 250CFA041E20BBA1009B4F0A 21 | 22 | primary 23 | 24 | 25 | 251106C91E2A5C6900FF0C8F 26 | 27 | primary 28 | 29 | 30 | 25130C471E20E0C700830B3F 31 | 32 | primary 33 | 34 | 35 | 251B09FD1E20D4AF00E79112 36 | 37 | primary 38 | 39 | 40 | 255957EB1E1BD2A500B8469E 41 | 42 | primary 43 | 44 | 45 | 25FE568F1E4B074B00DE510A 46 | 47 | primary 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /cuImage.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /cuImage.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /cuImage/AppImageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppImageView.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 22/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class AppImageView: NSImageView { 12 | override func mouseDown(with event: NSEvent) { 13 | if let url = URL(string: Constants.macAppStoreLink) { 14 | NSWorkspace.shared.open(url) 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@1024pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@1024pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@128pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@128pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@16pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@16pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@256pt-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@256pt-1.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@256pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@256pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@32pt-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@32pt-1.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@32pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@32pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@512pt-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@512pt-1.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@512pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@512pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@64pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/AppIcon.appiconset/AppIcon@64pt.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "AppIcon@16pt.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "AppIcon@32pt.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "AppIcon@32pt-1.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "AppIcon@64pt.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "AppIcon@128pt.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "AppIcon@256pt.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "AppIcon@256pt-1.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "AppIcon@512pt.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "AppIcon@512pt-1.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "AppIcon@1024pt.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Hosts/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "QiniuHost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "QiniuHost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "QiniuHost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/QiniuHost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/QiniuHost.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/QiniuHost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/QiniuHost@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/QiniuHost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Hosts/QiniuHost.imageset/QiniuHost@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "DraggingDestinationBox.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "DraggingDestinationBox@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "DraggingDestinationBox@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/DraggingDestinationBox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/DraggingDestinationBox.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/DraggingDestinationBox@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/DraggingDestinationBox@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/DraggingDestinationBox@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/DraggingDestinationBox.imageset/DraggingDestinationBox@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "InvalidIndicator.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "InvalidIndicator@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "InvalidIndicator@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/InvalidIndicator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/InvalidIndicator.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/InvalidIndicator@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/InvalidIndicator@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/InvalidIndicator@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/FailedIndicator.imageset/InvalidIndicator@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "StatusItemIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "StatusItemIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "StatusItemIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/StatusItemIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/StatusItemIcon.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/StatusItemIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/StatusItemIcon@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/StatusItemIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/StatusItemIcon.imageset/StatusItemIcon@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ValidIndicator.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "ValidIndicator@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "ValidIndicator@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/ValidIndicator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/ValidIndicator.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/ValidIndicator@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/ValidIndicator@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/ValidIndicator@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Misc/SucceededIndicator.imageset/ValidIndicator@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "GeneralPreferences.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "GeneralPreferences@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "GeneralPreferences@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/GeneralPreferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/GeneralPreferences.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/GeneralPreferences@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/GeneralPreferences@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/GeneralPreferences@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/GeneralPreferences.imageset/GeneralPreferences@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "HostsPreferences.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "HostsPreferences@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "HostsPreferences@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/HostsPreferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/HostsPreferences.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/HostsPreferences@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/HostsPreferences@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/HostsPreferences@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/HostsPreferences.imageset/HostsPreferences@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ShortcutsPreferences.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "ShortcutsPreferences@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "ShortcutsPreferences@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/ShortcutsPreferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/ShortcutsPreferences.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/ShortcutsPreferences@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/ShortcutsPreferences@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/ShortcutsPreferences@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Preferences/ShortcutsPreferences.imageset/ShortcutsPreferences@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Sounds/AlertSound.dataset/AlertSound.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Sounds/AlertSound.dataset/AlertSound.aiff -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Sounds/AlertSound.dataset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "data" : [ 7 | { 8 | "idiom" : "universal", 9 | "filename" : "AlertSound.aiff" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Sounds/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Sounds/DropSound.dataset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "data" : [ 7 | { 8 | "idiom" : "universal", 9 | "filename" : "restore from trash.aif" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/Sounds/DropSound.dataset/restore from trash.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/Sounds/DropSound.dataset/restore from trash.aif -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress0.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress0@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress0@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/UploadProgress0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/UploadProgress0.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/UploadProgress0@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/UploadProgress0@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/UploadProgress0@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress0.imageset/UploadProgress0@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress1.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress1@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress1@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/UploadProgress1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/UploadProgress1.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/UploadProgress1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/UploadProgress1@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/UploadProgress1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress1.imageset/UploadProgress1@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress10.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress10@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress10@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/UploadProgress10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/UploadProgress10.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/UploadProgress10@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/UploadProgress10@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/UploadProgress10@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress10.imageset/UploadProgress10@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress11.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress11@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress11@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/UploadProgress11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/UploadProgress11.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/UploadProgress11@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/UploadProgress11@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/UploadProgress11@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress11.imageset/UploadProgress11@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress12.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress12@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress12@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/UploadProgress12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/UploadProgress12.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/UploadProgress12@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/UploadProgress12@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/UploadProgress12@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress12.imageset/UploadProgress12@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress2@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress2@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/UploadProgress2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/UploadProgress2.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/UploadProgress2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/UploadProgress2@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/UploadProgress2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress2.imageset/UploadProgress2@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress3.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress3@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress3@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/UploadProgress3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/UploadProgress3.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/UploadProgress3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/UploadProgress3@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/UploadProgress3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress3.imageset/UploadProgress3@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress4.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress4@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress4@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/UploadProgress4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/UploadProgress4.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/UploadProgress4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/UploadProgress4@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/UploadProgress4@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress4.imageset/UploadProgress4@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress5.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress5@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress5@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/UploadProgress5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/UploadProgress5.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/UploadProgress5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/UploadProgress5@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/UploadProgress5@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress5.imageset/UploadProgress5@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress6.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress6@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress6@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/UploadProgress6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/UploadProgress6.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/UploadProgress6@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/UploadProgress6@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/UploadProgress6@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress6.imageset/UploadProgress6@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress7.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress7@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress7@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/UploadProgress7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/UploadProgress7.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/UploadProgress7@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/UploadProgress7@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/UploadProgress7@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress7.imageset/UploadProgress7@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress8.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress8@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress8@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/UploadProgress8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/UploadProgress8.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/UploadProgress8@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/UploadProgress8@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/UploadProgress8@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress8.imageset/UploadProgress8@3x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "UploadProgress9.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "UploadProgress9@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "UploadProgress9@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/UploadProgress9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/UploadProgress9.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/UploadProgress9@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/UploadProgress9@2x.png -------------------------------------------------------------------------------- /cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/UploadProgress9@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulizhen/cuImage/d385357d00ff4d6758f84d72f3c7d05aff31e3d8/cuImage/Assets.xcassets/UploadProgress/UploadProgress9.imageset/UploadProgress9@3x.png -------------------------------------------------------------------------------- /cuImage/BasePreferencesPaneController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BasePreferencesPaneController.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 06/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class BasePreferencesPaneController: BaseViewController { 12 | override func viewDidAppear() { 13 | super.viewDidAppear() 14 | 15 | // Prevent getting focused when switching to new preference pane. 16 | view.window?.makeFirstResponder(nil) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cuImage/BaseViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseViewController.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 08/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class BaseViewController: NSViewController { 12 | override var nibName: NSNib.Name? { 13 | return className.components(separatedBy: ".").last.map { $0 } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cuImage/BaseWindowController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseWindowController.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 07/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class BaseWindowController: NSWindowController { 12 | override var windowNibName: NSNib.Name? { 13 | return className.components(separatedBy: ".").last.map { $0 } 14 | } 15 | 16 | override func windowDidLoad() { 17 | super.windowDidLoad() 18 | 19 | let top = preferences[.keepWindowsOnTop] 20 | keepWindowsOnTop(top) 21 | } 22 | 23 | override func showWindow(_ sender: Any?) { 24 | NSApp.activate(ignoringOtherApps: true) 25 | super.showWindow(sender) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cuImage/Data+Base64.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Data+Base64.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 03/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Data { 12 | func urlSafeBase64EncodedString() -> String { 13 | var encodedString = base64EncodedString() 14 | encodedString = encodedString.replacingOccurrences(of: "+", with: "-") 15 | encodedString = encodedString.replacingOccurrences(of: "/", with: "_") 16 | return encodedString 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cuImage/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /cuImage/Date+Formatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Date+Formatter.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 03/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Date { 12 | static let simpleFormatter: DateFormatter = { 13 | let formatter = DateFormatter() 14 | formatter.dateFormat = "yyyyMMddHHmmss" 15 | return formatter 16 | }() 17 | } 18 | -------------------------------------------------------------------------------- /cuImage/Host.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Host.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 03/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | // MARK: - Host 12 | protocol Host: class { 13 | func uploadData(_ data: Data, named name: String) 14 | } 15 | 16 | // MARK: - HostDelegate 17 | protocol HostDelegate: class { 18 | func host(_ host: Host, isUploadingDataNamed name: String, percent: Float) 19 | func host(_ host: Host, didSucceedToUploadDataNamed name: String, urlString: String) 20 | func host(_ host: Host, didFailToUploadDataNamed name: String, error: NSError) 21 | } 22 | 23 | // MARK: - SupportedHost 24 | enum SupportedHost: String { 25 | case qiniu = "Qiniu" 26 | 27 | // It seems there is currently no elegant way to enumerate all the cases. 28 | // So, type each cases twice! 29 | static var allCases: [SupportedHost] { 30 | return [.qiniu] 31 | } 32 | 33 | static var defaultHost: SupportedHost { 34 | return allCases.first! 35 | } 36 | 37 | /// An icon image followed by the host name. 38 | var image: NSImage { 39 | switch self { 40 | case .qiniu: return #imageLiteral(resourceName: "QiniuHost") 41 | } 42 | } 43 | 44 | /// The view controller for host preferences setting pane. 45 | var viewController: BaseViewController { 46 | switch self { 47 | case .qiniu: return QiniuHostInfoViewController() 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /cuImage/HostInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HostInfo.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 13/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @objcMembers 12 | class HostInfo: NSObject, NSCoding { 13 | var name = "" 14 | 15 | override init() { 16 | super.init() 17 | } 18 | 19 | convenience required init?(coder aDecoder: NSCoder) { 20 | self.init() 21 | 22 | forEachChildOfMirror(reflecting: self) { key in 23 | setValue(aDecoder.decodeObject(forKey: key), forKey: key) 24 | } 25 | } 26 | 27 | func encode(with aCoder: NSCoder) { 28 | forEachChildOfMirror(reflecting: self) { key in 29 | aCoder.encode(value(forKey: key), forKey: key) 30 | } 31 | } 32 | 33 | private func forEachChildOfMirror(reflecting subject: Any, handler: (String) -> Void) { 34 | var mirror: Mirror? = Mirror(reflecting: subject) 35 | while mirror != nil { 36 | for child in mirror!.children { 37 | if let key = child.label { 38 | handler(key) 39 | } 40 | } 41 | 42 | // Get super class's properties. 43 | mirror = mirror!.superclassMirror 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /cuImage/HostInfoViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HostInfoViewController.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 10/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | protocol HostInfoViewController: class { 12 | var isInfoChanged: Bool { get } 13 | 14 | func alertToSaveInfo(for window: NSWindow, completionHandler: ((NSApplication.ModalResponse) -> Void)?) -> Bool 15 | func validateHostInfo(completionHandler: @escaping (Bool) -> Void) 16 | func saveHostInfo() 17 | func discardHostInfo() 18 | } 19 | 20 | // Default implementation 21 | extension HostInfoViewController { 22 | /// Show alert dialog if the info is changed. 23 | /// 24 | /// - Parameters: 25 | /// - window: The window on which to display the sheet. 26 | /// - completionHandler: The completionHandler handler that gets called when the sheet’s modal session ends. 27 | /// - Returns: Return true if info is changed, otherwise return false. 28 | func alertToSaveInfo(for window: NSWindow, completionHandler: ((NSApplication.ModalResponse) -> Void)?) -> Bool { 29 | if (isInfoChanged) { 30 | NSAlert.alert(for: window, messageText: LocalizedStrings.saveChangesAlertMessageText, 31 | informativeText: LocalizedStrings.saveChangesAlertInformativeText, 32 | buttonTitles: [LocalizedStrings.save, 33 | LocalizedStrings.cancel, 34 | LocalizedStrings.discard], 35 | completionHandler: completionHandler) 36 | } 37 | return isInfoChanged 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /cuImage/IntegerToStringTransformer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IntegerToStringTransformer.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 20/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class IntegerToStringTransformer: ValueTransformer { 12 | let name = NSValueTransformerName(rawValue: "IntegerToStringTransformer") 13 | 14 | override static func transformedValueClass() -> Swift.AnyClass { 15 | return NSString.self 16 | } 17 | 18 | override static func allowsReverseTransformation() -> Bool { 19 | return true 20 | } 21 | 22 | override func transformedValue(_ value: Any?) -> Any? { 23 | guard let value = value as? NSNumber else { return nil } 24 | return value.stringValue 25 | } 26 | 27 | override func reverseTransformedValue(_ value: Any?) -> Any? { 28 | guard let value = value as? NSString else { return nil } 29 | return value.integerValue 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /cuImage/MASShortcut+Convenience.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MASShortcut+Convenience.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 08/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import MASShortcut 10 | 11 | extension MASShortcut { 12 | convenience init(key: Int, modifiers: [NSEvent.ModifierFlags] = []) { 13 | let flags = modifiers.reduce(0) { $0 | $1.rawValue } 14 | 15 | self.init(keyCode: UInt(key), modifierFlags: flags) 16 | } 17 | 18 | func data() -> Data { 19 | let bindingOptions = MASShortcutBinder.shared().bindingOptions! 20 | let transformer = bindingOptions[NSBindingOption.valueTransformer] as! ValueTransformer 21 | return transformer.reverseTransformedValue(self) as! Data 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cuImage/Model.xcdatamodeld/Model.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /cuImage/NSAttributedString+Convenience.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSAttributedString+Hyperlink.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 30/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | extension NSAttributedString { 12 | /// Make an attributed string with embeded hyperlink. 13 | /// 14 | /// - Parameters: 15 | /// - string: The string is about to be embeded a hyperlink. 16 | /// - url: The URL used to be embeded. 17 | /// - Returns: An atrributed string appended a hyperlink. 18 | static func hyperlink(from string: String, with url: URL) -> NSAttributedString { 19 | let attributedString = NSMutableAttributedString(string: string) 20 | let range = NSMakeRange(0, attributedString.length) 21 | 22 | // Attach link. 23 | attributedString.addAttribute(NSAttributedString.Key.link, 24 | value: url.absoluteString, 25 | range: range) 26 | 27 | return attributedString 28 | } 29 | 30 | static func +(lhs: NSAttributedString, rhs: NSAttributedString) -> NSAttributedString { 31 | let result = NSMutableAttributedString() 32 | 33 | result.append(lhs) 34 | result.append(rhs) 35 | return result 36 | } 37 | 38 | static func +=(lhs: inout NSAttributedString, rhs: NSAttributedString) { 39 | lhs = lhs + rhs 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /cuImage/NSBitmapImageFileType+String.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSBitmapImageFileType+String.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 03/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | extension NSBitmapImageRep.FileType { 12 | var string: String { 13 | switch self { 14 | case .tiff: return "tiff" 15 | case .bmp: return "bmp" 16 | case .gif: return "gif" 17 | case .png: return "png" 18 | case .jpeg: return "jpeg" 19 | case .jpeg2000: return "jp2" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /cuImage/NSMenuItem+KeyEquivalent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSMenuItem+KeyEquivalent.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 08/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import MASShortcut 11 | 12 | extension NSMenuItem { 13 | func setKeyEquivalent(withShortcut shortcut: MASShortcut) { 14 | keyEquivalent = shortcut.keyCodeStringForKeyEquivalent 15 | keyEquivalentModifierMask = NSEvent.ModifierFlags(rawValue: shortcut.modifierFlags) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cuImage/NSPasteboard+Convenience.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSPasteboard+Convenience.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 19/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | extension NSPasteboard { 12 | /// Add URL strings to pasteboard. 13 | /// 14 | /// - Parameters: 15 | /// - urlStrings: an array of URL strings. 16 | /// - markdown: Make the specified URL string in markdown-style or not. 17 | func addURLStrings(_ urlStrings: [String], markdown: Bool) { 18 | var strings = urlStrings.compactMap { $0.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) } 19 | if (markdown) { 20 | strings = strings.map { "![](\($0))" } 21 | } 22 | declareTypes([NSPasteboard.PasteboardType.string], owner: nil) 23 | writeObjects(strings as [NSString]) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /cuImage/NSUserNotificationCenter+Convenience.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSUserNotificationCenter+Convenience.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 12/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | extension NSUserNotificationCenter { 12 | func deliverNotification(with title: String, subtitle: String = "", informativeText: String = "", 13 | soundName: String = NSUserNotificationDefaultSoundName) { 14 | let notification = NSUserNotification() 15 | notification.title = title 16 | notification.subtitle = subtitle 17 | notification.informativeText = informativeText 18 | notification.soundName = soundName 19 | NSUserNotificationCenter.default.deliver(notification) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /cuImage/QiniuHostInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QiniuHostInfo.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 05/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | final class QiniuHostInfo: HostInfo { 12 | var accessKey = "" 13 | var secretKey = "" 14 | var bucket = "" 15 | var directory = "" 16 | var domain = "" 17 | 18 | convenience init(name: String = "Qiniu", accessKey: String, secretKey: String, bucket: String, directory: String = "", domain: String) { 19 | self.init() 20 | 21 | self.name = name 22 | self.accessKey = accessKey 23 | self.secretKey = secretKey 24 | self.bucket = bucket 25 | self.directory = directory 26 | self.domain = domain 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /cuImage/ServicesProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ServicesProvider.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 13/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | final class ServicesProvider: NSObject { 12 | func handleUploadService(_ pboard: NSPasteboard, userData: String, error: AutoreleasingUnsafeMutablePointer) { 13 | UploadManager.shared.uploadImagesOnPasteboard(pboard) 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /cuImage/ShortcutManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShortcutManager.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 06/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import MASShortcut 11 | 12 | // MARK: - ShortcutManager 13 | final class ShortcutManager { 14 | static let shared = ShortcutManager() 15 | 16 | private init() { 17 | // Set the value transformer for MASShortcut. 18 | let transformer = ValueTransformer(forName: .keyedUnarchiveFromDataTransformerName)! 19 | MASShortcutBinder.shared().bindingOptions = [NSBindingOption.valueTransformer: transformer] 20 | 21 | bindShortcuts() 22 | } 23 | 24 | private func bindShortcuts() { 25 | MASShortcutBinder.shared().bindShortcut(withDefaultsKey: PreferenceKeys.popUpStatusItemMenuShortcut.rawValue, 26 | toAction: popUpStatusItemMenu) 27 | MASShortcutBinder.shared().bindShortcut(withDefaultsKey: PreferenceKeys.uploadImageShortcut.rawValue, 28 | toAction: uploadImageOnPasteboard) 29 | } 30 | } 31 | 32 | // MARK: - Shortcut Actions 33 | extension ShortcutManager { 34 | fileprivate func uploadImageOnPasteboard() { 35 | UploadManager.shared.uploadImagesOnPasteboard() 36 | } 37 | 38 | fileprivate func popUpStatusItemMenu() { 39 | StatusItemController.shared.menu.popUp(positioning: nil, at: NSEvent.mouseLocation, in: nil) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /cuImage/ShortcutsPreferencesPaneController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShortcutsPreferencesPaneController.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 03/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import MASShortcut 11 | 12 | final class ShortcutsPreferencesPaneController: BasePreferencesPaneController { 13 | @IBOutlet weak var popUpStatusItemMenuShortcutView: MASShortcutView! 14 | @IBOutlet weak var uploadImageShortcutView: MASShortcutView! 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | // Join the key view loop, but without focus ring. 20 | uploadImageShortcutView.setAcceptsFirstResponder(true) 21 | uploadImageShortcutView.associatedUserDefaultsKey = PreferenceKeys.uploadImageShortcut.rawValue 22 | 23 | popUpStatusItemMenuShortcutView.setAcceptsFirstResponder(true) 24 | popUpStatusItemMenuShortcutView.associatedUserDefaultsKey = PreferenceKeys.popUpStatusItemMenuShortcut.rawValue 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /cuImage/String+Crypto.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Crypto.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 03/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum CryptoAlgorithm { 12 | case md5, sha1, sha224, sha256, sha384, sha512 13 | 14 | var hmacAlgorithm: CCHmacAlgorithm { 15 | var result: Int = 0 16 | switch self { 17 | case .md5: result = kCCHmacAlgMD5 18 | case .sha1: result = kCCHmacAlgSHA1 19 | case .sha224: result = kCCHmacAlgSHA224 20 | case .sha256: result = kCCHmacAlgSHA256 21 | case .sha384: result = kCCHmacAlgSHA384 22 | case .sha512: result = kCCHmacAlgSHA512 23 | } 24 | return CCHmacAlgorithm(result) 25 | } 26 | 27 | var digestLength: Int { 28 | var result: Int32 = 0 29 | switch self { 30 | case .md5: result = CC_MD5_DIGEST_LENGTH 31 | case .sha1: result = CC_SHA1_DIGEST_LENGTH 32 | case .sha224: result = CC_SHA224_DIGEST_LENGTH 33 | case .sha256: result = CC_SHA256_DIGEST_LENGTH 34 | case .sha384: result = CC_SHA384_DIGEST_LENGTH 35 | case .sha512: result = CC_SHA512_DIGEST_LENGTH 36 | } 37 | return Int(result) 38 | } 39 | } 40 | 41 | extension String { 42 | func hmac(algorithm: CryptoAlgorithm, key: String) -> String { 43 | let string = cString(using: .utf8) 44 | let stringLength = Int(lengthOfBytes(using: .utf8)) 45 | let keyString = key.cString(using: .utf8) 46 | let keyLength = Int(key.lengthOfBytes(using: .utf8)) 47 | var result = [UInt8](repeating: 0, count: algorithm.digestLength) 48 | 49 | CCHmac(algorithm.hmacAlgorithm, keyString!, keyLength, string!, stringLength, &result) 50 | 51 | return Data(bytes: result).urlSafeBase64EncodedString() 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /cuImage/String+Random.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Random.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 19/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension String { 12 | static func random(length: Int) -> String { 13 | var string = "" 14 | let letters = Constants.characterSet 15 | let count = UInt32(letters.count) 16 | 17 | for _ in 0.. String? { 20 | let options: [String: Any?] = [kCGImageSourceShouldCache as String: false] 21 | 22 | if let source = CGImageSourceCreateWithURL(self as CFURL, options as CFDictionary), 23 | let uti = CGImageSourceGetType(source), 24 | !UTTypeConformsTo(uti, kUTTypePDF), 25 | UTTypeConformsTo(uti, kUTTypeImage) == true { 26 | return (uti as String).components(separatedBy: ".").last 27 | } else { 28 | return nil 29 | } 30 | } 31 | 32 | /// Determine whether the URL conforms to the specified UTI type. 33 | /// 34 | /// - Parameter type: The uniform type identifier against which to test conformance. 35 | /// - Returns: True if the URL conforms to the UTI type, false if not. 36 | func conformsToUTI(type: CFString) -> Bool { 37 | let pathExtension = self.pathExtension as CFString 38 | let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) 39 | if let uti = uti?.takeRetainedValue() { 40 | return UTTypeConformsTo(uti, type) 41 | } else { 42 | return false 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /cuImage/cuImage-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import 6 | #import 7 | -------------------------------------------------------------------------------- /cuImage/cuImage.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-write 8 | 9 | com.apple.security.network.client 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/AboutWindowController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "About"; ObjectID = "F0z-JX-Cv5"; */ 3 | "F0z-JX-Cv5.title" = "关于"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Copyright © 2017 Lizhen Hu. All rights reserved."; ObjectID = "fPv-Ot-VcE"; */ 6 | "fPv-Ot-VcE.title" = "Copyright © 2017 Lizhen Hu. All rights reserved."; 7 | 8 | /* Class = "NSTextFieldCell"; title = "Version 1.2.3 (123)"; ObjectID = "gfO-PH-oqJ"; */ 9 | "gfO-PH-oqJ.title" = "Version 1.2.3 (123)"; 10 | 11 | /* Class = "NSTextFieldCell"; title = "cuImage"; ObjectID = "phg-vz-Gmt"; */ 12 | "phg-vz-Gmt.title" = "cuImage"; 13 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/HostsPreferencesPaneController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSButtonCell"; title = "Save"; ObjectID = "7iJ-tS-UOQ"; */ 3 | "7iJ-tS-UOQ.title" = "保存"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Validation Result"; ObjectID = "J5V-bl-31N"; */ 6 | "J5V-bl-31N.title" = "验证结果"; 7 | 8 | /* Class = "NSButtonCell"; title = "Validate"; ObjectID = "RL5-pB-8JI"; */ 9 | "RL5-pB-8JI.title" = "验证"; 10 | 11 | /* Class = "NSTextFieldCell"; title = "Host:"; ObjectID = "SWh-CA-qNC"; */ 12 | "SWh-CA-qNC.title" = "主机:"; 13 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/PreferencesWindowController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "F0z-JX-Cv5"; */ 3 | "F0z-JX-Cv5.title" = "偏好设置"; 4 | 5 | /* Class = "NSToolbarItem"; label = "Hosts"; ObjectID = "F7E-0o-4KX"; */ 6 | "F7E-0o-4KX.label" = "主机"; 7 | 8 | /* Class = "NSToolbarItem"; paletteLabel = "Hosts"; ObjectID = "F7E-0o-4KX"; */ 9 | "F7E-0o-4KX.paletteLabel" = "主机"; 10 | 11 | /* Class = "NSToolbarItem"; label = "Shortcuts"; ObjectID = "Rzg-nJ-aHP"; */ 12 | "Rzg-nJ-aHP.label" = "快捷键"; 13 | 14 | /* Class = "NSToolbarItem"; paletteLabel = "Shortcuts"; ObjectID = "Rzg-nJ-aHP"; */ 15 | "Rzg-nJ-aHP.paletteLabel" = "快捷键"; 16 | 17 | /* Class = "NSToolbarItem"; label = "General"; ObjectID = "bua-bb-1FB"; */ 18 | "bua-bb-1FB.label" = "通用"; 19 | 20 | /* Class = "NSToolbarItem"; paletteLabel = "General"; ObjectID = "bua-bb-1FB"; */ 21 | "bua-bb-1FB.paletteLabel" = "通用"; 22 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/QiniuHostInfoViewController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "The domain should begin with \"https://\" or \"http://\"."; ObjectID = "1em-c9-YCx"; */ 3 | "1em-c9-YCx.title" = "域名需要以\"https://\"或\"http://\"开头。"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Access Key:"; ObjectID = "3td-6B-hge"; */ 6 | "3td-6B-hge.title" = "访问密钥:"; 7 | 8 | /* Class = "NSTextFieldCell"; title = "Bucket:"; ObjectID = "4zU-2Q-wm9"; */ 9 | "4zU-2Q-wm9.title" = "空间:"; 10 | 11 | /* Class = "NSTextFieldCell"; title = "Domain:"; ObjectID = "6HR-Hx-Efy"; */ 12 | "6HR-Hx-Efy.title" = "域名:"; 13 | 14 | /* Class = "NSSecureTextFieldCell"; placeholderString = "Required"; ObjectID = "NdT-Hl-jG4"; */ 15 | "NdT-Hl-jG4.placeholderString" = "必填"; 16 | 17 | /* Class = "NSTextFieldCell"; placeholderString = "Optional"; ObjectID = "k65-Qv-FSY"; */ 18 | "k65-Qv-FSY.placeholderString" = "可选"; 19 | 20 | /* Class = "NSTextFieldCell"; title = "Directory:"; ObjectID = "pLX-mB-MWm"; */ 21 | "pLX-mB-MWm.title" = "目录:"; 22 | 23 | /* Class = "NSTextFieldCell"; title = "Secret Key:"; ObjectID = "pQo-lV-kJy"; */ 24 | "pQo-lV-kJy.title" = "私密密钥:"; 25 | 26 | /* Class = "NSTextFieldCell"; placeholderString = "Required"; ObjectID = "pWA-YB-9Af"; */ 27 | "pWA-YB-9Af.placeholderString" = "必填"; 28 | 29 | /* Class = "NSTextFieldCell"; placeholderString = "Required"; ObjectID = "q2w-Z1-heO"; */ 30 | "q2w-Z1-heO.placeholderString" = "必填"; 31 | 32 | /* Class = "NSTextFieldCell"; placeholderString = "Required"; ObjectID = "yf9-Cz-x3k"; */ 33 | "yf9-Cz-x3k.placeholderString" = "必填"; 34 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/ServicesMenu.strings: -------------------------------------------------------------------------------- 1 | /* 2 | ServicesMenu.strings 3 | cuImage 4 | 5 | Created by Lizhen Hu on 13/02/2017. 6 | Copyright © 2017 Lizhen Hu. All rights reserved. 7 | */ 8 | 9 | "Upload with cuImage" = "使用cuImage上传"; 10 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/ShortcutsPreferencesPaneController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "Upload image on pasteboard:"; ObjectID = "2JL-FK-U4P"; */ 3 | "2JL-FK-U4P.title" = "上传粘贴板中的图片:"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Pop up cuImage menu:"; ObjectID = "dmD-JZ-ENe"; */ 6 | "dmD-JZ-ENe.title" = "弹出cuImage菜单:"; 7 | -------------------------------------------------------------------------------- /cuImage/zh-Hans.lproj/StatusItemController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSMenuItem"; title = "Upload History"; ObjectID = "Kfr-2y-AEv"; */ 3 | "Kfr-2y-AEv.title" = "上传历史"; 4 | 5 | /* Class = "NSMenuItem"; title = "Quit cuImage"; ObjectID = "N8H-WJ-Zsf"; */ 6 | "N8H-WJ-Zsf.title" = "退出cuImage"; 7 | 8 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "VJI-Pz-n2Z"; */ 9 | "VJI-Pz-n2Z.title" = "偏好设置…"; 10 | 11 | /* Class = "NSMenuItem"; title = "Upload Image"; ObjectID = "Vr8-wq-G2e"; */ 12 | "Vr8-wq-G2e.title" = "上传图片"; 13 | 14 | /* Class = "NSMenu"; title = "Upload History"; ObjectID = "dXn-LR-h8h"; */ 15 | "dXn-LR-h8h.title" = "上传历史"; 16 | 17 | /* Class = "NSMenuItem"; title = "About…"; ObjectID = "mYk-F7-yO9"; */ 18 | "mYk-F7-yO9.title" = "关于…"; 19 | 20 | /* Class = "NSMenuItem"; title = "Feedback…"; ObjectID = "ysP-BG-gE2"; */ 21 | "ysP-BG-gE2.title" = "反馈…"; 22 | -------------------------------------------------------------------------------- /cuImageLauncher/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // cuImageLauncher 4 | // 5 | // Created by Lizhen Hu on 08/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /cuImageLauncher/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // cuImageLauncher 4 | // 5 | // Created by Lizhen Hu on 08/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | 13 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 14 | // Check whether the main application is already running. 15 | BOOL isRunning = NO; 16 | NSString *key = @"MainBundleIdentifier"; 17 | NSString *mainBundleIdentifier = (NSString *)[NSBundle mainBundle].infoDictionary[key]; 18 | NSArray *runningApplications = [NSWorkspace sharedWorkspace].runningApplications; 19 | for (NSRunningApplication *app in runningApplications) { 20 | if ([app.bundleIdentifier isEqualToString:mainBundleIdentifier]) { 21 | isRunning = true; 22 | break; 23 | } 24 | } 25 | 26 | if (!isRunning) { 27 | // Get absolute path of the main application. 28 | NSMutableArray *pathComponents = (NSMutableArray *)[[NSBundle mainBundle].bundlePath componentsSeparatedByString:@"/"]; 29 | [pathComponents removeLastObject]; 30 | [pathComponents removeLastObject]; 31 | [pathComponents removeLastObject]; 32 | [pathComponents removeLastObject]; 33 | NSString *appPath = [pathComponents componentsJoinedByString:@"/"]; 34 | 35 | // Launch the main application. 36 | [[NSWorkspace sharedWorkspace] launchApplication:appPath]; 37 | } 38 | 39 | // Terminate the launcher. 40 | [NSApp terminate:self]; 41 | } 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /cuImageLauncher/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // cuImageLauncher 4 | // 5 | // Created by Lizhen Hu on 07/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | func applicationDidFinishLaunching(_ aNotification: Notification) { 14 | // Check whether the main application is already running. 15 | var isRunning = false 16 | let key = "MainBundleIdentifier" 17 | let mainBundleIdentifier = Bundle.main.infoDictionary![key] as! String 18 | let runningApplications = NSWorkspace.shared().runningApplications 19 | for app in runningApplications { 20 | if app.bundleIdentifier == mainBundleIdentifier { 21 | isRunning = true 22 | break 23 | } 24 | } 25 | 26 | if !isRunning { 27 | // Get absolute path of the main application. 28 | let pathComponents = Bundle.main.bundlePath.components(separatedBy: "/") 29 | let appPath = pathComponents[0.. 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /cuImageLauncher/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSBackgroundOnly 26 | 27 | LSMinimumSystemVersion 28 | $(MACOSX_DEPLOYMENT_TARGET) 29 | MainBundleIdentifier 30 | com.hulizhen.cuImage 31 | NSHumanReadableCopyright 32 | Copyright © 2017 Lizhen Hu. All rights reserved. 33 | NSMainNibFile 34 | MainMenu 35 | NSPrincipalClass 36 | NSApplication 37 | 38 | 39 | -------------------------------------------------------------------------------- /cuImageLauncher/cuImageLauncher.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /cuImageLauncher/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // cuImageLauncher 4 | // 5 | // Created by Lizhen Hu on 08/02/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /cuImageLauncher/zh-Hans.lproj/MainMenu.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /cuImageTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /cuImageTests/NSPasteboardTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSPasteboardTests.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 20/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import cuImage 11 | 12 | class NSPasteboardTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | let urlString = "http://test_url_string.jpeg" 26 | var strings = [String]() 27 | for i in 0..<10 { 28 | let string = urlString + "\(i)" 29 | strings.append(string) 30 | } 31 | 32 | NSPasteboard.general.addURLStrings(strings, markdown: true) 33 | } 34 | 35 | func testPerformanceExample() { 36 | // This is an example of a performance test case. 37 | self.measure { 38 | // Put the code you want to measure the time of here. 39 | } 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /cuImageTests/QiniuHostTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QiniuHostTests.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 20/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import cuImage 11 | 12 | class QiniuHostTests: XCTestCase { 13 | 14 | var host = QiniuHost() 15 | 16 | override func setUp() { 17 | super.setUp() 18 | // Put setup code here. This method is called before the invocation of each test method in the class. 19 | } 20 | 21 | override func tearDown() { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | super.tearDown() 24 | } 25 | 26 | func testExample() { 27 | // This is an example of a functional test case. 28 | // Use XCTAssert and related functions to verify your tests produce the correct results. 29 | } 30 | 31 | func testPerformanceExample() { 32 | // This is an example of a performance test case. 33 | self.measure { 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /cuImageTests/StringTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringTests.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 20/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import cuImage 11 | 12 | class StringTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | } 26 | 27 | func testPerformanceExample() { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /cuImageTests/URLTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URLTests.swift 3 | // cuImage 4 | // 5 | // Created by Lizhen Hu on 15/01/2017. 6 | // Copyright © 2017 Lizhen Hu. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import cuImage 11 | 12 | class URLTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | // Copy one or more image files onto the general pasteboard. 25 | func testImageFileExtension() { 26 | let pasteboard = NSPasteboard.general 27 | let classes: [AnyClass] = [NSImage.self, NSURL.self] 28 | let options: [NSPasteboard.ReadingOptionKey : Any]? = nil 29 | guard pasteboard.canReadObject(forClasses: classes, options: options) else { return } 30 | guard let objects = pasteboard.readObjects(forClasses: classes, options: options) else { return } 31 | 32 | for object in objects { 33 | if let url = object as? URL { 34 | print("[Path: \(url), Extension: \(url.imageFileExtension() ?? "")]") 35 | } 36 | } 37 | } 38 | 39 | func testExample() { 40 | // This is an example of a functional test case. 41 | // Use XCTAssert and related functions to verify your tests produce the correct results. 42 | } 43 | 44 | func testPerformanceExample() { 45 | // This is an example of a performance test case. 46 | self.measure { 47 | // Put the code you want to measure the time of here. 48 | } 49 | } 50 | 51 | } 52 | --------------------------------------------------------------------------------