[
  {
    "path": ".codecov.yml",
    "content": "coverage:\n  status:\n    project: off\n    patch: off\n  ignore:\n    - cmake-debug-build/*\n    - Example/*\n    - Scripts/*\n    - Documentaion/*\n    - Tests/*\n    - Pods/*\n    - Applications/Xcode.app/*\n    - vendor/*\n    - Carthage/*\n    - build/*\n    - .build/*\n    - .vagrant/*\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**iPhone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - iOS Version: [e.g. iOS9.3]\n - Xcode Version [e.g. 9.3]\n - Dependency Manager Version [e.g. CocoaPods 1.5.2, Carthage 0.29.0]\n - SwiftEntryKit Release # [e.g. 0.2.0]\n\n**Additional context**\nAdd any other context about the problem here.\n\n**Screenshots / Video Links**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".gitignore",
    "content": "# OS X\n.DS_Store\n\n# Xcode\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n*.xccheckout\nprofile\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n\n# Bundler\n.bundle\n\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n.build/\n\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# SwiftPM\n.swiftpm/\nPackage.resolved\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nosx_image: xcode12.5\ncache: cocoapods\npodfile: Example/Podfile\n\nenv:\n  global:\n    - WORKSPACE=Example/SwiftEntryKit.xcworkspace\n    - SCHEME=SwiftEntryKitDemo\n\n# travis cache isn't kept between builds\nbefore_install:\n  - rvm use system\n  - sudo gem install xcpretty\n  - sudo gem install cocoapods -v '1.11.2'\n  - pod repo update\n\nscript:\n- set -o pipefail\n- carthage update --use-xcframeworks\n- xcodebuild clean build test -workspace \"$WORKSPACE\" -scheme \"$SCHEME\" -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=13.6,name=iPhone 11' -configuration Debug | xcpretty\n- bash <(curl -s https://codecov.io/bash) -J 'SwiftEntryKit'\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\nAny notable changes to this project will be documented in this file.\n\n## 2.0.0\n\n- Embed QuickLayout's source files within SwiftEntryKit \n\n## 1.2.7\n\n### Fixes\n\n- #324 - iOS 14.2 keyWindow is always EKWindow\n- #277 - EKContentView.panGestureRecognized(gr:) crash \n\n## 1.2.6\n\n### Features\n\nhttps://github.com/huri000/SwiftEntryKit/pull/307\n\n### Fixes\n\nSetting key window correctly:\nSee https://github.com/huri000/SwiftEntryKit/issues/308 and https://github.com/huri000/SwiftEntryKit/pull/309.\n\n## 1.2.5\n\n### Accessibility\n\n- https://github.com/huri000/SwiftEntryKit/issues/222\n- https://github.com/huri000/SwiftEntryKit/issues/294\n\n## 1.2.4\n\n### Fixes\n- Remove scene from window: https://github.com/huri000/SwiftEntryKit/pull/299\n- Added size option for EKRatingSymbolsContainerView: https://github.com/huri000/SwiftEntryKit/pull/266\n- Access the foreground active window using connectedScenes: https://github.com/huri000/SwiftEntryKit/pull/257\n\n### Chore\n- Fix CI: https://github.com/huri000/SwiftEntryKit/pull/300\n\n## 1.2.3\nFix #253 - force unwrap for `EKMessageContentView`'s `subtitleContent` when `nil` is provided.\n\n## 1.2.1\nExpose `EKWindow` publicly as `UIWindow`.\nAdd a warning for misuse of `EKAttributes.PopBehavior`.\n\n## 1.2.0\nAdjustment for iOS projects are are using `SwiftUI` as their default setup in their `plist`.\n\n\n## 1.1.4\nFixes: #231 (iPad + iOS13) entries background is not interactable. \n\n## 1.1.3\nFix `SPM` release\n\n## 1.1.2\nFix: `EKTextField` crashes once no `tintColor` is provided.  \n\n## 1.1.1\niOS 13 color fix\n\n## 1.1.0\n\n### Support dark mode  (breaking change)\nFully support dark mode pre iOS 13. New requirments were introduced:\n- `UIColor` was replaced with `EKColor` to allow specifying colors for light and dark modes.\n- `UIBlurEffect.Style` was replacd with `EKAttributes.BackgroundStyle.BlurStyle` to allow specifying visual effects for light and dark modes.\n- `EKAttributes` contains a new attribute named `displayMode: DisplayMode`. `displayMode` has the default value `.inferred`, which means that the display mode will be inferred from the user interface style. If the running iOS version is lower than 13, the display mode will be inferred as light mode.\n- All the presets support the new display mode by allowing to specify `displayMode` for their `EKProperty`\n\nThe list of `EKProperty` constructs that contain `displayMode`: \n- `ButtonContent` - button descriptor\n- `LabelStyle` - label style descriptor\n- `ImageContent` - image view descriptor\n- `TextFieldContent` - text field descriptor\n- `ButtonBarContent`  - button bar descriptor\n\n### Revamp coding style\nThe project coding style was revamped to be more friendly and readable.\n\n## 1.0.4\n\n### Issues:\n- #191 - customized components support accessibility.\n\n## 1.0.2\n\n### Issues: \n- #187 - ButtonBarContent` initialized with multiple buttons received as either variadic parameter or array.\n\n## 1.0.1\n\n### Bug Fixes:\n\n#### #171\n[Issue #171](https://github.com/huri000/SwiftEntryKit/issues/171) - Unable to dismiss a ViewControllerEntry in Xcode 10.2 (work in Xcode 10.1).\nDiagnosis: \nOnly on Xcode 10.2. Probably be a Swift compiler bug. \nReproduced using Release configuration. \nThe compiler mistreats `UserInteraction.isResponsive` thus it always returns `false` when used on `attributes.screenInteraction`.\n\n## 1.0.0\n\nSwift 5 / Xcode 10.2 compatible.\n\n## 0.8.9\n\n### Features:\n\n#### #155 \n[Issue #155](https://github.com/huri000/SwiftEntryKit/issues/155) - Setting textfield cursor color for EKProperty.TextFieldContent.\n\n`TextFieldContent` receives `tintColor` from now on.\n\n#### #160\n[Issue #160](https://github.com/huri000/SwiftEntryKit/issues/160) - Animation with sequence of images\n\nFrom now on developers are able to sequence-animate and transform-animate every image within the presets using one of the designated public initializers available for `EKProperty.ImageContent`.\n\n## 0.8.8\n\n### Bug Fixes:\n\n#### #109\n[Issue #109](https://github.com/huri000/SwiftEntryKit/issues/109) - StatusBar appareance when moving to another UIViewController. Added another tatus bar type - `.ignored`. Using this ignores the status bar when the entry enters/exits the screen.\n\n#### #143\n[Issue #143](https://github.com/huri000/SwiftEntryKit/issues/143) - Orientation incorrect when set to .portraitUpsideDown on iPhone. \nChanged `isRotationEnabled` to `Rotation` structure. \n\n```Swift\n/** Rotation related position constraints */\npublic struct Rotation {\n\n    /** Attributes of supported interface orientations */\n    public enum SupportedInterfaceOrientation {\n\n        /** Uses standard supported interface orientation (target specification in general settings) */\n        case standard\n\n        /** Supports all orinetations */\n        case all\n    }\n\n    /** Autorotate the entry along with the device orientation */\n    public var isEnabled: Bool\n\n    /** The screen autorotates with accordance to this option */\n    public var supportedInterfaceOrientations: SwiftEntryKit.EKAttributes.PositionConstraints.Rotation.SupportedInterfaceOrientation\n}\n```\n\n#### Button Bar Horizontal Distribution Threshold\n`EKProperty.ButtonBarContent` supports an upper horizontal threshold for its button distribution.\n`EKProperty.ButtonBarContent` has an `Int` property named `horizontalDistributionThreshold`. It must be positive.\n\n## 0.8.7\n\n### Bug Fixes:\n\n[Issue #117](https://github.com/huri000/SwiftEntryKit/issues/117) - Round buttons in alert.\n\n## 0.8.6\n[Issue #121](https://github.com/huri000/SwiftEntryKit/issues/121) - Long title for alert buttons.\n\n## 0.8.4\n\n### Bug Fixes:\n[Issue #131](https://github.com/huri000/SwiftEntryKit/issues/131) - `EKAttributes.PositionConstraints` initializer parameter isn't referenced in implementation.\n\n## 0.8.3\n\n### Bug Fixes:\n[Issue #132](https://github.com/huri000/SwiftEntryKit/issues/132) - Background dimmed view is NOT animating.\n\n## 0.8.2\n\n### Bug Fixes:\n[Issue #119](https://github.com/huri000/SwiftEntryKit/issues/119) - Entry tap gesture doesn't cancel touches inside the entry view. \n\n## 0.8.1\n\nApply a necessary fix for Xcode 10 and older than 4.2 Swift version compatibility.\n\n## 0.8.0\n\n### Enhancements\n\nAdjustments for Swift 4.2. \n\nRelated Issue: [Swift 4.2 Support #108](https://github.com/huri000/SwiftEntryKit/issues/108)\n\n## 0.7.2\n\n### Bug Fixes\n\n[numberOfLines property #111](https://github.com/huri000/SwiftEntryKit/issues/111) - Allow multiple lines in image notes.\n\n## 0.7.1\n\n### Feature - Add a way to make a specific text field first responder in `EKFormMessageView`\n\nRelated issue: [Best way to present keyboard #107](https://github.com/huri000/SwiftEntryKit/issues/107).\nThe window must be a key window, so setting `presentInsideKeyWindow` to `true` is necessary to achieve that goal. Likewise:\n\n```Swift\nSwiftEntryKit.display(entry: formMessageView, using: attributes, presentInsideKeyWindow: true)\n```\n\nIt is recommended to set `lifecycleEvents.didAppear` to  perform the keyboard showing action. For example:\n\n```Swift\nattributes.lifecycleEvents.didAppear = {\n    formMessageView.becomeFirstResponder(with: 0)\n}\n```\n\n## 0.7.0\n\n### Feature - Queue of Entries\n\n`displayPriority` is no longer nested inside `EKAttributes`. It has been replaced by another construct called `precedence`.\n`precedence` defines the manner in which a new entry is treated in case there already is another displayed entry. \n\n- See [Issue #103](https://github.com/huri000/SwiftEntryKit/issues/103) for feature basic requirements.\n- Please review the README.md and the API documentation to gain additional information.\n\n#### Backward Compatibility\n\nBe aware that `0.7.0` breaks previous releases.\nIn order to adjust previous usage to current behavior, just replace any instance of:\n\n```Swift\nattributes.displayPriority = value\n````\nTo the following:\n\n```Swift\nattributes.precedence = .override(priority: value, dropEnqueuedEntries: false)\n````\n\n## 0.6.1\n\n### Adjustments for Xcode 10.\n\n## 0.6.0\n\n### Autorotation flag for entries - [pull-request](https://github.com/huri000/SwiftEntryKit/pull/80)\n### Additional documentation in README.md.\n\n## 0.5.9\n\n### Issue [#85](https://github.com/huri000/SwiftEntryKit/pull/86)\nLifecycle event `willDisappear` does not get called on swipe and prompt removeal of entry.\n\n## 0.5.8\n\n### Issues Resolved:\n\n#### Allow injecting content into text field in form entry preset\n[How to set the value (not placeholder) to textfield for Forms preset? #79](https://github.com/huri000/SwiftEntryKit/issues/79)\n\nTo support text injection to `EKTextField`, some minor changes have been done:\n1. `EKTextField`'s `text` property has a setter now.\n2. `TextFieldContent`'s `output` has been changed to `textContent` and has a setter now.\n3. `outputWrapper` - changed to `contentWrapper`.\n\n## 0.5.7\n\n### Changes:\n\nDismiss entries using `touchesEnded` instead of `touchesBegan`. \n\n### Issues Fixed\n\n[Deployment target is 9.3, not 9.0 #78](https://github.com/huri000/SwiftEntryKit/issues/78)\n\n## 0.5.6\n\n### Bug Fixes:\n\n[App freezes on iOS 9.3.2 when displaying an entry and there is one shown already #73](https://github.com/huri000/SwiftEntryKit/issues/73)\n\n## 0.5.5\n\n### Bug Fix\n\n#### Status Bar Visibility\nStatus bar visibility using a view controller based status bar appearance\n\n### Improvements\n\n#### Entry Name\nEntry can have a name. That property can be optionally set.\nAlso,  `SwiftEntryKit` is added a new method:\n\n```Swift \npublic class func isCurrentlyDisplaying(entryNamed name: String? = default) -> Bool\n````\n\nIt can be used to inquire if a certain entry is currently displayed. \nIt might prove helpful to troubleshoot some issues using it, and it also a boilerplate for future developments.\n\n## 0.5.4\n\n### Changes\n\n#### Status Bar Style Appearance \nSwiftEntryKit supports applications that defines status bar behaviour that is based on the presented view controller. The related [issue](https://github.com/huri000/SwiftEntryKit/issues/66).\n\n#### Key Window\nSetting the entry window is key is not the default behavior anymore. The API \n`public class func display(entry view: UIView, using attributes: EKAttributes, presentInsideKeyWindow: Bool = default, rollbackWindow: RollbackWindow = default)`\n`public class func display(entry viewController: UIViewController, using attributes: EKAttributes, presentInsideKeyWindow: Bool = default, rollbackWindow: RollbackWindow = default)`\n\n#### Visual Effect View Mask (Entry Background)\nPerformed only when really needed\n\n## 0.5.3\n\n### Feature:\n- [EKNotificationMessage has broken layout #64](https://github.com/huri000/SwiftEntryKit/issues/64) - Add margins to `EKNotificationMessage`.\n\n### Bug Fixes:\n- Animations of alert and EKRatingMessageView.\n- Constraints conflict in EKRatingMessageView\n\n## 0.5.2\n\n### Bug Fixes:\n- [iPhone X issue with presenting Alert right after previous was closed #62](https://github.com/huri000/SwiftEntryKit/issues/62)\n\n## 0.5.1\n\nRollback window bug fix\n\n## 0.5.0\n\n### Features\n\nHandled the issue *[Exclude keyWindow occupancy #56](https://github.com/huri000/SwiftEntryKit/issues/56)* by adding an additional parameter `rollbackWindow` to `SwiftEntryKit.display` methods.\n\nThe  revised interface is as follows:\n\n`public class func display(entry view: UIView, using attributes: EKAttributes, rollbackWindow: UIWindow = default)`\n`public class func display(entry viewController: UIViewController, using attributes: EKAttributes, rollbackWindow: UIWindow = default)`\n\nAfter the entry has been dismissed, SwiftEntryKit rolls back to the given window value. By default it is the application key window.\n\n## 0.4.3\n\n### Bug Fixes\n\n- [Shadow won't work with round corners #55](https://github.com/huri000/SwiftEntryKit/issues/55)\n- Small fix related to `EKRatingMessageView` initial presentation.\n\n## 0.4.2\n\n### Features\n\n[Feature request: Callback when presented and dismissed #50](https://github.com/huri000/SwiftEntryKit/issues/50)\n\n- Added a `LifecycleEvents` construct to `EKAttributes`. It contains the following optional callbacks: willAppear, didAppear, willDisappear, didDisappear for the currently displayed entry.\n- Added an optional completion handler for `SwiftEntryKit`'s `dismiss` method.\n\n## 0.4.1\n\n### Issues Handled\n\n[Keep Background Unchanged when 2 Consecutive Entry Screen Backgrounds Match #46](https://github.com/huri000/SwiftEntryKit/issues/46)\n\n## 0.4.0\n\n### Features\n\n#### [Use UIViewController as an entry #40](https://github.com/huri000/SwiftEntryKit/issues/40)\nDevelopers can now use a customized view controller as an entry.\nA sample has been added to the custom presets section in example project.\n\n## 0.3.3\n\n### Issues Handled:\n* [Multiple button support? #19](https://github.com/huri000/SwiftEntryKit/issues/19)\n\n### Changes:\n\nEKButtonBarView exposes `func expand()`, it\n\n## 0.3.2\n\n### Bug Fixes\n\n* [EKAlertMessageView fail to layout all of the ButtonContents inside EKAlertMessage #41](https://github.com/huri000/SwiftEntryKit/issues/41)\n\n## 0.3.1\n\n### Features\n\n* Alert & Notification Entries are image-less as well. The image parameter is optional, in case it has a `nil` value, the entry is generated without it.\n* Added `numberOfLines` to `EKProperty.LabelStyle`. \n\n## 0.3.0\n\n### Bug Fixes\n\n#### Typos\n`EKAttributes.PositionConstraints.SafeArea.isOverriden` to `EKAttributes.PositionConstraints.SafeArea.isOverridden`\n`EKAttributes.PositionConstraints.SafeArea.overriden` to `EKAttributes.PositionConstraints.SafeArea.overridden`\n\n### Features\n\n#### Added an entry transform feature (ALPHA FEATURE)\n\nDevelopers are able to transform an entry to another entry using the same attributes.\n\n```Swift\nlet view = UIView()\n// Customize\nSwiftEntryKit.transform(to: view)\n```\n\n#### Rating Popup \n\nAdded a rating popup (See custom presets).\nSee also: `EKRatingMessage` and `EKRatingMessageView`\n\n\n### Other Changes:\n\n#### Image-less popups\n\n`EKPopUpMessage` can be image-less by simply setting `themeImage` to `nil` (or leaving its default value as is).\n\n```Swift\n/** Popup theme image */\npublic struct ThemeImage {\n\n    /** Position of the theme image */\n    public enum Position {\n        case topToTop(offset: CGFloat)\n        case centerToTop(offset: CGFloat)\n    }\n\n    /** The content of the image */\n    public var image: EKProperty.ImageContent\n\n    /** The psotion of the image */\n    public var position: Position\n}\n\npublic init(themeImage: ThemeImage? = default, title: EKProperty.LabelContent, description: EKProperty.LabelContent, button: EKProperty.ButtonContent, action: @escaping EKPopUpMessageAction)\n```\n\n## 0.2.4\n\n### Features\n\n### Explicit direction of translation animation\n`EKAttributes.Animation.Translate` is added an `anchorPosition: AnchorPosition` property:\n\nThat means that an entry can translate from the top and exit from the bottom, and vice versa.\n\n```Swift\n/** Describes the anchor position */\npublic enum AnchorPosition {\n\n    /** Top position - the entry shows from top or exits towards the top */\n    case top\n\n    /** Bottom position - the entry shows from bottom or exits towards the bottom */\n    case bottom\n\n    /** Automatic position - the entry shows and exits according to EKAttributes.Position value. If the position of the entry is top, bottom, the entry's translation anchor is top, bottom - respectively.*/\n    case automatic\n}\n```\n\n`anchorPosition` is determined the direction of the translation animation and is `.automatic` by default, meaning that the anchor is set automatically according to its position - if the position (`EKAttributes.Position`) is `.top` / `bottom`, then the entry enters and exit from the top / bottom edge.\n\n## 0.2.3\n\n### Features\n\n#### Status bar revised\n* Instead of assigning the `UIStatusBarStyle`, use `EKAttributes.StatusBar` to define the status bar.\n* The benefit is an absolute control over the status bar appearance.\n* New statuses:\n- `.hidden` - Hides the status bar.\n-  `inferred` - Infer the style from the previous style.\n\n## 0.2.2\n\n### Features\nAdded Carthage Support\n\n## 0.2.1\n\n### Bug Fix\nThe text of the text-fields is accessible after tapping the button using `EKFormMessageView`. \nUse `output` property inside `EKProperty.TextFieldContent`.\n\n## 0.2.0\n\n### Features\n\n#### Keyboard support\nKeyboard support can be enabled using `EKAttributes.PositionConstraints.KeyboardRelation` enum.\n```Swift\n// 10pt bottom offset from keyboard and at least 5pts from the screen edge while the keyboard is displayed.\nattributes.positionConstraints.keyboardRelation = .bind(offset: .init(bottom: 10, screenEdgeResistance: 5))\n```\n\n#### Is Displaying \n\nInquire if SwiftEntryKit is currently displaying an entry:\n\n```Swift\nif SwiftEntryKit.isCurrentlyDisplaying {\n    /* Do Something */\n}\n```\n\n#### Naming\n\n`EKProperty.LabelStyle` replaced `EKProperty.Label`.\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at huri000@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nWhen contributing to this repository, please first discuss the change you wish to make via issue before making a change. \n\nPlease note we have a code of conduct, please follow it in all your interactions with the project.\n\n## Pull Request Process\n\n1. Ensure any install or build dependencies are removed before the end of the layer when doing a \n   build.\n2. Ensure that no newly created warnings where generated by SwiftLint in the process of building the project.\n3. Test that your code compiles using all dependency managers that are integrated into the project (for example: CocoaPods / Carthage / Swift Package Manager).\n4. In case of a newly created entry preset, please update the example project preset screen by adding an example.\n5. Update the README.md and the CHANGELOG.md with details of changes to the interface, this includes new environment \n   variables, exposed ports, useful file locations and container parameters.\n6. Increase the version numbers in any examples files and the README.md to the new version that this\n   Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).\n7. You may merge the Pull Request in once you have the sign-off of two other developers, or if you \n   do not have permission to do that, you may request the second reviewer to merge it for you.\n"
  },
  {
    "path": "CREDITS.md",
    "content": "# CREDITS\n\n## Attributions - Example Project Icons\n\nPlease be aware that any use of the icons included in the project requires attribution.\n\n<div>Icons made by <a href=\"https://www.flaticon.com/authors/pause08\" title=\"Pause08\">Pause08</a> from <a href=\"https://www.flaticon.com/\" title=\"Flaticon\">www.flaticon.com</a> is licensed by <a href=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\" target=\"_blank\">CC 3.0 BY</a></div>\n\n<div>Icons made by <a href=\"https://www.flaticon.com/authors/smashicons\" title=\"Smashicons\">Smashicons</a> from <a href=\"https://www.flaticon.com/\" title=\"Flaticon\">www.flaticon.com</a> is licensed by <a href=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\" target=\"_blank\">CC 3.0 BY</a></div>\n\n<div>Icons made by <a href=\"http://www.freepik.com\" title=\"Freepik\">Freepik</a> from <a href=\"https://www.flaticon.com/\" title=\"Flaticon\">www.flaticon.com</a> is licensed by <a href=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\" target=\"_blank\">CC 3.0 BY</a></div>\n\n<div>Icons made by <a href=\"https://www.flaticon.com/authors/iconnice\" title=\"Iconnice\">Iconnice</a> from <a href=\"https://www.flaticon.com/\" title=\"Flaticon\">www.flaticon.com</a> is licensed by <a href=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\" target=\"_blank\">CC 3.0 BY</a></div>\n"
  },
  {
    "path": "Example/Podfile",
    "content": "target 'SwiftEntryKitDemo' do\n    platform :ios, '9.0'\n    use_frameworks!\n    pod 'SwiftEntryKit', :path => '../'\nend\n\ntarget 'SwiftEntryKitTests' do\n    platform :ios, '9.0'\n    use_frameworks!\n    pod 'SwiftEntryKit', :path => '../'\nend\n"
  },
  {
    "path": "Example/Pods/Local Podspecs/SwiftEntryKit.podspec.json",
    "content": "{\n  \"name\": \"SwiftEntryKit\",\n  \"version\": \"2.0.0\",\n  \"summary\": \"A simple banner and pop-up displayer for iOS. Written in Swift.\",\n  \"platforms\": {\n    \"ios\": \"9.0\"\n  },\n  \"swift_versions\": \"5.0\",\n  \"requires_arc\": true,\n  \"description\": \"SwiftEntryKit is a banner presenter library for iOS. It can be used to easily display pop-ups and notification-like views within your iOS apps. SwiftEntryKit is highly customizable but also offers a bunch of beautiful presets that can be themed with your app fonts and colors.\",\n  \"homepage\": \"https://github.com/huri000/SwiftEntryKit\",\n  \"license\": {\n    \"type\": \"MIT\",\n    \"file\": \"LICENSE\"\n  },\n  \"authors\": {\n    \"Daniel Huri\": \"huri000@gmail.com\"\n  },\n  \"source\": {\n    \"git\": \"https://github.com/huri000/SwiftEntryKit.git\",\n    \"tag\": \"2.0.0\"\n  },\n  \"source_files\": \"Source/**/*\",\n  \"frameworks\": \"UIKit\",\n  \"swift_version\": \"5.0\"\n}\n"
  },
  {
    "path": "Example/Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0359FD65EC137FD6398B15FFA06FBD4E /* EKStyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EC14B2CF1D527FABE1F54F422445D /* EKStyleView.swift */; };\n\t\t0443B823D09728A6A4AAEA741ED0EC1A /* EKAttributes+StatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DD21DA534C8E34356D26932C0B72F1B /* EKAttributes+StatusBar.swift */; };\n\t\t055EFFC858E25B12CE2921EC8C7233EB /* EKAttributes+Validations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 780B2C0C027974C5B034C4FB8559B10F /* EKAttributes+Validations.swift */; };\n\t\t05D9D1E4C707A5F023A1F94ACF486AC2 /* EKPopUpMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3BEAB4B42918B40DE6441C8C1540552 /* EKPopUpMessageView.swift */; };\n\t\t068E825D6FE9520EBE3FA985C5AE4DA0 /* Pods-SwiftEntryKitDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D0598CC5B54F64EFF897D87A397E403E /* Pods-SwiftEntryKitDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t0A68662146E1586B4456FAB071D11DE2 /* QLCompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC25F9415CB019F995E220EF13ABAEE7 /* QLCompatibility.swift */; };\n\t\t0D2B4E91DB02BDA04E6BDF6DBA4A546E /* EKAttributes+UserInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10BAD6713BF41F1F4581FF4905CF4BE8 /* EKAttributes+UserInteraction.swift */; };\n\t\t0D6FB08663ED820FCE5FBE981E3C6A5A /* QLUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = B38771A605FA38F7F0D803B812F22552 /* QLUtils.swift */; };\n\t\t11E4007894DF1F2A3F475FBB8229F3A4 /* EKImageNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82AD8AAF58BF64460BD8C07EC4DF6E35 /* EKImageNoteMessageView.swift */; };\n\t\t14DE35A5C2A9CDA68974BB63E54E980E /* Pods-SwiftEntryKitTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78239DB78DD3345BC32A5B876DEA9726 /* Pods-SwiftEntryKitTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t18734EC046ABAA79202629307DC9F249 /* UIView+Responder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E8374EF3E6B232F142B5987EA67FCA /* UIView+Responder.swift */; };\n\t\t2192DBD932E0F15BB67ACDC05443661A /* EKAccessoryNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF205874ABD02019016E8D6F4823DF66 /* EKAccessoryNoteMessageView.swift */; };\n\t\t253D69D1B151BCD20DBBC6B6439C2033 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; };\n\t\t27AB779347FB4F77C5609ECC8E822D47 /* EKAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEBC3A780D3C8A2EB25437BA8E46F5F /* EKAlertMessage.swift */; };\n\t\t28E32E39AD8DAAF8D769DB804E262758 /* EKAttributes+PositionConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EBFF4F329202D38AE92B0E840A811B2 /* EKAttributes+PositionConstraints.swift */; };\n\t\t29BEEBBF37CF019B510DBFB73345AD85 /* UIApplication+EKAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F511D095B770B82902F13277AAF1AA6 /* UIApplication+EKAppearance.swift */; };\n\t\t302E32F7BE65307E4A589AFF78B43BB5 /* EKRatingSymbolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB0F9C7644E67B3E509B16CA9E1AE2E6 /* EKRatingSymbolView.swift */; };\n\t\t348C406EE636A76C1FD17BB1D6524F76 /* UIColor+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D30BCA570C5B5C8D4DA7E25F6254FA /* UIColor+Utils.swift */; };\n\t\t34D13E6FCD9A83500030FA87732A91E0 /* SwiftEntryKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF7CDDFB196B307A3EA5A9EDF93C2B1 /* SwiftEntryKit.swift */; };\n\t\t36882C85632251103A44F147853939AA /* EKNotificationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DAD42E5C17E9F7FB324D45E3F7EDA42 /* EKNotificationMessage.swift */; };\n\t\t462DE7325DE86EFA2F3EC52CEBD9C1E5 /* EKBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FDEAA72AA62231A344DBE12315E9605 /* EKBackgroundView.swift */; };\n\t\t4BA5FF5F702BD658E11F0DFFCBD8F48D /* EKButtonBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E075598D423EEA3ACC102DB53CDB8E8C /* EKButtonBarView.swift */; };\n\t\t4E375F46869D4ACA0012FD19C628D27C /* EntryAppearanceDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED55558861058207FDC79BE639B3AB22 /* EntryAppearanceDescriptor.swift */; };\n\t\t559047DE0FD0172BD098F42C46EC99BF /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55224D7193D977B96C4236E1F74164C /* GradientView.swift */; };\n\t\t55D8E7C94A4249CAD0CE60C5442C1647 /* UIView+Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C04EAE264EC7EFF0DA7C878F93D038E0 /* UIView+Shadow.swift */; };\n\t\t56E6DC85F5E9118377A587FB086E147B /* EKRootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE85EC51CF37128659CEB00BB891354 /* EKRootViewController.swift */; };\n\t\t595221C70FBCDB1D0B2A3A937F1920DF /* UIView+QLContentWrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45332FF34005CC3F284120BEEEA29FF2 /* UIView+QLContentWrap.swift */; };\n\t\t5A88DF76317A991C11AEB8F1FE918FBB /* UIViewArray+QuickLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CCA1057080C500AF93E7231B4A6CA52 /* UIViewArray+QuickLayout.swift */; };\n\t\t5C258564AFF20D612A3A339423F45584 /* Pods-SwiftEntryKitTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F352296AFDF8DE73AE8F78DB5150C5A7 /* Pods-SwiftEntryKitTests-dummy.m */; };\n\t\t60FC20D83228B2C4E383524E56F95CE2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */; };\n\t\t6ED875168F056413ECC87C941731E714 /* EKPopUpMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D431D0B0894B4B4EE88E680419E14CD /* EKPopUpMessage.swift */; };\n\t\t6FC9FC572974C469202D4ED5CD215B87 /* UIRectCorner+Short.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC54805D957AA8CD357A55ECD90EA0EF /* UIRectCorner+Short.swift */; };\n\t\t7108EDEF3D6F20A74A001A6095D5CEAF /* EKAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC59CB5292F0EFB0006711614DE389E /* EKAttributes.swift */; };\n\t\t714A8C1AC51A1123F085369F696D98E0 /* EKAttributes+LifecycleActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4727C79CD0DD7F6239E77E81AA1C6592 /* EKAttributes+LifecycleActions.swift */; };\n\t\t734E4D1053D35D868CD9E2089C951A30 /* EKAttributes+FrameStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED0B495FDB5638F0BC7EFCCEF42EA31A /* EKAttributes+FrameStyle.swift */; };\n\t\t7BBD4032CA2769A7B3D5F79E95264689 /* EKRatingMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CEBC832DB314A2208D054822F4DD85 /* EKRatingMessageView.swift */; };\n\t\t83D05E692A0CE612F52BC0B18745B370 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; };\n\t\t85C9E605B0FDDDFAE52C4C098400BAB6 /* HapticFeedbackGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D09C2BD9BF43CB402ECC6239DDE80B1 /* HapticFeedbackGenerator.swift */; };\n\t\t87DDE964048660CDA29BE9EFBB20A8A7 /* EKRatingMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC6592DF43B43BA46FC2CCA00C4F96F /* EKRatingMessage.swift */; };\n\t\t89A502FDBC5C0EF63831DD6A8537610A /* EntryCachingHeuristic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C977172E6A26597EAB05BDB41B2C104 /* EntryCachingHeuristic.swift */; };\n\t\t8A0A768C3ECBEEA388452EC31BEF6500 /* EKRatingSymbolsContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47B05649A80A383D3EF8B4D372370C5 /* EKRatingSymbolsContainerView.swift */; };\n\t\t8B9C14384B947160FDC8C9082DFAC126 /* EKAttributes+HapticFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7286E41D0650723E149E86FD1C04AF /* EKAttributes+HapticFeedback.swift */; };\n\t\t8BA44EB1BBDD85BB4527F5CA3A5776AD /* EKButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9B8F9B4651B86B74DCA4B914A4A1BE7 /* EKButtonView.swift */; };\n\t\t8D80DF7CFA1BE70D46E90462AE24C472 /* EKNotificationMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2239582C73BFB3D83DFDF57021299158 /* EKNotificationMessageView.swift */; };\n\t\t8E8D18BA7E2779FF915DD8D000E651F8 /* SwiftEntryKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E176C9E90FF69941C0F00D00FB87AF9 /* SwiftEntryKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t90F3D408915E74432EA7EEA31FA356E8 /* EKSimpleMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2BF4EDF85A16F4331293366AA50FF0E /* EKSimpleMessageView.swift */; };\n\t\t92C9D280AC667D5F46DF47A9ECFD6CF8 /* EKAttributes+PopBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3ACA36A2CDB4DFCE6EF6D0E9F6CC937 /* EKAttributes+PopBehavior.swift */; };\n\t\t952D70DA0B30FC34603159D7CCC7B3CE /* EKAttributes+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5D859AAFC1AF2603E93156384B31D9B /* EKAttributes+Position.swift */; };\n\t\t97AD66EB56B38157D92EEDBAEAECDBD0 /* EKWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32E1F387F3E3AE4CA929AB42EC170811 /* EKWindow.swift */; };\n\t\t98C43F17EB6BE6D18F9DA8EC7B2E04B0 /* EKEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90D533185CEAE773480AB26167E64EF9 /* EKEntryView.swift */; };\n\t\tA2413744FA4B848AA797FB365F69BFDC /* EKWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A9F62C7BFA289C715569ABCD8EC35AD /* EKWrapperView.swift */; };\n\t\tA2BA4820371B5FEC4F05DAD50C6ABF6E /* EKAttributes+BackgroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B2EE663224F44CF351C3AF280D17945 /* EKAttributes+BackgroundStyle.swift */; };\n\t\tA7011D8655938627E740F0C3CF8FA900 /* EKSimpleMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E7644AC1CA095C84B01E5BD5D080227 /* EKSimpleMessage.swift */; };\n\t\tAFA1DC023B3E88B337F09BA31B2D648A /* EKWindowProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9F579DFDB3C3CE8BE7E16084849EAB /* EKWindowProvider.swift */; };\n\t\tB0598238BC5A442270D9461A0E5A1D9D /* UIEdgeInsets+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 960DADF2CCCBDE8608C8DEDCA0B252EB /* UIEdgeInsets+Utils.swift */; };\n\t\tB3AE89438313BC2BACC4D0DE03FC3DEE /* EKXStatusBarMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31DB1E40DE39086DB4ADCFF6545A24E /* EKXStatusBarMessageView.swift */; };\n\t\tBA2DA0C04BFBAEE25E534E24CFFF395A /* EKMessageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A71EF7308CBBA90894BE1279E935279 /* EKMessageContentView.swift */; };\n\t\tBC62184178B9BEB545A13961210A05DC /* EKAttributes+DisplayMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A1D227F016C19203F287375463699A /* EKAttributes+DisplayMode.swift */; };\n\t\tC60B01D9CD508925C0CE73F3A494AC50 /* Pods-SwiftEntryKitDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9593CFAEB0028E56754D269C799C66B0 /* Pods-SwiftEntryKitDemo-dummy.m */; };\n\t\tC82054AF37DEB07E384A1525C3A90447 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; };\n\t\tC8887B7C8B331F253936A033C82E7035 /* EKContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F643E9B2DC1F62BA4538C437A5BCCDFA /* EKContentView.swift */; };\n\t\tC98CD0D413A41E34BCE66218A759A400 /* EKAlertMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF1A0D1C37229695C259A378F96D0FC /* EKAlertMessageView.swift */; };\n\t\tCB1EEDEDA94C738FAF66F1C885564292 /* EKAttributes+Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C0CFAEC4DF15650ED42C91AE124D09 /* EKAttributes+Animation.swift */; };\n\t\tCF185599178E4DC6478502FAD3A58872 /* UIView+QuickLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D26C2C8F8C400F9BF58E6A104D4E446 /* UIView+QuickLayout.swift */; };\n\t\tCF3C9AC716E31797CC2C3C81DECE4C97 /* UIView+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E492E141CA1F65D689237579F214854C /* UIView+Utils.swift */; };\n\t\tD51E20F00EB6CD7E0D7FF49D79E2F60C /* EKAttributes+Presets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613497986B31AA146AC04D2FF125081D /* EKAttributes+Presets.swift */; };\n\t\tD6AE33459B57384C2599C6C99F527BEB /* EKNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D88A10C90E97BC0A8854366B352F3EE /* EKNoteMessageView.swift */; };\n\t\tD7662DCD3ADE9F482B12D960A4517476 /* EKProcessingNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79629988A737E957C9B6F4684B504368 /* EKProcessingNoteMessageView.swift */; };\n\t\tDA0EC170AAC94082A6B5F33CF4DD391F /* EKAttributes+Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE027CC4289C30AD3E768FCE5CEF0B /* EKAttributes+Shadow.swift */; };\n\t\tDDA8C21B07CEAE9204BF7F435976CB9E /* EKFormMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3559532220E798158C20592737A02E39 /* EKFormMessageView.swift */; };\n\t\tED772CA4DAF478D6E0DF050C63F305F1 /* EKAttributes+Scroll.swift in Sources */ = {isa = PBXBuildFile; fileRef = D35FE84B7A5F378A9023B4D695D4B996 /* EKAttributes+Scroll.swift */; };\n\t\tEF4520313EBDD8C00BD5ACED2BACA34F /* EKTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE3F0BD1D54DD958EBE89944FD4CEE99 /* EKTextField.swift */; };\n\t\tF515A3A2C771F0BC0F95AA1BA4EEFFC1 /* EKAttributes+Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F169F2385B89ED18D6810657CDD3F6 /* EKAttributes+Duration.swift */; };\n\t\tF59A2355405C20F6DBA556CADC3C8C13 /* SwiftEntryKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E20C7F7CA20B9D50699AFD4AD5BCE358 /* SwiftEntryKit-dummy.m */; };\n\t\tF87B701EBA816F684B11F39CD1E39F47 /* EKAttributes+WindowLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7684F90C2E79E7591F8377058A81ADD0 /* EKAttributes+WindowLevel.swift */; };\n\t\tF8D5E276EAFEE938C91DDCECB67EF87C /* EKAttributes+Precedence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11FCF376F5FE3AE52C3EE4D32A474534 /* EKAttributes+Precedence.swift */; };\n\t\tF90BC550E43319147538AF88C987758E /* EKColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40327AF59BA584E6F6619BFCC3BAD434 /* EKColor.swift */; };\n\t\tFC942184FF87AFA768AE2CA8218F1EC2 /* EKProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F7A459E0E2A5540FEA8FDFEBD5766C1 /* EKProperty.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t963D784716C5E411F3ADD005A0BAC41B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = FEA6FF0588A91CCD972EDCD698B85647;\n\t\t\tremoteInfo = SwiftEntryKit;\n\t\t};\n\t\tC83659509B9A824D8B8B5FEE03EC4F73 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = FEA6FF0588A91CCD972EDCD698B85647;\n\t\t\tremoteInfo = SwiftEntryKit;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t0A1BEE5878A0598527D70E669A9DAF7E /* SwiftEntryKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = SwiftEntryKit.podspec; sourceTree = \"<group>\"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t0C6D2F6A9763A4610B812B9109ACA447 /* Pods-SwiftEntryKitDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = \"Pods-SwiftEntryKitDemo.modulemap\"; sourceTree = \"<group>\"; };\n\t\t0DC40BB88676D9A88905C0581BC836B6 /* SwiftEntryKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftEntryKit.release.xcconfig; sourceTree = \"<group>\"; };\n\t\t10BAD6713BF41F1F4581FF4905CF4BE8 /* EKAttributes+UserInteraction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+UserInteraction.swift\"; sourceTree = \"<group>\"; };\n\t\t11FCF376F5FE3AE52C3EE4D32A474534 /* EKAttributes+Precedence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Precedence.swift\"; sourceTree = \"<group>\"; };\n\t\t1A7286E41D0650723E149E86FD1C04AF /* EKAttributes+HapticFeedback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+HapticFeedback.swift\"; sourceTree = \"<group>\"; };\n\t\t1DAD42E5C17E9F7FB324D45E3F7EDA42 /* EKNotificationMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKNotificationMessage.swift; sourceTree = \"<group>\"; };\n\t\t1DD21DA534C8E34356D26932C0B72F1B /* EKAttributes+StatusBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+StatusBar.swift\"; sourceTree = \"<group>\"; };\n\t\t217D74CF28D2726D347E9E85D22057DA /* Pods-SwiftEntryKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-SwiftEntryKitTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t2239582C73BFB3D83DFDF57021299158 /* EKNotificationMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKNotificationMessageView.swift; sourceTree = \"<group>\"; };\n\t\t2909A9134D532B091BC4BB03EAF83E0D /* Pods-SwiftEntryKitDemo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-SwiftEntryKitDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t2E176C9E90FF69941C0F00D00FB87AF9 /* SwiftEntryKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SwiftEntryKit-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t2EBFF4F329202D38AE92B0E840A811B2 /* EKAttributes+PositionConstraints.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+PositionConstraints.swift\"; sourceTree = \"<group>\"; };\n\t\t32E1F387F3E3AE4CA929AB42EC170811 /* EKWindow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKWindow.swift; sourceTree = \"<group>\"; };\n\t\t3559532220E798158C20592737A02E39 /* EKFormMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKFormMessageView.swift; sourceTree = \"<group>\"; };\n\t\t355EC14B2CF1D527FABE1F54F422445D /* EKStyleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKStyleView.swift; sourceTree = \"<group>\"; };\n\t\t3720AACA3DCA014803908A2E0592E7C5 /* Pods-SwiftEntryKitDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-SwiftEntryKitDemo-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\t3A9F62C7BFA289C715569ABCD8EC35AD /* EKWrapperView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKWrapperView.swift; sourceTree = \"<group>\"; };\n\t\t3FDEAA72AA62231A344DBE12315E9605 /* EKBackgroundView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKBackgroundView.swift; sourceTree = \"<group>\"; };\n\t\t40327AF59BA584E6F6619BFCC3BAD434 /* EKColor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKColor.swift; sourceTree = \"<group>\"; };\n\t\t45332FF34005CC3F284120BEEEA29FF2 /* UIView+QLContentWrap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIView+QLContentWrap.swift\"; sourceTree = \"<group>\"; };\n\t\t4727C79CD0DD7F6239E77E81AA1C6592 /* EKAttributes+LifecycleActions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+LifecycleActions.swift\"; sourceTree = \"<group>\"; };\n\t\t498F2A87868A376E6C8B01A8EFF7D2AC /* SwiftEntryKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SwiftEntryKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t4B2EE663224F44CF351C3AF280D17945 /* EKAttributes+BackgroundStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+BackgroundStyle.swift\"; sourceTree = \"<group>\"; };\n\t\t4DF7CDDFB196B307A3EA5A9EDF93C2B1 /* SwiftEntryKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftEntryKit.swift; path = Source/SwiftEntryKit.swift; sourceTree = \"<group>\"; };\n\t\t5C977172E6A26597EAB05BDB41B2C104 /* EntryCachingHeuristic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EntryCachingHeuristic.swift; sourceTree = \"<group>\"; };\n\t\t5CC6592DF43B43BA46FC2CCA00C4F96F /* EKRatingMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKRatingMessage.swift; sourceTree = \"<group>\"; };\n\t\t5D26C2C8F8C400F9BF58E6A104D4E446 /* UIView+QuickLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIView+QuickLayout.swift\"; sourceTree = \"<group>\"; };\n\t\t5D431D0B0894B4B4EE88E680419E14CD /* EKPopUpMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKPopUpMessage.swift; sourceTree = \"<group>\"; };\n\t\t5E7D71B2861945983BDCF0A559AF1FC6 /* SwiftEntryKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftEntryKit.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t5F7A459E0E2A5540FEA8FDFEBD5766C1 /* EKProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKProperty.swift; sourceTree = \"<group>\"; };\n\t\t613497986B31AA146AC04D2FF125081D /* EKAttributes+Presets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Presets.swift\"; sourceTree = \"<group>\"; };\n\t\t62F1B1D97C760AD62E5A49983D4BDFA9 /* Pods-SwiftEntryKitTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-SwiftEntryKitTests-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t659C18D29D4B9D963A2AD7360AAACC30 /* Pods-SwiftEntryKitDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-SwiftEntryKitDemo.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t65D30BCA570C5B5C8D4DA7E25F6254FA /* UIColor+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIColor+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t67852BE5281D7C3C9D16CF8CB24FAEE4 /* SwiftEntryKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"SwiftEntryKit-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t6D09C2BD9BF43CB402ECC6239DDE80B1 /* HapticFeedbackGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HapticFeedbackGenerator.swift; sourceTree = \"<group>\"; };\n\t\t7684F90C2E79E7591F8377058A81ADD0 /* EKAttributes+WindowLevel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+WindowLevel.swift\"; sourceTree = \"<group>\"; };\n\t\t780B2C0C027974C5B034C4FB8559B10F /* EKAttributes+Validations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Validations.swift\"; sourceTree = \"<group>\"; };\n\t\t78239DB78DD3345BC32A5B876DEA9726 /* Pods-SwiftEntryKitTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-SwiftEntryKitTests-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t79629988A737E957C9B6F4684B504368 /* EKProcessingNoteMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKProcessingNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t7E7644AC1CA095C84B01E5BD5D080227 /* EKSimpleMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKSimpleMessage.swift; sourceTree = \"<group>\"; };\n\t\t7F6008542D45CF6DA2CF5F20B1B389D9 /* Pods-SwiftEntryKitTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-SwiftEntryKitTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t825DCCAAF219130678137286F5E77C47 /* Pods-SwiftEntryKitDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-SwiftEntryKitDemo-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t82AD8AAF58BF64460BD8C07EC4DF6E35 /* EKImageNoteMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKImageNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t8BFE027CC4289C30AD3E768FCE5CEF0B /* EKAttributes+Shadow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Shadow.swift\"; sourceTree = \"<group>\"; };\n\t\t8CCA1057080C500AF93E7231B4A6CA52 /* UIViewArray+QuickLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIViewArray+QuickLayout.swift\"; sourceTree = \"<group>\"; };\n\t\t8D88A10C90E97BC0A8854366B352F3EE /* EKNoteMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t90D533185CEAE773480AB26167E64EF9 /* EKEntryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKEntryView.swift; sourceTree = \"<group>\"; };\n\t\t92A9FFF66919FF57D45F01FF9060B9DD /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = \"<group>\"; };\n\t\t9593CFAEB0028E56754D269C799C66B0 /* Pods-SwiftEntryKitDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-SwiftEntryKitDemo-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t960DADF2CCCBDE8608C8DEDCA0B252EB /* UIEdgeInsets+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIEdgeInsets+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t9A71EF7308CBBA90894BE1279E935279 /* EKMessageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKMessageContentView.swift; sourceTree = \"<group>\"; };\n\t\t9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t9EEBC3A780D3C8A2EB25437BA8E46F5F /* EKAlertMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKAlertMessage.swift; sourceTree = \"<group>\"; };\n\t\t9F511D095B770B82902F13277AAF1AA6 /* UIApplication+EKAppearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIApplication+EKAppearance.swift\"; sourceTree = \"<group>\"; };\n\t\tA04A38B59673DEC84C7286AC1A5DD82E /* Pods-SwiftEntryKitTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-SwiftEntryKitTests-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tA14EAEBB9BEC7C4A28F157DA31131232 /* Pods-SwiftEntryKitDemo */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = \"Pods-SwiftEntryKitDemo\"; path = Pods_SwiftEntryKitDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA2BF4EDF85A16F4331293366AA50FF0E /* EKSimpleMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKSimpleMessageView.swift; sourceTree = \"<group>\"; };\n\t\tA7A1D227F016C19203F287375463699A /* EKAttributes+DisplayMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+DisplayMode.swift\"; sourceTree = \"<group>\"; };\n\t\tAC54805D957AA8CD357A55ECD90EA0EF /* UIRectCorner+Short.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIRectCorner+Short.swift\"; sourceTree = \"<group>\"; };\n\t\tB1E8374EF3E6B232F142B5987EA67FCA /* UIView+Responder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIView+Responder.swift\"; sourceTree = \"<group>\"; };\n\t\tB38771A605FA38F7F0D803B812F22552 /* QLUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = QLUtils.swift; sourceTree = \"<group>\"; };\n\t\tB3ACA36A2CDB4DFCE6EF6D0E9F6CC937 /* EKAttributes+PopBehavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+PopBehavior.swift\"; sourceTree = \"<group>\"; };\n\t\tBC25F9415CB019F995E220EF13ABAEE7 /* QLCompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = QLCompatibility.swift; sourceTree = \"<group>\"; };\n\t\tBFD8570D08FFA26DC70A6677B52879BE /* Pods-SwiftEntryKitDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-SwiftEntryKitDemo.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tC04EAE264EC7EFF0DA7C878F93D038E0 /* UIView+Shadow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIView+Shadow.swift\"; sourceTree = \"<group>\"; };\n\t\tC31DB1E40DE39086DB4ADCFF6545A24E /* EKXStatusBarMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKXStatusBarMessageView.swift; sourceTree = \"<group>\"; };\n\t\tC563C9CF87F0274D774DB1D0BB8756F1 /* Pods-SwiftEntryKitDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-SwiftEntryKitDemo-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tCDE85EC51CF37128659CEB00BB891354 /* EKRootViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKRootViewController.swift; sourceTree = \"<group>\"; };\n\t\tCDF1A0D1C37229695C259A378F96D0FC /* EKAlertMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKAlertMessageView.swift; sourceTree = \"<group>\"; };\n\t\tCE2F7FD8E3DF8E80B033436940AFED3C /* Pods-SwiftEntryKitTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = \"Pods-SwiftEntryKitTests.modulemap\"; sourceTree = \"<group>\"; };\n\t\tCF205874ABD02019016E8D6F4823DF66 /* EKAccessoryNoteMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKAccessoryNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\tCFC59CB5292F0EFB0006711614DE389E /* EKAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKAttributes.swift; sourceTree = \"<group>\"; };\n\t\tD0598CC5B54F64EFF897D87A397E403E /* Pods-SwiftEntryKitDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-SwiftEntryKitDemo-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tD0CEBC832DB314A2208D054822F4DD85 /* EKRatingMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKRatingMessageView.swift; sourceTree = \"<group>\"; };\n\t\tD124E32A8ED6A6A48F5EBBD4F7156FA9 /* Pods-SwiftEntryKitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-SwiftEntryKitTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tD35FE84B7A5F378A9023B4D695D4B996 /* EKAttributes+Scroll.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Scroll.swift\"; sourceTree = \"<group>\"; };\n\t\tD47B05649A80A383D3EF8B4D372370C5 /* EKRatingSymbolsContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKRatingSymbolsContainerView.swift; sourceTree = \"<group>\"; };\n\t\tD6C0CFAEC4DF15650ED42C91AE124D09 /* EKAttributes+Animation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Animation.swift\"; sourceTree = \"<group>\"; };\n\t\tDA5F7E5AA5A762E4504855EAF3216C8A /* SwiftEntryKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftEntryKit; path = SwiftEntryKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tDA7DE56E720D81AC3D90007A2F61A084 /* Pods-SwiftEntryKitTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-SwiftEntryKitTests-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tDB968E381D29D2484DC89ABEF5A08EF9 /* SwiftEntryKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftEntryKit.modulemap; sourceTree = \"<group>\"; };\n\t\tE075598D423EEA3ACC102DB53CDB8E8C /* EKButtonBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKButtonBarView.swift; sourceTree = \"<group>\"; };\n\t\tE20C7F7CA20B9D50699AFD4AD5BCE358 /* SwiftEntryKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"SwiftEntryKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tE492E141CA1F65D689237579F214854C /* UIView+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"UIView+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\tE55224D7193D977B96C4236E1F74164C /* GradientView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = \"<group>\"; };\n\t\tE6F169F2385B89ED18D6810657CDD3F6 /* EKAttributes+Duration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Duration.swift\"; sourceTree = \"<group>\"; };\n\t\tEAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEB0F9C7644E67B3E509B16CA9E1AE2E6 /* EKRatingSymbolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKRatingSymbolView.swift; sourceTree = \"<group>\"; };\n\t\tED0B495FDB5638F0BC7EFCCEF42EA31A /* EKAttributes+FrameStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+FrameStyle.swift\"; sourceTree = \"<group>\"; };\n\t\tED55558861058207FDC79BE639B3AB22 /* EntryAppearanceDescriptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EntryAppearanceDescriptor.swift; sourceTree = \"<group>\"; };\n\t\tEE3F0BD1D54DD958EBE89944FD4CEE99 /* EKTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKTextField.swift; sourceTree = \"<group>\"; };\n\t\tF352296AFDF8DE73AE8F78DB5150C5A7 /* Pods-SwiftEntryKitTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-SwiftEntryKitTests-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tF3BEAB4B42918B40DE6441C8C1540552 /* EKPopUpMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKPopUpMessageView.swift; sourceTree = \"<group>\"; };\n\t\tF47088C2B383BF12F74E0166C7B52E25 /* Pods-SwiftEntryKitTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = \"Pods-SwiftEntryKitTests\"; path = Pods_SwiftEntryKitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF5D859AAFC1AF2603E93156384B31D9B /* EKAttributes+Position.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Position.swift\"; sourceTree = \"<group>\"; };\n\t\tF643E9B2DC1F62BA4538C437A5BCCDFA /* EKContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKContentView.swift; sourceTree = \"<group>\"; };\n\t\tF9B8F9B4651B86B74DCA4B914A4A1BE7 /* EKButtonView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKButtonView.swift; sourceTree = \"<group>\"; };\n\t\tFC3447757DFE9D7077BC50CF56C53740 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = \"<group>\"; };\n\t\tFD9F579DFDB3C3CE8BE7E16084849EAB /* EKWindowProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EKWindowProvider.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tAAFF79C079AD948F35442BB67EB8E40D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC82054AF37DEB07E384A1525C3A90447 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAE6149CDF2E36FC955A98352466B991D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t83D05E692A0CE612F52BC0B18745B370 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEFBB4DEC1ECFAAFCD8722E3D003646FF /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t253D69D1B151BCD20DBBC6B6439C2033 /* Foundation.framework in Frameworks */,\n\t\t\t\t60FC20D83228B2C4E383524E56F95CE2 /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0B0A0292996B17D3D92684F861EF0A04 /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9F511D095B770B82902F13277AAF1AA6 /* UIApplication+EKAppearance.swift */,\n\t\t\t\t65D30BCA570C5B5C8D4DA7E25F6254FA /* UIColor+Utils.swift */,\n\t\t\t\t960DADF2CCCBDE8608C8DEDCA0B252EB /* UIEdgeInsets+Utils.swift */,\n\t\t\t\tAC54805D957AA8CD357A55ECD90EA0EF /* UIRectCorner+Short.swift */,\n\t\t\t\tC04EAE264EC7EFF0DA7C878F93D038E0 /* UIView+Shadow.swift */,\n\t\t\t\tE492E141CA1F65D689237579F214854C /* UIView+Utils.swift */,\n\t\t\t\tE897D76C39B3787ECA71B6592BD3F08F /* QuickLayout */,\n\t\t\t);\n\t\t\tname = Extensions;\n\t\t\tpath = Source/Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t59DA5C1F72E1D5BABC43EACBA672C3BA /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C48C63AF7B3E6901192100BC31B666 /* Pods-SwiftEntryKitTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCE2F7FD8E3DF8E80B033436940AFED3C /* Pods-SwiftEntryKitTests.modulemap */,\n\t\t\t\tDA7DE56E720D81AC3D90007A2F61A084 /* Pods-SwiftEntryKitTests-acknowledgements.markdown */,\n\t\t\t\tA04A38B59673DEC84C7286AC1A5DD82E /* Pods-SwiftEntryKitTests-acknowledgements.plist */,\n\t\t\t\tF352296AFDF8DE73AE8F78DB5150C5A7 /* Pods-SwiftEntryKitTests-dummy.m */,\n\t\t\t\t62F1B1D97C760AD62E5A49983D4BDFA9 /* Pods-SwiftEntryKitTests-frameworks.sh */,\n\t\t\t\t7F6008542D45CF6DA2CF5F20B1B389D9 /* Pods-SwiftEntryKitTests-Info.plist */,\n\t\t\t\t78239DB78DD3345BC32A5B876DEA9726 /* Pods-SwiftEntryKitTests-umbrella.h */,\n\t\t\t\t217D74CF28D2726D347E9E85D22057DA /* Pods-SwiftEntryKitTests.debug.xcconfig */,\n\t\t\t\tD124E32A8ED6A6A48F5EBBD4F7156FA9 /* Pods-SwiftEntryKitTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-SwiftEntryKitTests\";\n\t\t\tpath = \"Target Support Files/Pods-SwiftEntryKitTests\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A5FA4CB5975E4578D32C4FB0001A045 /* Infra */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3FDEAA72AA62231A344DBE12315E9605 /* EKBackgroundView.swift */,\n\t\t\t\tF643E9B2DC1F62BA4538C437A5BCCDFA /* EKContentView.swift */,\n\t\t\t\t90D533185CEAE773480AB26167E64EF9 /* EKEntryView.swift */,\n\t\t\t\tCDE85EC51CF37128659CEB00BB891354 /* EKRootViewController.swift */,\n\t\t\t\t355EC14B2CF1D527FABE1F54F422445D /* EKStyleView.swift */,\n\t\t\t\t32E1F387F3E3AE4CA929AB42EC170811 /* EKWindow.swift */,\n\t\t\t\tFD9F579DFDB3C3CE8BE7E16084849EAB /* EKWindowProvider.swift */,\n\t\t\t\t3A9F62C7BFA289C715569ABCD8EC35AD /* EKWrapperView.swift */,\n\t\t\t\t5C977172E6A26597EAB05BDB41B2C104 /* EntryCachingHeuristic.swift */,\n\t\t\t);\n\t\t\tname = Infra;\n\t\t\tpath = Source/Infra;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1C6D460CA567524F66BE585E5B07F4F7 /* EntryAttributes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCFC59CB5292F0EFB0006711614DE389E /* EKAttributes.swift */,\n\t\t\t\tD6C0CFAEC4DF15650ED42C91AE124D09 /* EKAttributes+Animation.swift */,\n\t\t\t\t4B2EE663224F44CF351C3AF280D17945 /* EKAttributes+BackgroundStyle.swift */,\n\t\t\t\tA7A1D227F016C19203F287375463699A /* EKAttributes+DisplayMode.swift */,\n\t\t\t\tE6F169F2385B89ED18D6810657CDD3F6 /* EKAttributes+Duration.swift */,\n\t\t\t\tED0B495FDB5638F0BC7EFCCEF42EA31A /* EKAttributes+FrameStyle.swift */,\n\t\t\t\t1A7286E41D0650723E149E86FD1C04AF /* EKAttributes+HapticFeedback.swift */,\n\t\t\t\t4727C79CD0DD7F6239E77E81AA1C6592 /* EKAttributes+LifecycleActions.swift */,\n\t\t\t\tB3ACA36A2CDB4DFCE6EF6D0E9F6CC937 /* EKAttributes+PopBehavior.swift */,\n\t\t\t\tF5D859AAFC1AF2603E93156384B31D9B /* EKAttributes+Position.swift */,\n\t\t\t\t2EBFF4F329202D38AE92B0E840A811B2 /* EKAttributes+PositionConstraints.swift */,\n\t\t\t\t11FCF376F5FE3AE52C3EE4D32A474534 /* EKAttributes+Precedence.swift */,\n\t\t\t\t613497986B31AA146AC04D2FF125081D /* EKAttributes+Presets.swift */,\n\t\t\t\tD35FE84B7A5F378A9023B4D695D4B996 /* EKAttributes+Scroll.swift */,\n\t\t\t\t8BFE027CC4289C30AD3E768FCE5CEF0B /* EKAttributes+Shadow.swift */,\n\t\t\t\t1DD21DA534C8E34356D26932C0B72F1B /* EKAttributes+StatusBar.swift */,\n\t\t\t\t10BAD6713BF41F1F4581FF4905CF4BE8 /* EKAttributes+UserInteraction.swift */,\n\t\t\t\t780B2C0C027974C5B034C4FB8559B10F /* EKAttributes+Validations.swift */,\n\t\t\t\t7684F90C2E79E7591F8377058A81ADD0 /* EKAttributes+WindowLevel.swift */,\n\t\t\t);\n\t\t\tname = EntryAttributes;\n\t\t\tpath = EntryAttributes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22E1E4E9D635E1A61F945752082C4A00 /* MessagesUtils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE075598D423EEA3ACC102DB53CDB8E8C /* EKButtonBarView.swift */,\n\t\t\t\tF9B8F9B4651B86B74DCA4B914A4A1BE7 /* EKButtonView.swift */,\n\t\t\t\tD47B05649A80A383D3EF8B4D372370C5 /* EKRatingSymbolsContainerView.swift */,\n\t\t\t\tEB0F9C7644E67B3E509B16CA9E1AE2E6 /* EKRatingSymbolView.swift */,\n\t\t\t\tEE3F0BD1D54DD958EBE89944FD4CEE99 /* EKTextField.swift */,\n\t\t\t\tED55558861058207FDC79BE639B3AB22 /* EntryAppearanceDescriptor.swift */,\n\t\t\t);\n\t\t\tname = MessagesUtils;\n\t\t\tpath = MessagesUtils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3A2E3B3AB935C46DD4CD42871261C941 /* Notes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCF205874ABD02019016E8D6F4823DF66 /* EKAccessoryNoteMessageView.swift */,\n\t\t\t\t82AD8AAF58BF64460BD8C07EC4DF6E35 /* EKImageNoteMessageView.swift */,\n\t\t\t\t8D88A10C90E97BC0A8854366B352F3EE /* EKNoteMessageView.swift */,\n\t\t\t\t79629988A737E957C9B6F4684B504368 /* EKProcessingNoteMessageView.swift */,\n\t\t\t\tC31DB1E40DE39086DB4ADCFF6545A24E /* EKXStatusBarMessageView.swift */,\n\t\t\t);\n\t\t\tname = Notes;\n\t\t\tpath = Notes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t51EA9FA7C39A49553F210B8F94DF5A34 /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t782EBC3ECB80CAFA27E5D2F6442EE0C2 /* Pods-SwiftEntryKitDemo */,\n\t\t\t\t19C48C63AF7B3E6901192100BC31B666 /* Pods-SwiftEntryKitTests */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t59DA5C1F72E1D5BABC43EACBA672C3BA /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */,\n\t\t\t\tD245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t782EBC3ECB80CAFA27E5D2F6442EE0C2 /* Pods-SwiftEntryKitDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C6D2F6A9763A4610B812B9109ACA447 /* Pods-SwiftEntryKitDemo.modulemap */,\n\t\t\t\t3720AACA3DCA014803908A2E0592E7C5 /* Pods-SwiftEntryKitDemo-acknowledgements.markdown */,\n\t\t\t\tC563C9CF87F0274D774DB1D0BB8756F1 /* Pods-SwiftEntryKitDemo-acknowledgements.plist */,\n\t\t\t\t9593CFAEB0028E56754D269C799C66B0 /* Pods-SwiftEntryKitDemo-dummy.m */,\n\t\t\t\t825DCCAAF219130678137286F5E77C47 /* Pods-SwiftEntryKitDemo-frameworks.sh */,\n\t\t\t\t2909A9134D532B091BC4BB03EAF83E0D /* Pods-SwiftEntryKitDemo-Info.plist */,\n\t\t\t\tD0598CC5B54F64EFF897D87A397E403E /* Pods-SwiftEntryKitDemo-umbrella.h */,\n\t\t\t\tBFD8570D08FFA26DC70A6677B52879BE /* Pods-SwiftEntryKitDemo.debug.xcconfig */,\n\t\t\t\t659C18D29D4B9D963A2AD7360AAACC30 /* Pods-SwiftEntryKitDemo.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-SwiftEntryKitDemo\";\n\t\t\tpath = \"Target Support Files/Pods-SwiftEntryKitDemo\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9EE8007757EEFD14C62114882173F3C3 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE55224D7193D977B96C4236E1F74164C /* GradientView.swift */,\n\t\t\t\t6D09C2BD9BF43CB402ECC6239DDE80B1 /* HapticFeedbackGenerator.swift */,\n\t\t\t\tB1E8374EF3E6B232F142B5987EA67FCA /* UIView+Responder.swift */,\n\t\t\t);\n\t\t\tname = Utils;\n\t\t\tpath = Source/Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA9A2577C6BECA8A4E94E1FF7CA2DBD08 /* SwiftEntryKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4DF7CDDFB196B307A3EA5A9EDF93C2B1 /* SwiftEntryKit.swift */,\n\t\t\t\t0B0A0292996B17D3D92684F861EF0A04 /* Extensions */,\n\t\t\t\t1A5FA4CB5975E4578D32C4FB0001A045 /* Infra */,\n\t\t\t\tDD9349715C9792A78269FF61E726D532 /* MessageViews */,\n\t\t\t\tE732E6E65BADA40D7AA84C450E4F4192 /* Model */,\n\t\t\t\tEAFA7292DA2C19DFB8393C82375DFBE0 /* Pod */,\n\t\t\t\tDD4A5106BAB6CB5031677AFB2567580D /* Support Files */,\n\t\t\t\t9EE8007757EEFD14C62114882173F3C3 /* Utils */,\n\t\t\t);\n\t\t\tname = SwiftEntryKit;\n\t\t\tpath = ../..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCF1408CF629C7361332E53B88F7BD30C = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,\n\t\t\t\tDE1A6CB57FB2556E66BBD204D206C703 /* Development Pods */,\n\t\t\t\t1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */,\n\t\t\t\tEA55FF6C4388512B5E53F22767C7731E /* Products */,\n\t\t\t\t51EA9FA7C39A49553F210B8F94DF5A34 /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDD4A5106BAB6CB5031677AFB2567580D /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDB968E381D29D2484DC89ABEF5A08EF9 /* SwiftEntryKit.modulemap */,\n\t\t\t\tE20C7F7CA20B9D50699AFD4AD5BCE358 /* SwiftEntryKit-dummy.m */,\n\t\t\t\t67852BE5281D7C3C9D16CF8CB24FAEE4 /* SwiftEntryKit-Info.plist */,\n\t\t\t\t498F2A87868A376E6C8B01A8EFF7D2AC /* SwiftEntryKit-prefix.pch */,\n\t\t\t\t2E176C9E90FF69941C0F00D00FB87AF9 /* SwiftEntryKit-umbrella.h */,\n\t\t\t\t5E7D71B2861945983BDCF0A559AF1FC6 /* SwiftEntryKit.debug.xcconfig */,\n\t\t\t\t0DC40BB88676D9A88905C0581BC836B6 /* SwiftEntryKit.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"Example/Pods/Target Support Files/SwiftEntryKit\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDD9349715C9792A78269FF61E726D532 /* MessageViews */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCDF1A0D1C37229695C259A378F96D0FC /* EKAlertMessageView.swift */,\n\t\t\t\t3559532220E798158C20592737A02E39 /* EKFormMessageView.swift */,\n\t\t\t\t9A71EF7308CBBA90894BE1279E935279 /* EKMessageContentView.swift */,\n\t\t\t\t2239582C73BFB3D83DFDF57021299158 /* EKNotificationMessageView.swift */,\n\t\t\t\tF3BEAB4B42918B40DE6441C8C1540552 /* EKPopUpMessageView.swift */,\n\t\t\t\tD0CEBC832DB314A2208D054822F4DD85 /* EKRatingMessageView.swift */,\n\t\t\t\tA2BF4EDF85A16F4331293366AA50FF0E /* EKSimpleMessageView.swift */,\n\t\t\t\t22E1E4E9D635E1A61F945752082C4A00 /* MessagesUtils */,\n\t\t\t\t3A2E3B3AB935C46DD4CD42871261C941 /* Notes */,\n\t\t\t);\n\t\t\tname = MessageViews;\n\t\t\tpath = Source/MessageViews;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDE1A6CB57FB2556E66BBD204D206C703 /* Development Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA9A2577C6BECA8A4E94E1FF7CA2DBD08 /* SwiftEntryKit */,\n\t\t\t);\n\t\t\tname = \"Development Pods\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE732E6E65BADA40D7AA84C450E4F4192 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9EEBC3A780D3C8A2EB25437BA8E46F5F /* EKAlertMessage.swift */,\n\t\t\t\t40327AF59BA584E6F6619BFCC3BAD434 /* EKColor.swift */,\n\t\t\t\t1DAD42E5C17E9F7FB324D45E3F7EDA42 /* EKNotificationMessage.swift */,\n\t\t\t\t5D431D0B0894B4B4EE88E680419E14CD /* EKPopUpMessage.swift */,\n\t\t\t\t5F7A459E0E2A5540FEA8FDFEBD5766C1 /* EKProperty.swift */,\n\t\t\t\t5CC6592DF43B43BA46FC2CCA00C4F96F /* EKRatingMessage.swift */,\n\t\t\t\t7E7644AC1CA095C84B01E5BD5D080227 /* EKSimpleMessage.swift */,\n\t\t\t\t1C6D460CA567524F66BE585E5B07F4F7 /* EntryAttributes */,\n\t\t\t);\n\t\t\tname = Model;\n\t\t\tpath = Source/Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE897D76C39B3787ECA71B6592BD3F08F /* QuickLayout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBC25F9415CB019F995E220EF13ABAEE7 /* QLCompatibility.swift */,\n\t\t\t\tB38771A605FA38F7F0D803B812F22552 /* QLUtils.swift */,\n\t\t\t\t45332FF34005CC3F284120BEEEA29FF2 /* UIView+QLContentWrap.swift */,\n\t\t\t\t5D26C2C8F8C400F9BF58E6A104D4E446 /* UIView+QuickLayout.swift */,\n\t\t\t\t8CCA1057080C500AF93E7231B4A6CA52 /* UIViewArray+QuickLayout.swift */,\n\t\t\t);\n\t\t\tname = QuickLayout;\n\t\t\tpath = QuickLayout;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEA55FF6C4388512B5E53F22767C7731E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA14EAEBB9BEC7C4A28F157DA31131232 /* Pods-SwiftEntryKitDemo */,\n\t\t\t\tF47088C2B383BF12F74E0166C7B52E25 /* Pods-SwiftEntryKitTests */,\n\t\t\t\tDA5F7E5AA5A762E4504855EAF3216C8A /* SwiftEntryKit */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEAFA7292DA2C19DFB8393C82375DFBE0 /* Pod */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t92A9FFF66919FF57D45F01FF9060B9DD /* LICENSE */,\n\t\t\t\tFC3447757DFE9D7077BC50CF56C53740 /* README.md */,\n\t\t\t\t0A1BEE5878A0598527D70E669A9DAF7E /* SwiftEntryKit.podspec */,\n\t\t\t);\n\t\t\tname = Pod;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t99BABE702C3C493BA8CAB3E336A34B27 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t068E825D6FE9520EBE3FA985C5AE4DA0 /* Pods-SwiftEntryKitDemo-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE6BAD1529D8C727E12D41EDF7AD9152D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14DE35A5C2A9CDA68974BB63E54E980E /* Pods-SwiftEntryKitTests-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF4783D94789658207BFCD39A626B865D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8E8D18BA7E2779FF915DD8D000E651F8 /* SwiftEntryKit-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\tB8014556AF0886B4EB6E36F9E2B39AD9 /* Pods-SwiftEntryKitDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4E88838E1E6C08C5578E22556F29CAA7 /* Build configuration list for PBXNativeTarget \"Pods-SwiftEntryKitDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t99BABE702C3C493BA8CAB3E336A34B27 /* Headers */,\n\t\t\t\tAB81991149CA6B4EF230C069201E4021 /* Sources */,\n\t\t\t\tAE6149CDF2E36FC955A98352466B991D /* Frameworks */,\n\t\t\t\t0A8161BE98F7D32C5840F08177AD3ADC /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tC86C643BCFA6FDCA3B5C59BB383589B1 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-SwiftEntryKitDemo\";\n\t\t\tproductName = Pods_SwiftEntryKitDemo;\n\t\t\tproductReference = A14EAEBB9BEC7C4A28F157DA31131232 /* Pods-SwiftEntryKitDemo */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tFCD9AC41A4A4EDDDE8502389BCD0C13B /* Pods-SwiftEntryKitTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 90A70CCE8C71B2D2C42B41405AA889B4 /* Build configuration list for PBXNativeTarget \"Pods-SwiftEntryKitTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE6BAD1529D8C727E12D41EDF7AD9152D /* Headers */,\n\t\t\t\t6F4C80DAEDD21B05210518D4EE069D77 /* Sources */,\n\t\t\t\tAAFF79C079AD948F35442BB67EB8E40D /* Frameworks */,\n\t\t\t\tDBF81C754494252ACC410282CE94329D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t2C6FC358BF1EBEE3E0C43EBD2EF4A94A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-SwiftEntryKitTests\";\n\t\t\tproductName = Pods_SwiftEntryKitTests;\n\t\t\tproductReference = F47088C2B383BF12F74E0166C7B52E25 /* Pods-SwiftEntryKitTests */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tFEA6FF0588A91CCD972EDCD698B85647 /* SwiftEntryKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D1BF1EE05C7922DC0C7CFB1924C63F69 /* Build configuration list for PBXNativeTarget \"SwiftEntryKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF4783D94789658207BFCD39A626B865D /* Headers */,\n\t\t\t\tFA2F292C528E0D64BE6614D4E34EE473 /* Sources */,\n\t\t\t\tEFBB4DEC1ECFAAFCD8722E3D003646FF /* Frameworks */,\n\t\t\t\tB5D1E1884FB3A1D0F211E939528A5B27 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SwiftEntryKit;\n\t\t\tproductName = SwiftEntryKit;\n\t\t\tproductReference = DA5F7E5AA5A762E4504855EAF3216C8A /* SwiftEntryKit */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tBFDFE7DC352907FC980B868725387E98 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1240;\n\t\t\t\tLastUpgradeCheck = 1240;\n\t\t\t};\n\t\t\tbuildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tBase,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = CF1408CF629C7361332E53B88F7BD30C;\n\t\t\tproductRefGroup = EA55FF6C4388512B5E53F22767C7731E /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tB8014556AF0886B4EB6E36F9E2B39AD9 /* Pods-SwiftEntryKitDemo */,\n\t\t\t\tFCD9AC41A4A4EDDDE8502389BCD0C13B /* Pods-SwiftEntryKitTests */,\n\t\t\t\tFEA6FF0588A91CCD972EDCD698B85647 /* SwiftEntryKit */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t0A8161BE98F7D32C5840F08177AD3ADC /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB5D1E1884FB3A1D0F211E939528A5B27 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDBF81C754494252ACC410282CE94329D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6F4C80DAEDD21B05210518D4EE069D77 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5C258564AFF20D612A3A339423F45584 /* Pods-SwiftEntryKitTests-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAB81991149CA6B4EF230C069201E4021 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC60B01D9CD508925C0CE73F3A494AC50 /* Pods-SwiftEntryKitDemo-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFA2F292C528E0D64BE6614D4E34EE473 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2192DBD932E0F15BB67ACDC05443661A /* EKAccessoryNoteMessageView.swift in Sources */,\n\t\t\t\t27AB779347FB4F77C5609ECC8E822D47 /* EKAlertMessage.swift in Sources */,\n\t\t\t\tC98CD0D413A41E34BCE66218A759A400 /* EKAlertMessageView.swift in Sources */,\n\t\t\t\t7108EDEF3D6F20A74A001A6095D5CEAF /* EKAttributes.swift in Sources */,\n\t\t\t\tCB1EEDEDA94C738FAF66F1C885564292 /* EKAttributes+Animation.swift in Sources */,\n\t\t\t\tA2BA4820371B5FEC4F05DAD50C6ABF6E /* EKAttributes+BackgroundStyle.swift in Sources */,\n\t\t\t\tBC62184178B9BEB545A13961210A05DC /* EKAttributes+DisplayMode.swift in Sources */,\n\t\t\t\tF515A3A2C771F0BC0F95AA1BA4EEFFC1 /* EKAttributes+Duration.swift in Sources */,\n\t\t\t\t734E4D1053D35D868CD9E2089C951A30 /* EKAttributes+FrameStyle.swift in Sources */,\n\t\t\t\t8B9C14384B947160FDC8C9082DFAC126 /* EKAttributes+HapticFeedback.swift in Sources */,\n\t\t\t\t714A8C1AC51A1123F085369F696D98E0 /* EKAttributes+LifecycleActions.swift in Sources */,\n\t\t\t\t92C9D280AC667D5F46DF47A9ECFD6CF8 /* EKAttributes+PopBehavior.swift in Sources */,\n\t\t\t\t952D70DA0B30FC34603159D7CCC7B3CE /* EKAttributes+Position.swift in Sources */,\n\t\t\t\t28E32E39AD8DAAF8D769DB804E262758 /* EKAttributes+PositionConstraints.swift in Sources */,\n\t\t\t\tF8D5E276EAFEE938C91DDCECB67EF87C /* EKAttributes+Precedence.swift in Sources */,\n\t\t\t\tD51E20F00EB6CD7E0D7FF49D79E2F60C /* EKAttributes+Presets.swift in Sources */,\n\t\t\t\tED772CA4DAF478D6E0DF050C63F305F1 /* EKAttributes+Scroll.swift in Sources */,\n\t\t\t\tDA0EC170AAC94082A6B5F33CF4DD391F /* EKAttributes+Shadow.swift in Sources */,\n\t\t\t\t0443B823D09728A6A4AAEA741ED0EC1A /* EKAttributes+StatusBar.swift in Sources */,\n\t\t\t\t0D2B4E91DB02BDA04E6BDF6DBA4A546E /* EKAttributes+UserInteraction.swift in Sources */,\n\t\t\t\t055EFFC858E25B12CE2921EC8C7233EB /* EKAttributes+Validations.swift in Sources */,\n\t\t\t\tF87B701EBA816F684B11F39CD1E39F47 /* EKAttributes+WindowLevel.swift in Sources */,\n\t\t\t\t462DE7325DE86EFA2F3EC52CEBD9C1E5 /* EKBackgroundView.swift in Sources */,\n\t\t\t\t4BA5FF5F702BD658E11F0DFFCBD8F48D /* EKButtonBarView.swift in Sources */,\n\t\t\t\t8BA44EB1BBDD85BB4527F5CA3A5776AD /* EKButtonView.swift in Sources */,\n\t\t\t\tF90BC550E43319147538AF88C987758E /* EKColor.swift in Sources */,\n\t\t\t\tC8887B7C8B331F253936A033C82E7035 /* EKContentView.swift in Sources */,\n\t\t\t\t98C43F17EB6BE6D18F9DA8EC7B2E04B0 /* EKEntryView.swift in Sources */,\n\t\t\t\tDDA8C21B07CEAE9204BF7F435976CB9E /* EKFormMessageView.swift in Sources */,\n\t\t\t\t11E4007894DF1F2A3F475FBB8229F3A4 /* EKImageNoteMessageView.swift in Sources */,\n\t\t\t\tBA2DA0C04BFBAEE25E534E24CFFF395A /* EKMessageContentView.swift in Sources */,\n\t\t\t\tD6AE33459B57384C2599C6C99F527BEB /* EKNoteMessageView.swift in Sources */,\n\t\t\t\t36882C85632251103A44F147853939AA /* EKNotificationMessage.swift in Sources */,\n\t\t\t\t8D80DF7CFA1BE70D46E90462AE24C472 /* EKNotificationMessageView.swift in Sources */,\n\t\t\t\t6ED875168F056413ECC87C941731E714 /* EKPopUpMessage.swift in Sources */,\n\t\t\t\t05D9D1E4C707A5F023A1F94ACF486AC2 /* EKPopUpMessageView.swift in Sources */,\n\t\t\t\tD7662DCD3ADE9F482B12D960A4517476 /* EKProcessingNoteMessageView.swift in Sources */,\n\t\t\t\tFC942184FF87AFA768AE2CA8218F1EC2 /* EKProperty.swift in Sources */,\n\t\t\t\t87DDE964048660CDA29BE9EFBB20A8A7 /* EKRatingMessage.swift in Sources */,\n\t\t\t\t7BBD4032CA2769A7B3D5F79E95264689 /* EKRatingMessageView.swift in Sources */,\n\t\t\t\t8A0A768C3ECBEEA388452EC31BEF6500 /* EKRatingSymbolsContainerView.swift in Sources */,\n\t\t\t\t302E32F7BE65307E4A589AFF78B43BB5 /* EKRatingSymbolView.swift in Sources */,\n\t\t\t\t56E6DC85F5E9118377A587FB086E147B /* EKRootViewController.swift in Sources */,\n\t\t\t\tA7011D8655938627E740F0C3CF8FA900 /* EKSimpleMessage.swift in Sources */,\n\t\t\t\t90F3D408915E74432EA7EEA31FA356E8 /* EKSimpleMessageView.swift in Sources */,\n\t\t\t\t0359FD65EC137FD6398B15FFA06FBD4E /* EKStyleView.swift in Sources */,\n\t\t\t\tEF4520313EBDD8C00BD5ACED2BACA34F /* EKTextField.swift in Sources */,\n\t\t\t\t97AD66EB56B38157D92EEDBAEAECDBD0 /* EKWindow.swift in Sources */,\n\t\t\t\tAFA1DC023B3E88B337F09BA31B2D648A /* EKWindowProvider.swift in Sources */,\n\t\t\t\tA2413744FA4B848AA797FB365F69BFDC /* EKWrapperView.swift in Sources */,\n\t\t\t\tB3AE89438313BC2BACC4D0DE03FC3DEE /* EKXStatusBarMessageView.swift in Sources */,\n\t\t\t\t4E375F46869D4ACA0012FD19C628D27C /* EntryAppearanceDescriptor.swift in Sources */,\n\t\t\t\t89A502FDBC5C0EF63831DD6A8537610A /* EntryCachingHeuristic.swift in Sources */,\n\t\t\t\t559047DE0FD0172BD098F42C46EC99BF /* GradientView.swift in Sources */,\n\t\t\t\t85C9E605B0FDDDFAE52C4C098400BAB6 /* HapticFeedbackGenerator.swift in Sources */,\n\t\t\t\t0A68662146E1586B4456FAB071D11DE2 /* QLCompatibility.swift in Sources */,\n\t\t\t\t0D6FB08663ED820FCE5FBE981E3C6A5A /* QLUtils.swift in Sources */,\n\t\t\t\t34D13E6FCD9A83500030FA87732A91E0 /* SwiftEntryKit.swift in Sources */,\n\t\t\t\tF59A2355405C20F6DBA556CADC3C8C13 /* SwiftEntryKit-dummy.m in Sources */,\n\t\t\t\t29BEEBBF37CF019B510DBFB73345AD85 /* UIApplication+EKAppearance.swift in Sources */,\n\t\t\t\t348C406EE636A76C1FD17BB1D6524F76 /* UIColor+Utils.swift in Sources */,\n\t\t\t\tB0598238BC5A442270D9461A0E5A1D9D /* UIEdgeInsets+Utils.swift in Sources */,\n\t\t\t\t6FC9FC572974C469202D4ED5CD215B87 /* UIRectCorner+Short.swift in Sources */,\n\t\t\t\t595221C70FBCDB1D0B2A3A937F1920DF /* UIView+QLContentWrap.swift in Sources */,\n\t\t\t\tCF185599178E4DC6478502FAD3A58872 /* UIView+QuickLayout.swift in Sources */,\n\t\t\t\t18734EC046ABAA79202629307DC9F249 /* UIView+Responder.swift in Sources */,\n\t\t\t\t55D8E7C94A4249CAD0CE60C5442C1647 /* UIView+Shadow.swift in Sources */,\n\t\t\t\tCF3C9AC716E31797CC2C3C81DECE4C97 /* UIView+Utils.swift in Sources */,\n\t\t\t\t5A88DF76317A991C11AEB8F1FE918FBB /* UIViewArray+QuickLayout.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t2C6FC358BF1EBEE3E0C43EBD2EF4A94A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SwiftEntryKit;\n\t\t\ttarget = FEA6FF0588A91CCD972EDCD698B85647 /* SwiftEntryKit */;\n\t\t\ttargetProxy = 963D784716C5E411F3ADD005A0BAC41B /* PBXContainerItemProxy */;\n\t\t};\n\t\tC86C643BCFA6FDCA3B5C59BB383589B1 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SwiftEntryKit;\n\t\t\ttarget = FEA6FF0588A91CCD972EDCD698B85647 /* SwiftEntryKit */;\n\t\t\ttargetProxy = C83659509B9A824D8B8B5FEE03EC4F73 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_DEBUG=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t85FC0D3EAE3F86C9BA6B769F2CCDFD83 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D124E32A8ED6A6A48F5EBBD4F7156FA9 /* Pods-SwiftEntryKitTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t974FE3B7E5BC8335BB591829F9B5A22B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 0DC40BB88676D9A88905C0581BC836B6 /* SwiftEntryKit.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SwiftEntryKit/SwiftEntryKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SwiftEntryKit/SwiftEntryKit-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SwiftEntryKit/SwiftEntryKit.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = SwiftEntryKit;\n\t\t\t\tPRODUCT_NAME = SwiftEntryKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t99962B8BE26F904FBDF6FB1B445A6003 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5E7D71B2861945983BDCF0A559AF1FC6 /* SwiftEntryKit.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SwiftEntryKit/SwiftEntryKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SwiftEntryKit/SwiftEntryKit-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SwiftEntryKit/SwiftEntryKit.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = SwiftEntryKit;\n\t\t\t\tPRODUCT_NAME = SwiftEntryKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB49B2FDC6E95FC5D63C413BCC63A3521 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BFD8570D08FFA26DC70A6677B52879BE /* Pods-SwiftEntryKitDemo.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCA547D2C7E9A8A153DC2B27FBE00B112 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_RELEASE=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCF077D663DDCCD59AC06D753AA16D0A2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 659C18D29D4B9D963A2AD7360AAACC30 /* Pods-SwiftEntryKitDemo.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD47E402F78A11C41B5BA98FE73CAEC40 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 217D74CF28D2726D347E9E85D22057DA /* Pods-SwiftEntryKitTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */,\n\t\t\t\tCA547D2C7E9A8A153DC2B27FBE00B112 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4E88838E1E6C08C5578E22556F29CAA7 /* Build configuration list for PBXNativeTarget \"Pods-SwiftEntryKitDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB49B2FDC6E95FC5D63C413BCC63A3521 /* Debug */,\n\t\t\t\tCF077D663DDCCD59AC06D753AA16D0A2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t90A70CCE8C71B2D2C42B41405AA889B4 /* Build configuration list for PBXNativeTarget \"Pods-SwiftEntryKitTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD47E402F78A11C41B5BA98FE73CAEC40 /* Debug */,\n\t\t\t\t85FC0D3EAE3F86C9BA6B769F2CCDFD83 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD1BF1EE05C7922DC0C7CFB1924C63F69 /* Build configuration list for PBXNativeTarget \"SwiftEntryKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t99962B8BE26F904FBDF6FB1B445A6003 /* Debug */,\n\t\t\t\t974FE3B7E5BC8335BB591829F9B5A22B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## SwiftEntryKit\n\nMIT License\n\nCopyright (c) 2018 Daniel Huri, huri000@gmail.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>MIT License\n\nCopyright (c) 2018 Daniel Huri, huri000@gmail.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SwiftEntryKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_SwiftEntryKitDemo : NSObject\n@end\n@implementation PodsDummy_Pods_SwiftEntryKitDemo\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-frameworks.sh",
    "content": "#!/bin/sh\nset -e\nset -u\nset -o pipefail\n\nfunction on_error {\n  echo \"$(realpath -mq \"${0}\"):$1: error: Unexpected failure\"\n}\ntrap 'on_error $LINENO' ERR\n\nif [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then\n  # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy\n  # frameworks to, so exit 0 (signalling the script phase was successful).\n  exit 0\nfi\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nCOCOAPODS_PARALLEL_CODE_SIGN=\"${COCOAPODS_PARALLEL_CODE_SIGN:-false}\"\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\nBCSYMBOLMAP_DIR=\"BCSymbolMaps\"\n\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n    echo \"Symlinked...\"\n    source=\"$(readlink \"${source}\")\"\n  fi\n\n  if [ -d \"${source}/${BCSYMBOLMAP_DIR}\" ]; then\n    # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied\n    find \"${source}/${BCSYMBOLMAP_DIR}\" -name \"*.bcsymbolmap\"|while read f; do\n      echo \"Installing $f\"\n      install_bcsymbolmap \"$f\" \"$destination\"\n      rm \"$f\"\n    done\n    rmdir \"${source}/${BCSYMBOLMAP_DIR}\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  elif [ -L \"${binary}\" ]; then\n    echo \"Destination binary is symlinked...\"\n    dirname=\"$(dirname \"${binary}\")\"\n    binary=\"${dirname}/$(readlink \"${binary}\")\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u)\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  warn_missing_arch=${2:-true}\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .dSYM \"$source\")\"\n    binary_name=\"$(ls \"$source/Contents/Resources/DWARF\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}\"\n\n    # Strip invalid architectures from the dSYM.\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O \"*\"dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\" \"$warn_missing_arch\"\n    fi\n    if [[ $STRIP_BINARY_RETVAL == 0 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      mkdir -p \"${DWARF_DSYM_FOLDER_PATH}\"\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM\"\n    fi\n  fi\n}\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  warn_missing_arch=${2:-true}\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    if [[ \"$warn_missing_arch\" == \"true\" ]]; then\n      echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    fi\n    STRIP_BINARY_RETVAL=1\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\"\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=0\n}\n\n# Copies the bcsymbolmap files of a vendored framework\ninstall_bcsymbolmap() {\n    local bcsymbolmap_path=\"$1\"\n    local destination=\"${BUILT_PRODUCTS_DIR}\"\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\"\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY:-}\" -a \"${CODE_SIGNING_REQUIRED:-}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identity\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework\"\nfi\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_SwiftEntryKitDemoVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_SwiftEntryKitDemoVersionString[];\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.debug.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit/SwiftEntryKit.framework/Headers\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'\nLIBRARY_SEARCH_PATHS = $(inherited) \"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\" /usr/lib/swift\nOTHER_LDFLAGS = $(inherited) -framework \"SwiftEntryKit\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.modulemap",
    "content": "framework module Pods_SwiftEntryKitDemo {\n  umbrella header \"Pods-SwiftEntryKitDemo-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.release.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit/SwiftEntryKit.framework/Headers\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'\nLIBRARY_SEARCH_PATHS = $(inherited) \"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\" /usr/lib/swift\nOTHER_LDFLAGS = $(inherited) -framework \"SwiftEntryKit\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## SwiftEntryKit\n\nMIT License\n\nCopyright (c) 2018 Daniel Huri, huri000@gmail.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>MIT License\n\nCopyright (c) 2018 Daniel Huri, huri000@gmail.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SwiftEntryKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_SwiftEntryKitTests : NSObject\n@end\n@implementation PodsDummy_Pods_SwiftEntryKitTests\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-frameworks.sh",
    "content": "#!/bin/sh\nset -e\nset -u\nset -o pipefail\n\nfunction on_error {\n  echo \"$(realpath -mq \"${0}\"):$1: error: Unexpected failure\"\n}\ntrap 'on_error $LINENO' ERR\n\nif [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then\n  # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy\n  # frameworks to, so exit 0 (signalling the script phase was successful).\n  exit 0\nfi\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nCOCOAPODS_PARALLEL_CODE_SIGN=\"${COCOAPODS_PARALLEL_CODE_SIGN:-false}\"\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\nBCSYMBOLMAP_DIR=\"BCSymbolMaps\"\n\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n    echo \"Symlinked...\"\n    source=\"$(readlink \"${source}\")\"\n  fi\n\n  if [ -d \"${source}/${BCSYMBOLMAP_DIR}\" ]; then\n    # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied\n    find \"${source}/${BCSYMBOLMAP_DIR}\" -name \"*.bcsymbolmap\"|while read f; do\n      echo \"Installing $f\"\n      install_bcsymbolmap \"$f\" \"$destination\"\n      rm \"$f\"\n    done\n    rmdir \"${source}/${BCSYMBOLMAP_DIR}\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  elif [ -L \"${binary}\" ]; then\n    echo \"Destination binary is symlinked...\"\n    dirname=\"$(dirname \"${binary}\")\"\n    binary=\"${dirname}/$(readlink \"${binary}\")\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u)\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  warn_missing_arch=${2:-true}\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .dSYM \"$source\")\"\n    binary_name=\"$(ls \"$source/Contents/Resources/DWARF\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}\"\n\n    # Strip invalid architectures from the dSYM.\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O \"*\"dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\" \"$warn_missing_arch\"\n    fi\n    if [[ $STRIP_BINARY_RETVAL == 0 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      mkdir -p \"${DWARF_DSYM_FOLDER_PATH}\"\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM\"\n    fi\n  fi\n}\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  warn_missing_arch=${2:-true}\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    if [[ \"$warn_missing_arch\" == \"true\" ]]; then\n      echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    fi\n    STRIP_BINARY_RETVAL=1\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\"\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=0\n}\n\n# Copies the bcsymbolmap files of a vendored framework\ninstall_bcsymbolmap() {\n    local bcsymbolmap_path=\"$1\"\n    local destination=\"${BUILT_PRODUCTS_DIR}\"\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\"\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY:-}\" -a \"${CODE_SIGNING_REQUIRED:-}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identity\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework\"\nfi\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_SwiftEntryKitTestsVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_SwiftEntryKitTestsVersionString[];\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.debug.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit/SwiftEntryKit.framework/Headers\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift \"$(PLATFORM_DIR)/Developer/Library/Frameworks\" '@executable_path/Frameworks' '@loader_path/Frameworks'\nLIBRARY_SEARCH_PATHS = $(inherited) \"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\" /usr/lib/swift\nOTHER_LDFLAGS = $(inherited) -framework \"SwiftEntryKit\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.modulemap",
    "content": "framework module Pods_SwiftEntryKitTests {\n  umbrella header \"Pods-SwiftEntryKitTests-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.release.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit/SwiftEntryKit.framework/Headers\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift \"$(PLATFORM_DIR)/Developer/Library/Frameworks\" '@executable_path/Frameworks' '@loader_path/Frameworks'\nLIBRARY_SEARCH_PATHS = $(inherited) \"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\" /usr/lib/swift\nOTHER_LDFLAGS = $(inherited) -framework \"SwiftEntryKit\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SwiftEntryKit : NSObject\n@end\n@implementation PodsDummy_SwiftEntryKit\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double SwiftEntryKitVersionNumber;\nFOUNDATION_EXPORT const unsigned char SwiftEntryKitVersionString[];\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLIBRARY_SEARCH_PATHS = $(inherited) \"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\" /usr/lib/swift\nOTHER_LDFLAGS = $(inherited) -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/../..\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit.modulemap",
    "content": "framework module SwiftEntryKit {\n  umbrella header \"SwiftEntryKit-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/SwiftEntryKit/SwiftEntryKit.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLIBRARY_SEARCH_PATHS = $(inherited) \"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\" /usr/lib/swift\nOTHER_LDFLAGS = $(inherited) -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/../..\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Example/SwiftEntryKit/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  SwiftEntryKit\n//\n//  Created by huri000@gmail.com on 04/21/2018.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n}\n\n"
  },
  {
    "path": "Example/SwiftEntryKit/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14088\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"SwiftEntryKit\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" name=\"HelveticaNeue-Bold\" family=\"Helvetica Neue\" pointSize=\"36\"/>\n                    <color key=\"textColor\" red=\"0.5411764979\" green=\"0.58431375029999999\" blue=\"0.61960786580000005\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Example/SwiftEntryKit/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14845\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"GJh-t4-OgG\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14799.2\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Presets-->\n        <scene sceneID=\"ufC-wZ-h7g\">\n            <objects>\n                <viewController id=\"vXZ-lx-hvc\" customClass=\"PresetsViewController\" customModule=\"SwiftEntryKitDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"jyV-Pf-zRb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"2fi-mo-0CV\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"kh9-bI-dsS\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"Presets\" id=\"coN-y3-4zm\">\n                        <barButtonItem key=\"leftBarButtonItem\" style=\"plain\" id=\"SwH-fx-J00\">\n                            <segmentedControl key=\"customView\" opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"top\" segmentControlStyle=\"bar\" selectedSegmentIndex=\"0\" id=\"V1g-o8-2Y5\">\n                                <rect key=\"frame\" x=\"16\" y=\"5.5\" width=\"113\" height=\"33\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <segments>\n                                    <segment title=\"☀️\" width=\"35\"/>\n                                    <segment title=\"🌑\" width=\"35\"/>\n                                    <segment title=\"off\" width=\"35\"/>\n                                </segments>\n                                <connections>\n                                    <action selector=\"displayModeSegmentedControlValueChanged\" destination=\"vXZ-lx-hvc\" eventType=\"valueChanged\" id=\"JXS-ao-eeP\"/>\n                                </connections>\n                            </segmentedControl>\n                        </barButtonItem>\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Playground\" id=\"IX0-qK-RAk\">\n                            <connections>\n                                <segue destination=\"hAa-pE-SAe\" kind=\"show\" id=\"WMZ-op-Cyq\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <connections>\n                        <outlet property=\"displayModeSegmentedControl\" destination=\"V1g-o8-2Y5\" id=\"Xzk-pX-1aU\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"x5A-6p-PRh\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"982\" y=\"439\"/>\n        </scene>\n        <!--Playground-->\n        <scene sceneID=\"6CQ-Ki-hYC\">\n            <objects>\n                <viewController id=\"hAa-pE-SAe\" customClass=\"PlaygroundViewController\" customModule=\"SwiftEntryKitDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"DSG-Fp-vjt\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"zT4-fx-ydB\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"pqE-zB-oBo\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </view>\n                    <toolbarItems/>\n                    <navigationItem key=\"navigationItem\" title=\"Playground\" id=\"uMb-FP-a2v\">\n                        <barButtonItem key=\"backBarButtonItem\" title=\"Back\" id=\"Zvk-BE-qQ1\"/>\n                        <barButtonItem key=\"rightBarButtonItem\" systemItem=\"play\" id=\"e2Q-Yz-Q9Z\">\n                            <connections>\n                                <action selector=\"play\" destination=\"hAa-pE-SAe\" id=\"SjT-9Z-CQC\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <simulatedToolbarMetrics key=\"simulatedBottomBarMetrics\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"CjF-WE-dXu\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2031\" y=\"439\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"VAr-ql-LMB\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"GJh-t4-OgG\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" id=\"G5B-fH-GBM\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"vXZ-lx-hvc\" kind=\"relationship\" relationship=\"rootViewController\" id=\"0Tf-h1-nwl\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"UDz-eg-cSm\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"136.80000000000001\" y=\"791.15442278860576\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/SwiftEntryKit/DemoAppInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/audience-band-blur-518389.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"audience-band-blur-518389.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/battery0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/battery1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/battery2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (2).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (2)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (2)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/battery3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (3).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (3)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (3)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/battery4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (4).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (4)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (4)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/battery/battery5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (5).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (5)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"battery (5)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_bottom_float.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon1.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon1@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_bottom_popup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon4.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon4@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_bottom_toast.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon3.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon3@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_sb_note.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon7.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon7@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_top_float.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon2.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon2@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_top_note.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon6.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon6@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/iPhone Icons/ic_top_toast.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon5.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon5@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_apple.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"apple.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"apple@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"apple@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_books.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"books.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"books@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"books@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_coffee_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coffee (2).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coffee (2)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coffee (2)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_done_all_dark_48pt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_done_all_48pt.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_done_all_48pt_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_done_all_48pt_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_done_all_light_48pt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_done_all_white_48pt.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_done_all_white_48pt_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_done_all_white_48pt_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_fast_forward_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fast_forward_white.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fast_forward_white_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fast_forward_white_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_fast_rewind_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fast_rewind_white.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fast_rewind_white_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fast_rewind_white_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_info_outline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_info_outline.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_info_outline_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_info_outline_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_lock_dark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"key.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"key@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"key@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_lock_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"key (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"key (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"key (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_madi_profile.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"madlen.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_mail_dark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mail.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mail@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_mail_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mail (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mail (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mail (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_pause_circle_outline_white_36pt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_pause_circle_outline_white_36pt.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_pause_circle_outline_white_36pt_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_pause_circle_outline_white_36pt_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_pause_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_pause_white.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_pause_white_2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_pause_white_3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_phone_dark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"phone-call.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"phone-call@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"phone-call@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_phone_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"phone-call (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"phone-call (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"phone-call (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_pizza.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pizza.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pizza@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pizza@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_star_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_star_unselected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_success.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"success.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"success@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"success@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_user_dark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_user_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user (2).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user (2)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user (2)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/ic_wifi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi (3).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi (3)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi (3)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Images.xcassets/paper-plane-light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paper-plane (1).png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paper-plane (1)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paper-plane (1)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/SwiftEntryKit/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/AnimationSelectionTableViewCell.swift",
    "content": "//\n//  AnimationSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/26/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport SwiftEntryKit\n\nfinal class AnimationSelectionTableViewCell: SelectionTableViewCell {\n    \n    enum Action: String {\n        case entrance\n        case exit\n        case pop\n        \n        var isOut: Bool {\n            return Set([.exit, .pop]).contains(self)\n        }\n    }\n    \n    var action: Action = .entrance\n    \n    var animation: EKAttributes.Animation {\n        set {\n            switch action {\n            case .entrance:\n                attributesWrapper.attributes.entranceAnimation = newValue\n            case .exit:\n                attributesWrapper.attributes.exitAnimation = newValue\n            case .pop:\n                attributesWrapper.attributes.popBehavior = EKAttributes.PopBehavior.animated(animation: newValue)\n            }\n        }\n        get {\n            switch action {\n            case .entrance:\n                return attributesWrapper.attributes.entranceAnimation\n            case .exit:\n                return attributesWrapper.attributes.exitAnimation\n            case .pop:\n                if case EKAttributes.PopBehavior.animated(animation: let animation) = attributesWrapper.attributes.popBehavior {\n                    return animation\n                } else {\n                    fatalError()\n                }\n            }\n        }\n    }\n    \n    func configure(attributesWrapper: EntryAttributeWrapper, action: Action) {\n        self.action = action\n        configure(attributesWrapper: attributesWrapper)\n    }\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"\\(action.rawValue.capitalized) Animation\"\n        descriptionValue = \"Describes the \\(action.rawValue) animation of the entry\"\n        insertSegments(by: [\"Translate\", \"Scale\", \"Fade\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        if animation.containsTranslation {\n            segmentedControl.selectedSegmentIndex = 0\n        } else if animation.containsScale {\n            segmentedControl.selectedSegmentIndex = 1\n        } else if animation.containsFade {\n            segmentedControl.selectedSegmentIndex = 2\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            animation = .translation\n        case 1 where action.isOut:\n            animation = .init(scale: .init(from: 1, to: 0, duration: 0.3))\n        case 1:\n            animation = .init(scale: .init(from: 0, to: 1, duration: 0.3))\n        case 2 where action.isOut:\n            animation = .init(fade: .init(from: 1, to: 0, duration: 0.3))\n        case 2:\n            animation = .init(fade: .init(from: 0, to: 1, duration: 0.3))\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/BackgroundStyleSelectionTableViewCell.swift",
    "content": "//\n//  ScreenBackgroundStyleSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class BackgroundStyleSelectionTableViewCell: SelectionTableViewCell {\n    \n    private var focus: Focus = .entry\n    \n    private var backgroundStyle: EKAttributes.BackgroundStyle {\n        get {\n            switch focus {\n            case .entry:\n                return attributesWrapper.attributes.entryBackground\n            case .screen:\n                return attributesWrapper.attributes.screenBackground\n            }\n        }\n        set {\n            switch focus {\n            case .entry:\n                attributesWrapper.attributes.entryBackground = newValue\n            case .screen:\n                attributesWrapper.attributes.screenBackground = newValue\n            }\n        }\n    }\n    \n    func configure(attributesWrapper: EntryAttributeWrapper, focus: Focus) {\n        self.focus = focus\n        configure(attributesWrapper: attributesWrapper)\n    }\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"\\(focus.rawValue.capitalized) Background Style\"\n        descriptionValue = \"The style of the \\(focus.rawValue)'s background can be one of the following options\"\n        insertSegments(by: [\"Clear\", \"Blur\", \"Gradient\", \"Color\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch backgroundStyle {\n        case .clear:\n            segmentedControl.selectedSegmentIndex = 0\n        case .visualEffect(style: _):\n            segmentedControl.selectedSegmentIndex = 1\n        case .gradient(gradient: _):\n            segmentedControl.selectedSegmentIndex = 2\n        case .color(color: _):\n            segmentedControl.selectedSegmentIndex = 3\n        default:\n            // TODO: Image isn't handled yet\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            backgroundStyle = .clear\n        case 1:\n            backgroundStyle = .visualEffect(style: .standard)\n        case 2:\n            let gradient = EKAttributes.BackgroundStyle.Gradient(\n                colors: [Color.BlueGray.c100, Color.BlueGray.c300],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n            backgroundStyle = .gradient(gradient: gradient)\n        case 3:\n            let color: EKColor\n            switch focus {\n            case .entry:\n                color = .amber\n            case .screen:\n                color = EKColor.black.with(alpha: 0.5)\n            }\n            backgroundStyle = .color(color: color)\n        default:\n            break\n        }\n    }\n}\n\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/BorderSelectionTableViewCell.swift",
    "content": "//\n//  BorderSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/28/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class BorderSelectionTableViewCell: SelectionTableViewCell {\n\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Border\"\n        descriptionValue = \"Add a border to the entry\"\n        insertSegments(by: [\"Off\", \"On\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.border {\n        case .none:\n            segmentedControl.selectedSegmentIndex = 0\n        case .value(color: _, width: _):\n            segmentedControl.selectedSegmentIndex = 1\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.border = .none\n        case 1:\n            attributesWrapper.attributes.border = .value(color: UIColor.black, width: 0.5)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/DisplayDurationSelectionTableViewCell.swift",
    "content": "//\n//  VisibleDurationTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/24/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class DisplayDurationSelectionTableViewCell: SelectionTableViewCell {\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Display Duration\"\n        descriptionValue = \"How long the entry is displayed\"\n        insertSegments(by: [\"2 Seconds\", \"4 Seconds\", \"infinite\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.displayDuration {\n        case 2:\n            segmentedControl.selectedSegmentIndex = 0\n        case 4:\n            segmentedControl.selectedSegmentIndex = 1\n        case .infinity:\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.displayDuration = 2\n        case 1:\n            attributesWrapper.attributes.displayDuration = 4\n        case 2:\n            attributesWrapper.attributes.displayDuration = .infinity\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/HapticFeedbackSelectionTableViewCell.swift",
    "content": "//\n//  NotificationFeedbackSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\nfinal class HapticFeedbackSelectionTableViewCell: SelectionTableViewCell {\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Notification Haptic Feedback\"\n        descriptionValue = \"Generate a haptic feedback once the entry shows\"\n        insertSegments(by: [\"Off\", \"Success\", \"Warning\", \"Error\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributes.hapticFeedbackType {\n        case .none:\n            segmentedControl.selectedSegmentIndex = 0\n        case .success:\n            segmentedControl.selectedSegmentIndex = 1\n        case .warning:\n            segmentedControl.selectedSegmentIndex = 2\n        case .error:\n            segmentedControl.selectedSegmentIndex = 3\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.hapticFeedbackType = .none\n        case 1:\n            attributesWrapper.attributes.hapticFeedbackType = .success\n        case 2:\n            attributesWrapper.attributes.hapticFeedbackType = .warning\n        case 3:\n            attributesWrapper.attributes.hapticFeedbackType = .error\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/HeightSelectionTableViewCell.swift",
    "content": "//\n//  HeightSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/26/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class HeightSelectionTableViewCell: SelectionTableViewCell {\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Height\"\n        descriptionValue = \"Describes the entry's height inside the screen. It can be a constant, receive intrinsic height or even get a screen height ratio\"\n        insertSegments(by: [\"Intrinsic\", \"100pts\", \"50% Ratio\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.positionConstraints.size.height {\n        case .intrinsic:\n            segmentedControl.selectedSegmentIndex = 0\n        case .constant(value: 100):\n            segmentedControl.selectedSegmentIndex = 1\n        case .ratio(value: 0.5):\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.positionConstraints.size.height = .intrinsic\n        case 1:\n            attributesWrapper.attributes.positionConstraints.size.height = .constant(value: 100)\n        case 2:\n            attributesWrapper.attributes.positionConstraints.size.height = .ratio(value: 0.5)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/MaxWidthSelectionTableViewCell.swift",
    "content": "//\n//  MaxWidthSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/26/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class MaxWidthSelectionTableViewCell: SelectionTableViewCell {\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Max Width\"\n        descriptionValue = \"Describes the entry's maximum width limitation. It can stretch to the width of the screen, get screen edge less 40pts, or be 90% of the screen width\"\n        insertSegments(by: [\"Stretch\", \"Min Edge\", \"90% Screen\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.positionConstraints.maxSize.width {\n        case .offset(value: _):\n            segmentedControl.selectedSegmentIndex = 0\n        case .constant(value: _):\n            segmentedControl.selectedSegmentIndex = 1\n        case .ratio(value: 0.9):\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.positionConstraints.maxSize.width = .offset(value: 0)\n        case 1:\n            attributesWrapper.attributes.positionConstraints.maxSize.width = .constant(value: UIScreen.main.minEdge - 40)\n        case 2:\n            attributesWrapper.attributes.positionConstraints.maxSize.width = .ratio(value: 0.9)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/PositionSelectionTableViewCell.swift",
    "content": "//\n//  LocationSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/24/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class PositionSelectionTableViewCell: SelectionTableViewCell {\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Position\"\n        descriptionValue = \"The position of the entry inside the screen\"\n        insertSegments(by: [\"Top\", \"Bottom\", \"Center\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.position {\n        case .top:\n            segmentedControl.selectedSegmentIndex = 0\n        case .bottom:\n            segmentedControl.selectedSegmentIndex = 1\n        case .center:\n            segmentedControl.selectedSegmentIndex = 2\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.position = .top\n        case 1:\n            attributesWrapper.attributes.position = .bottom\n        case 2:\n            attributesWrapper.attributes.position = .center\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/PrioritySelectionTableViewCell.swift",
    "content": "//\n//  PrioritySelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/29/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class PrioritySelectionTableViewCell: SelectionTableViewCell {\n\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Display Priority\"\n        descriptionValue = \"The priority of the entry. *Max* overrides any other entry. *Normal* overrides only other normal priority entry\"\n        insertSegments(by: [\"Normal\", \"High\", \"Max\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.precedence.priority {\n        case .normal:\n            segmentedControl.selectedSegmentIndex = 0\n        case .high:\n            segmentedControl.selectedSegmentIndex = 1\n        case .max:\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.precedence.priority = .normal\n        case 1:\n            attributesWrapper.attributes.precedence.priority = .high\n        case 2:\n            attributesWrapper.attributes.precedence.priority = .max\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/RoundCornersSelectionTableViewCell.swift",
    "content": "//\n//  RoundCornersSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class RoundCornersSelectionTableViewCell: SelectionTableViewCell {\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Round Corners\"\n        descriptionValue = \"The entry's corners can be rounded in one of the following manner\"\n        insertSegments(by: [\"None\", \"Top\", \"Bottom\", \"All\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.roundCorners {\n        case .none:\n            segmentedControl.selectedSegmentIndex = 0\n        case .top(radius: _):\n            segmentedControl.selectedSegmentIndex = 1\n        case .bottom(radius: _):\n            segmentedControl.selectedSegmentIndex = 2\n        case .all(radius: _):\n            segmentedControl.selectedSegmentIndex = 3\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.roundCorners = .none\n        case 1:\n            attributesWrapper.attributes.roundCorners = .top(radius: 10)\n        case 2:\n            attributesWrapper.attributes.roundCorners = .bottom(radius: 10)\n        case 3:\n            attributesWrapper.attributes.roundCorners = .all(radius: 10)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/SafeAreaSelectionTableViewCell.swift",
    "content": "//\n//  SafeAreaSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class SafeAreaSelectionTableViewCell: SelectionTableViewCell {\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Safe Area Adjustment\"\n        descriptionValue = \"Describes whether the entry overrides / ignore safe area insets\"\n        insertSegments(by: [\"Colored\", \"Uncolored\", \"Override\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.positionConstraints.safeArea {\n        case .empty(fillSafeArea: let fill) where fill:\n            segmentedControl.selectedSegmentIndex = 0\n        case .empty(fillSafeArea: let fill) where !fill:\n            segmentedControl.selectedSegmentIndex = 1\n        case .overridden:\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.positionConstraints.safeArea = .empty(fillSafeArea: true)\n        case 1:\n            attributesWrapper.attributes.positionConstraints.safeArea = .empty(fillSafeArea: false)\n        case 2:\n            attributesWrapper.attributes.positionConstraints.safeArea = .overridden\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/ScrollSelectionTableViewCell.swift",
    "content": "//\n//  ScrollSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class ScrollSelectionTableViewCell: SelectionTableViewCell {\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Scroll Behavior\"\n        descriptionValue = \"Describes whether the entry is vertically scrollable\"\n        insertSegments(by: [\"Loosed\", \"Disabled\", \"One Side\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.scroll {\n        case .enabled:\n            segmentedControl.selectedSegmentIndex = 0\n        case .disabled:\n            segmentedControl.selectedSegmentIndex = 1\n        case .edgeCrossingDisabled:\n            segmentedControl.selectedSegmentIndex = 2\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.scroll = .enabled(swipeable: true, pullbackAnimation: .jolt)\n        case 1:\n            attributesWrapper.attributes.scroll = .disabled\n        case 2:\n            attributesWrapper.attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/SelectionHeaderView.swift",
    "content": "//\n//  SelectionHeaderView.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/26/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class SelectionHeaderView: UITableViewHeaderFooterView {\n\n    var text: String {\n        set {\n            textLabel?.text = newValue\n        }\n        get {\n            return textLabel?.text ?? \"\"\n        }\n    }\n    \n    var displayMode = EKAttributes.DisplayMode.inferred {\n        didSet {\n            setupInterfaceStyle()\n        }\n    }\n    \n    override init(reuseIdentifier: String?) {\n        super.init(reuseIdentifier: reuseIdentifier)\n        backgroundView = UIView()\n        textLabel?.font = MainFont.bold.with(size: 17)\n        setupInterfaceStyle()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupInterfaceStyle() {\n        backgroundView?.backgroundColor = EKColor.headerBackground.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        textLabel?.textColor = EKColor.standardContent.with(alpha: 0.8).color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/SelectionTableViewCell.swift",
    "content": "//\n//  SelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/23/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nclass SelectionBaseCell: UITableViewCell {\n    func configure(attributesWrapper: EntryAttributeWrapper) {}\n}\n\nclass SelectionTableViewCell: SelectionBaseCell {\n\n    enum Focus: String {\n        case entry\n        case screen\n    }\n    \n    enum Setting {\n        case position\n        case windowLevel\n    }\n    \n    private let titleLabel = UILabel()\n    private let descriptionLabel = UILabel()\n    let segmentedControl = UISegmentedControl()\n    \n    var attributesWrapper: EntryAttributeWrapper!\n    \n    var attributes: EKAttributes {\n        return attributesWrapper.attributes\n    }\n    \n    var titleValue: String {\n        set {\n            titleLabel.text = newValue\n        }\n        get {\n            return titleLabel.text ?? \"\"\n        }\n    }\n    \n    var descriptionValue: String {\n        set {\n            descriptionLabel.text = newValue\n        }\n        get {\n            return descriptionLabel.text ?? \"\"\n        }\n    }\n    \n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupTitleLabel()\n        setupDescriptionLabel()\n        setupSegmentedControl()\n        setupInterfaceStyle()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupTitleLabel() {\n        contentView.addSubview(titleLabel)\n        titleLabel.font = MainFont.bold.with(size: 18)\n        titleLabel.layoutToSuperview(.top, offset: 20)\n        titleLabel.layoutToSuperview(axis: .horizontally, offset: 20)\n        titleLabel.forceContentWrap(.vertically)\n    }\n    \n    private func setupDescriptionLabel() {\n        contentView.addSubview(descriptionLabel)\n        descriptionLabel.font = MainFont.light.with(size: 15)\n        descriptionLabel.numberOfLines = 0\n        descriptionLabel.layout(.top, to: .bottom, of: titleLabel, offset: 10)\n        descriptionLabel.layoutToSuperview(axis: .horizontally, offset: 20)\n        descriptionLabel.forceContentWrap(.vertically)\n    }\n    \n    private func setupSegmentedControl() {\n        contentView.addSubview(segmentedControl)\n        segmentedControl.setTitleTextAttributes(\n            [NSAttributedString.Key.font: MainFont.light.with(size: 15)],\n            for: .normal\n        )\n        segmentedControl.setTitleTextAttributes(\n            [NSAttributedString.Key.font: MainFont.medium.with(size: 15)],\n            for: .selected\n        )\n        segmentedControl.addTarget(\n            self,\n            action: #selector(segmentChanged),\n            for: .valueChanged\n        )\n        segmentedControl.layout(.top, to: .bottom, of: descriptionLabel, offset: 10)\n        segmentedControl.layoutToSuperview(axis: .horizontally, offset: 20)\n        segmentedControl.layoutToSuperview(.bottom, offset: -20)\n    }\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        segmentedControl.removeAllSegments()\n        self.attributesWrapper = attributesWrapper\n    }\n    \n    func insertSegments(by array: [String]) {\n        for (index, info) in array.enumerated() {\n            segmentedControl.insertSegment(withTitle: info, at: index, animated: false)\n        }\n    }\n    \n    @objc func segmentChanged() {}\n    \n    private func setupInterfaceStyle() {\n        contentView.backgroundColor = EKColor.standardBackground.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        segmentedControl.tintColor = EKColor.segmentedControlTint.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        segmentedControl.setTitleTextAttributes(\n            [NSAttributedString.Key.foregroundColor:\n                EKColor.standardContent.color(\n                    for: traitCollection,\n                    mode: PresetsDataSource.displayMode\n                )\n            ],\n            for: .normal\n        )\n        segmentedControl.setTitleTextAttributes(\n            [NSAttributedString.Key.foregroundColor:\n                EKColor.standardContent.inverted.color(\n                    for: traitCollection,\n                    mode: PresetsDataSource.displayMode\n                )\n            ],\n            for: .selected\n        )\n        titleLabel.textColor = EKColor.standardContent.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        descriptionLabel.textColor = EKColor.standardContent.with(alpha: 0.8).color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/ShadowSelectionTableViewCell.swift",
    "content": "//\n//  ShadowSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class ShadowSelectionTableViewCell: SelectionTableViewCell {\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Drop Shadow\"\n        descriptionValue = \"A drop shadow effect that can be applied to the entry\"\n        insertSegments(by: [\"Off\", \"On\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.shadow {\n        case .none:\n            segmentedControl.selectedSegmentIndex = 0\n        case .active(with: _):\n            segmentedControl.selectedSegmentIndex = 1\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.shadow = .none\n        case 1:\n            let value = EKAttributes.Shadow.Value(color: .black, opacity: 0.5, radius: 10, offset: .zero)\n            attributesWrapper.attributes.shadow = .active(with: value)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/UserInteractionSelectionTableViewCell.swift",
    "content": "//\n//  UserInteractionSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class UserInteractionSelectionTableViewCell: SelectionTableViewCell {\n        \n    var focus: Focus = .entry\n    \n    private var interactionAction: EKAttributes.UserInteraction.Default {\n        get {\n            switch focus {\n            case .entry:\n                return attributesWrapper.attributes.entryInteraction.defaultAction\n            case .screen:\n                return attributesWrapper.attributes.screenInteraction.defaultAction\n            }\n        }\n        set {\n            switch focus {\n            case .entry:\n                attributesWrapper.attributes.entryInteraction.defaultAction = newValue\n            case .screen:\n                attributesWrapper.attributes.screenInteraction.defaultAction = newValue\n            }\n        }\n    }\n    \n    func configure(attributesWrapper: EntryAttributeWrapper, focus: Focus) {\n        self.focus = focus\n        configure(attributesWrapper: attributesWrapper)\n    }\n    \n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"\\(focus.rawValue.capitalized) User Interaction\"\n        descriptionValue = \"Describes what happens when the user taps the \\(focus.rawValue). The touch can be absorbed, delay the exit, be forwarded to the window below, or dismiss the entry.\"\n        \n        insertSegments(by: [\"Absorb\", \"Delay\", \"Forward\", \"Dismiss\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch interactionAction {\n        case .absorbTouches:\n            segmentedControl.selectedSegmentIndex = 0\n        case .delayExit(by: _):\n            segmentedControl.selectedSegmentIndex = 1\n        case .forward:\n            segmentedControl.selectedSegmentIndex = 2\n        case .dismissEntry:\n            segmentedControl.selectedSegmentIndex = 3\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            interactionAction = .absorbTouches\n        case 1:\n            interactionAction = .delayExit(by: 4)\n        case 2:\n            interactionAction = .forward\n        case 3:\n            interactionAction = .dismissEntry\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/WidthSelectionTableViewCell.swift",
    "content": "//\n//  WidthSelectionTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class WidthSelectionTableViewCell: SelectionTableViewCell {\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Width\"\n        descriptionValue = \"Describes the entry's width inside the screen. It can be stretched to the margins, it can have an offset, can a constant or have a ratio to the screen\"\n        insertSegments(by: [\"Stretch\", \"20pts Offset\", \"90% Screen\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.positionConstraints.size.width {\n        case .offset(value: let value):\n            if value == 0 {\n                segmentedControl.selectedSegmentIndex = 0\n            } else {\n                segmentedControl.selectedSegmentIndex = 1\n            }\n        case .ratio(value: _):\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.positionConstraints.size.width = .offset(value: 0)\n        case 1:\n            attributesWrapper.attributes.positionConstraints.size.width = .offset(value: 20)\n        case 2:\n            attributesWrapper.attributes.positionConstraints.size.width = .ratio(value: 0.9)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/Cells/WindowLevelSelectionTableViewCell.swift",
    "content": "//\n//  WindowLevelTableViewCell.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/24/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class WindowLevelSelectionTableViewCell: SelectionTableViewCell {\n\n    override func configure(attributesWrapper: EntryAttributeWrapper) {\n        super.configure(attributesWrapper: attributesWrapper)\n        titleValue = \"Window Level\"\n        descriptionValue = \"Where the entry should be displayed in the application window hierarchy\"\n        insertSegments(by: [\"Normal\", \"Status Bar\", \"Alerts\"])\n        selectSegment()\n    }\n    \n    private func selectSegment() {\n        switch attributesWrapper.attributes.windowLevel {\n        case .normal:\n            segmentedControl.selectedSegmentIndex = 0\n        case .statusBar:\n            segmentedControl.selectedSegmentIndex = 1\n        case .alerts:\n            segmentedControl.selectedSegmentIndex = 2\n        default:\n            break\n        }\n    }\n    \n    @objc override func segmentChanged() {\n        switch segmentedControl.selectedSegmentIndex {\n        case 0:\n            attributesWrapper.attributes.windowLevel = .normal\n        case 1:\n            attributesWrapper.attributes.windowLevel = .statusBar\n        case 2:\n            attributesWrapper.attributes.windowLevel = .alerts\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/EntryAttributeWrapper.swift",
    "content": "//\n//  EntryAttributeWrapper.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/23/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport SwiftEntryKit\n\nclass EntryAttributeWrapper {\n    var attributes: EKAttributes\n    init(with attributes: EKAttributes) {\n        self.attributes = attributes\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Playground/PlaygroundViewController.swift",
    "content": "//\n//  PlaygroundViewController.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nfinal class PlaygroundViewController: UIViewController {\n    \n    // MARK: - Types\n    \n    struct Cells {\n        static let sectionTitles = [\"Display\",\n                                    \"Theme & Style\",\n                                    \"Interaction\",\n                                    \"Size & Position\",\n                                    \"Animation\"]\n        static let header = SelectionHeaderView.self\n        static let cells = [[PositionSelectionTableViewCell.self,\n                            WindowLevelSelectionTableViewCell.self,\n                            DisplayDurationSelectionTableViewCell.self,\n                            PrioritySelectionTableViewCell.self],\n                            \n                            [ShadowSelectionTableViewCell.self,\n                            RoundCornersSelectionTableViewCell.self,\n                            BorderSelectionTableViewCell.self,\n                            BackgroundStyleSelectionTableViewCell.self,\n                            BackgroundStyleSelectionTableViewCell.self],\n                            \n                            [UserInteractionSelectionTableViewCell.self,\n                            UserInteractionSelectionTableViewCell.self,\n                            ScrollSelectionTableViewCell.self,\n                            HapticFeedbackSelectionTableViewCell.self],\n                            \n                            [WidthSelectionTableViewCell.self,\n                            HeightSelectionTableViewCell.self,\n                            MaxWidthSelectionTableViewCell.self,\n                            SafeAreaSelectionTableViewCell.self],\n                            \n                            [AnimationSelectionTableViewCell.self,\n                            AnimationSelectionTableViewCell.self,\n                            AnimationSelectionTableViewCell.self]]\n    }\n    \n    // MARK: - Properties\n    \n    private let tableView = UITableView()\n        \n    private lazy var attributesWrapper: EntryAttributeWrapper = {\n        var attributes = EKAttributes()\n        attributes.positionConstraints = .fullWidth\n        attributes.hapticFeedbackType = .success\n        attributes.positionConstraints.safeArea = .empty(fillSafeArea: true)\n        attributes.entryBackground = .visualEffect(style: .standard)\n        return EntryAttributeWrapper(with: attributes)\n    }()\n        \n    // MARK: - Lifecycle & Setup\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        setupTableView()\n        setupInterfaceStyle()\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n    \n    private func setupInterfaceStyle() {\n        tableView.backgroundColor = EKColor.standardBackground.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        tableView.reloadData()\n    }\n    \n    private func setupTableView() {\n        view.addSubview(tableView)\n        tableView.delegate = self\n        tableView.dataSource = self\n        tableView.allowsSelection = false\n        tableView.estimatedRowHeight = UITableView.automaticDimension\n        tableView.estimatedSectionHeaderHeight = UITableView.automaticDimension\n        tableView.register(Cells.header,\n                           forHeaderFooterViewReuseIdentifier: Cells.header.className)\n        Cells.cells.forEach { cells in\n            cells.forEach {\n                tableView.register($0, forCellReuseIdentifier: $0.className)\n            }\n        }\n        tableView.fillSuperview()\n    }\n    \n    // MARK: Actions\n    \n    @IBAction func play() {\n        let title = EKProperty.LabelContent(\n            text: \"Hi there!\",\n            style: EKProperty.LabelStyle(\n                font: MainFont.bold.with(size: 16),\n                color: .black)\n        )\n        let description = EKProperty.LabelContent(\n            text: \"Are you ready for some testing?\",\n            style: EKProperty.LabelStyle(\n                font: MainFont.light.with(size: 14),\n                color: .black\n            )\n        )\n        let image = EKProperty.ImageContent(\n            image: UIImage(named: \"ic_info_outline\")!,\n            size: CGSize(width: 30, height: 30)\n        )\n        let simpleMessage = EKSimpleMessage(\n            image: image,\n            title: title,\n            description: description\n        )\n        let notificationMessage = EKNotificationMessage(simpleMessage: simpleMessage)\n        let contentView = EKNotificationMessageView(with: notificationMessage)\n        SwiftEntryKit.display(entry: contentView, using: attributesWrapper.attributes)\n    }\n}\n\n// MARK: - UITableViewDelegate, UITableViewDataSource\n\nextension PlaygroundViewController: UITableViewDelegate, UITableViewDataSource {\n    private func selectionCell(by id: String,\n                               and indexPath: IndexPath) -> SelectionBaseCell {\n        return tableView.dequeueReusableCell(withIdentifier: id,\n                                             for: indexPath) as! SelectionBaseCell\n    }\n    \n    func tableView(_ tableView: UITableView,\n                   cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        \n        let cell: SelectionBaseCell\n        cell = selectionCell(by: Cells.cells[indexPath.section][indexPath.row].className,\n                             and: indexPath)\n        \n        switch (indexPath.section, indexPath.row) {\n        case (0, 0...3):\n            cell.configure(attributesWrapper: attributesWrapper)\n        case (1, 0...2):\n            cell.configure(attributesWrapper: attributesWrapper)\n        case (1, 3):\n            let cell = cell as! BackgroundStyleSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, focus: .screen)\n        case (1, 4):\n            let cell = cell as! BackgroundStyleSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, focus: .entry)\n        case (2, 0):\n            let cell = cell as! UserInteractionSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, focus: .screen)\n        case (2, 1):\n            let cell = cell as! UserInteractionSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, focus: .entry)\n        case (2, 2...4):\n            cell.configure(attributesWrapper: attributesWrapper)\n        case (3, 0...3):\n            cell.configure(attributesWrapper: attributesWrapper)\n        case (4, 0):\n            let cell = cell as! AnimationSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, action: .entrance)\n        case (4, 1):\n            let cell = cell as! AnimationSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, action: .exit)\n        case (4, 2):\n            let cell = cell as! AnimationSelectionTableViewCell\n            cell.configure(attributesWrapper: attributesWrapper, action: .pop)\n        default:\n            fatalError()\n        }\n        \n        return cell\n    }\n    \n    func tableView(_ tableView: UITableView,\n                   viewForHeaderInSection section: Int) -> UIView? {\n        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: Cells.header.className) as! SelectionHeaderView\n        header.text = Cells.sectionTitles[section]\n        return header\n    }\n    \n    func numberOfSections(in tableView: UITableView) -> Int {\n        return Cells.cells.count\n    }\n    \n    func tableView(_ tableView: UITableView,\n                   numberOfRowsInSection section: Int) -> Int {\n        return Cells.cells[section].count\n    }\n    \n    // iOS 9, 10 support\n    func tableView(_ tableView: UITableView,\n                   estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {\n        return 80\n    }\n    \n    func tableView(_ tableView: UITableView,\n                   estimatedHeightForHeaderInSection section: Int) -> CGFloat {\n        return 50\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/FormFieldPresetFactory.swift",
    "content": "//\n//  FormFieldPresetFactory.swift\n//  SwiftEntryKitDemo\n//\n//  Created by Daniel Huri on 5/18/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\nimport SwiftEntryKit\n\nstruct TextFieldOptionSet: OptionSet {\n    let rawValue: Int\n    static let fullName = TextFieldOptionSet(rawValue: 1 << 0)\n    static let mobile = TextFieldOptionSet(rawValue: 1 << 1)\n    static let email = TextFieldOptionSet(rawValue: 1 << 2)\n    static let password = TextFieldOptionSet(rawValue: 1 << 3)\n}\n\nenum FormStyle {\n    case light\n    case metallic\n        \n    var buttonTitle: EKProperty.LabelStyle {\n        return .init(\n            font: MainFont.bold.with(size: 16),\n            color: buttonTitleColor\n        )\n    }\n    \n    var textColor: EKColor {\n        switch self {\n        case .metallic:\n            return .white\n        case .light:\n            return .standardContent\n        }\n    }\n    \n    var buttonTitleColor: EKColor {\n        switch self {\n        case .metallic:\n            return .black\n        case .light:\n            return .white\n        }\n    }\n    \n    var buttonBackground: EKColor {\n        switch self {\n        case .metallic:\n            return .white\n        case .light:\n            return .redish\n        }\n    }\n    \n    var placeholder: EKProperty.LabelStyle {\n        let font = MainFont.light.with(size: 14)\n        switch self {\n        case .metallic:\n            return .init(font: font, color: UIColor(white: 0.8, alpha: 1).ekColor)\n        case .light:\n            return .init(font: font, color: UIColor(white: 0.5, alpha: 1).ekColor)\n        }\n    }\n    \n    var separator: EKColor {\n        return UIColor(white: 0.8784, alpha: 0.6).ekColor\n    }\n}\n\nfinal class FormFieldPresetFactory {\n    \n    private static var displayMode: EKAttributes.DisplayMode {\n        return PresetsDataSource.displayMode\n    }\n    \n    class func email(placeholderStyle: EKProperty.LabelStyle,\n                     textStyle: EKProperty.LabelStyle,\n                     separatorColor: EKColor,\n                     style: FormStyle) -> EKProperty.TextFieldContent {\n        let emailPlaceholder = EKProperty.LabelContent(\n            text: \"Email Address\",\n            style: placeholderStyle\n        )\n        return .init(keyboardType: .emailAddress,\n                     placeholder: emailPlaceholder,\n                     tintColor: style.textColor,\n                     displayMode: displayMode,\n                     textStyle: textStyle,\n                     leadingImage: UIImage(named: \"ic_mail_light\")!.withRenderingMode(.alwaysTemplate),\n                     bottomBorderColor: separatorColor,\n                     accessibilityIdentifier: \"emailTextField\")\n    }\n    \n    class func fullName(placeholderStyle: EKProperty.LabelStyle,\n                        textStyle: EKProperty.LabelStyle,\n                        separatorColor: EKColor,\n                        style: FormStyle) -> EKProperty.TextFieldContent {\n        let fullNamePlaceholder = EKProperty.LabelContent(\n            text: \"Full Name\",\n            style: placeholderStyle\n        )\n        return .init(keyboardType: .namePhonePad,\n                     placeholder: fullNamePlaceholder,\n                     tintColor: style.textColor,\n                     displayMode: displayMode,\n                     textStyle: textStyle,\n                     leadingImage: UIImage(named: \"ic_user_light\")!.withRenderingMode(.alwaysTemplate),\n                     bottomBorderColor: separatorColor,\n                     accessibilityIdentifier: \"nameTextField\")\n    }\n    \n    class func mobile(placeholderStyle: EKProperty.LabelStyle,\n                      textStyle: EKProperty.LabelStyle,\n                      separatorColor: EKColor,\n                      style: FormStyle) -> EKProperty.TextFieldContent {\n        let mobilePlaceholder = EKProperty.LabelContent(\n            text: \"Mobile Phone\",\n            style: placeholderStyle\n        )\n        return .init(keyboardType: .decimalPad,\n                     placeholder: mobilePlaceholder,\n                     tintColor: style.textColor,\n                     displayMode: displayMode,\n                     textStyle: textStyle,\n                     leadingImage: UIImage(named: \"ic_phone_light\")!.withRenderingMode(.alwaysTemplate),\n                     bottomBorderColor: separatorColor,\n                     accessibilityIdentifier: \"mobilePhoneTextField\")\n    }\n    \n    class func password(placeholderStyle: EKProperty.LabelStyle,\n                        textStyle: EKProperty.LabelStyle,\n                        separatorColor: EKColor,\n                        style: FormStyle) -> EKProperty.TextFieldContent {\n        let passwordPlaceholder = EKProperty.LabelContent(text: \"Password\",\n                                                          style: placeholderStyle)\n        return .init(keyboardType: .namePhonePad,\n                     placeholder: passwordPlaceholder,\n                     tintColor: style.textColor,\n                     displayMode: displayMode,\n                     textStyle: textStyle,\n                     isSecure: true,\n                     leadingImage: UIImage(named: \"ic_lock_light\")!.withRenderingMode(.alwaysTemplate),\n                     bottomBorderColor: separatorColor,\n                     accessibilityIdentifier: \"passwordTextField\")\n    }\n    \n    class func fields(by set: TextFieldOptionSet,\n                      style: FormStyle) -> [EKProperty.TextFieldContent] {\n        var array: [EKProperty.TextFieldContent] = []\n        let placeholderStyle = style.placeholder\n        let textStyle = EKProperty.LabelStyle(\n            font: MainFont.light.with(size: 14),\n            color: .standardContent,\n            displayMode: displayMode\n        )\n        let separatorColor = style.separator\n        if set.contains(.fullName) {\n            array.append(fullName(placeholderStyle: placeholderStyle,\n                                  textStyle: textStyle,\n                                  separatorColor: separatorColor,\n                                  style: style))\n        }\n        if set.contains(.mobile) {\n            array.append(mobile(placeholderStyle: placeholderStyle,\n                                textStyle: textStyle,\n                                separatorColor: separatorColor,\n                                style: style))\n        }\n        if set.contains(.email) {\n            array.append(email(placeholderStyle: placeholderStyle,\n                               textStyle: textStyle,\n                               separatorColor: separatorColor,\n                               style: style))\n        }\n        if set.contains(.password) {\n            array.append(password(placeholderStyle: placeholderStyle,\n                                  textStyle: textStyle,\n                                  separatorColor: separatorColor,\n                                  style: style))\n        }\n        return array\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/PresetTableViewCell.swift",
    "content": "//\n//  PresetTableViewCell.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 04/14/2018.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport SwiftEntryKit\nimport UIKit\n\nclass PresetTableViewCell: UITableViewCell {\n\n    // MARK: - Properties\n    \n    private let thumbImageView = UIImageView()\n    private let titleLabel = UILabel()\n    private let descriptionLabel = UILabel()\n    \n    var presetDescription: PresetDescription! {\n        didSet {\n            titleLabel.text = presetDescription.title\n            descriptionLabel.text = presetDescription.description\n            thumbImageView.image = UIImage(named: presetDescription.thumb)\n        }\n    }\n    \n    var displayMode: EKAttributes.DisplayMode = .inferred {\n        didSet {\n            setupInterfaceStyle()\n        }\n    }\n    \n    // MARK: - Setup\n    \n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupImageView()\n        setupTitleLabel()\n        setupDescriptionLabel()\n        setupInterfaceStyle()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupImageView() {\n        contentView.addSubview(thumbImageView)\n        thumbImageView.contentMode = .scaleAspectFit\n        thumbImageView.layoutToSuperview(.left, .top, offset: 16)\n        thumbImageView.set(.width, .height, of: 50)\n    }\n    \n    private func setupTitleLabel() {\n        contentView.addSubview(titleLabel)\n        titleLabel.font = MainFont.medium.with(size: 18)\n        titleLabel.numberOfLines = 0\n        titleLabel.layout(.left, to: .right, of: thumbImageView, offset: 16)\n        titleLabel.layout(to: .top, of: thumbImageView)\n        titleLabel.layoutToSuperview(.right, offset: -12)\n    }\n    \n    private func setupDescriptionLabel() {\n        contentView.addSubview(descriptionLabel)\n        descriptionLabel.font = MainFont.light.with(size: 14)\n        descriptionLabel.numberOfLines = 0\n        descriptionLabel.layout(.top, to: .bottom, of: titleLabel, offset: 4)\n        descriptionLabel.layout(to: .left, of: titleLabel)\n        descriptionLabel.layout(to: .right, of: titleLabel)\n        descriptionLabel.layoutToSuperview(.bottom, offset: -16)\n    }\n    \n    private func setupInterfaceStyle() {\n        contentView.backgroundColor = EKColor.standardBackground.color(\n            for: traitCollection,\n            mode: displayMode\n        )\n        titleLabel.textColor = EKColor.standardContent.color(\n            for: traitCollection,\n            mode: displayMode\n        )\n        descriptionLabel.textColor = EKColor.standardContent.with(alpha: 0.8).color(\n            for: traitCollection,\n            mode: displayMode\n        )\n    }\n    \n    override func setHighlighted(_ highlighted: Bool, animated: Bool) {\n        let color: EKColor = highlighted ? .selectedBackground : .standardBackground\n        contentView.backgroundColor = color.color(\n            for: traitCollection,\n            mode: displayMode\n        )\n    }\n    \n    override func setSelected(_ selected: Bool, animated: Bool) {}\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/PresetsData/PresetDescription.swift",
    "content": "//\n//  PresetDescription.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/24/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport SwiftEntryKit\n\n// Description of a single preset to be presented\nstruct PresetDescription {\n    let title: String\n    let description: String\n    let thumb: String\n    let attributes: EKAttributes\n    \n    init(with attributes: EKAttributes, title: String, description: String = \"\", thumb: String) {\n        self.attributes = attributes\n        self.title = title\n        self.description = description\n        self.thumb = thumb\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/PresetsData/PresetsDataSource.swift",
    "content": "//\n//  PresetsDataSource.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/27/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\nimport SwiftEntryKit\n\nstruct PresetsDataSource {\n    \n    // Cluster of presets, aggregated under name\n    typealias Cluster = (title: String, data: [PresetDescription])\n    \n    private enum ThumbDesc: String {\n        case bottomToast = \"ic_bottom_toast\"\n        case bottomFloat = \"ic_bottom_float\"\n        case topToast = \"ic_top_toast\"\n        case topFloat = \"ic_top_float\"\n        case statusBarNote = \"ic_sb_note\"\n        case topNote = \"ic_top_note\"\n        case bottomPopup = \"ic_bottom_popup\"\n    }\n    \n    private(set) var dataSource: [Cluster] = []\n    \n    private(set) subscript(section: Int) -> Cluster {\n        get {\n            return dataSource[section]\n        }\n        set {\n            return dataSource[section] = newValue\n        }\n    }\n    \n    private(set) subscript(section: Int, index: Int) -> PresetDescription {\n        get {\n            return dataSource[section].data[index]\n        }\n        set {\n            return dataSource[section].data[index] = newValue\n        }\n    }\n    \n    static var displayMode = EKAttributes.DisplayMode.inferred\n    private var displayMode: EKAttributes.DisplayMode {\n        return PresetsDataSource.displayMode\n    }\n    \n    // Cumputed for the sake of reusability\n    var bottomAlertAttributes: EKAttributes {\n        var attributes = EKAttributes.bottomFloat\n        attributes.hapticFeedbackType = .success\n        attributes.displayDuration = .infinity\n        attributes.entryBackground = .color(color: .standardBackground)\n        attributes.screenBackground = .color(color: .dimmedLightBackground)\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 8\n            )\n        )\n        attributes.screenInteraction = .dismiss\n        attributes.entryInteraction = .absorbTouches\n        attributes.scroll = .enabled(\n            swipeable: true,\n            pullbackAnimation: .jolt\n        )\n        attributes.roundCorners = .all(radius: 25)\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.7,\n                spring: .init(damping: 1, initialVelocity: 0)\n            ),\n            scale: .init(\n                from: 1.05,\n                to: 1,\n                duration: 0.4,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(duration: 0.2)\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(duration: 0.2)\n            )\n        )\n        attributes.positionConstraints.verticalOffset = 10\n        attributes.positionConstraints.size = .init(\n            width: .offset(value: 20),\n            height: .intrinsic\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        attributes.statusBar = .dark\n        return attributes\n    }\n    \n    // MARK: Setup\n    init() {\n        setup()\n    }\n    \n    mutating func setup() {\n        dataSource = []\n        setupToastPresets()\n        setupNotePresets()\n        setupFloatPresets()\n        setupPopupPresets()\n        setupFormPresets()\n        setupCustomPresets()\n    }\n    \n    private mutating func setupToastPresets() {\n        var toasts: [PresetDescription] = []\n        var attributes: EKAttributes\n        var description: PresetDescription\n        var descriptionString: String\n        var descriptionThumb: String\n\n        // Preset I\n        attributes = .topToast\n        attributes.hapticFeedbackType = .success\n        attributes.displayMode = displayMode\n        attributes.entryBackground = .color(color: Color.LightBlue.a700)\n        attributes.entranceAnimation = .init(\n            translate: .init(duration: 0.3),\n            scale: .init(from: 1.07, to: 1, duration: 0.3)\n        )\n        attributes.exitAnimation = .init(translate: .init(duration: 0.3))\n        attributes.statusBar = .hidden\n        attributes.scroll = .edgeCrossingDisabled(swipeable: false)\n        descriptionString = \"Regular toast that appears at the top. Hides status Bar.\"\n        descriptionThumb = ThumbDesc.topToast.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top I\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        toasts.append(description)\n\n        // Preset II\n        attributes = .topToast\n        attributes.hapticFeedbackType = .success\n        attributes.displayMode = displayMode\n        attributes.statusBar = .light\n        attributes.entryBackground = .color(color: .chatMessage)\n        attributes.entranceAnimation = .translation\n        attributes.exitAnimation = .translation\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.displayDuration = 4\n        attributes.shadow = .active(\n            with: .init(\n                color: .chatMessage,\n                opacity: 0.5,\n                radius: 10\n            )\n        )\n        descriptionString = \"Chat message style toast\"\n        descriptionThumb = ThumbDesc.topToast.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top II\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        toasts.append(description)\n        \n        // Preset III\n        attributes = .bottomToast\n        attributes.displayMode = displayMode\n        attributes.entryBackground = .visualEffect(style: .standard)\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.statusBar = .dark\n        descriptionString = \"Regular bottom toast with blurred background\"\n        descriptionThumb = ThumbDesc.bottomToast.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Bottom I\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        toasts.append(description)\n        \n        // Preset IV\n        attributes = .bottomToast\n        attributes.displayMode = displayMode\n        attributes.windowLevel = .normal\n        attributes.entryBackground = .color(color: EKColor.standardBackground.with(alpha: 0.98))\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.statusBar = .dark\n        descriptionString = \"Bottom toast without an image, appears below the status bar\"\n        descriptionThumb = ThumbDesc.bottomToast.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Bottom II\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        toasts.append(description)\n        \n        dataSource.append((\"Toasts\", toasts))\n    }\n    \n    private mutating func setupNotePresets() {\n        var notes: [PresetDescription] = []\n        var attributes: EKAttributes\n        var description: PresetDescription\n        var descriptionString: String\n        var descriptionThumb: String\n\n        // Preset I\n        attributes = .topNote\n        attributes.displayMode = displayMode\n        attributes.name = \"Top Note\"\n        attributes.hapticFeedbackType = .success\n        attributes.popBehavior = .animated(animation: .translation)\n        attributes.entryBackground = .color(color: .satCyan)\n        attributes.shadow = .active(\n            with: .init(\n                color: .chatMessage,\n                opacity: 0.5,\n                radius: 2\n            )\n        )\n        attributes.statusBar = .light\n        attributes.lifecycleEvents.willAppear = {\n            print(\"will appear action goes here\")\n        }\n        attributes.lifecycleEvents.didAppear = {\n            print(\"did appear action goes here\")\n        }\n        attributes.lifecycleEvents.willDisappear = {\n            print(\"will disappear action goes here\")\n        }\n        attributes.lifecycleEvents.didDisappear = {\n            print(\"did disappear action goes here\")\n        }\n        descriptionString = \"Absorbs (swallows) touches and the status bar becomes light\"\n        descriptionThumb = ThumbDesc.topNote.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top Standard Note\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        notes.append(description)\n\n        // Preset II\n        attributes = .topNote\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.displayDuration = .infinity\n        attributes.popBehavior = .animated(animation: .translation)\n        attributes.entryBackground = .color(color: .pinky)\n        attributes.statusBar = .light\n        descriptionString = \"Appears for an infinite duration\"\n        descriptionThumb = ThumbDesc.topNote.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top Processing Note\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        notes.append(description)\n\n        // Preset III\n        attributes = .topNote\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .error\n        attributes.displayDuration = 3\n        attributes.popBehavior = .animated(animation: .translation)\n        attributes.entryBackground = .color(color: Color.Purple.deep)\n        attributes.statusBar = .light\n        descriptionString = \"Appears for 3 seconds. Generates error notification haptic feedback\"\n        descriptionThumb = ThumbDesc.topNote.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top Image Note\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        notes.append(description)\n        \n        // Preset IV\n        attributes = .topNote\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.displayDuration = 5\n        attributes.popBehavior = .animated(animation: .translation)\n        attributes.entryBackground = .color(color: .white)\n        attributes.statusBar = .dark\n        attributes.shadow = .active(\n            with: .init(\n                opacity: 0.2,\n                radius: 1\n            )\n        )\n        descriptionString =\n        \"\"\"\n        Appears for 5 seconds. Has a thin shadow. Displays image animation. \\\n        Generates success notification haptic feedback\n        \"\"\"\n        descriptionThumb = ThumbDesc.topNote.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top Animating Image Note\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        notes.append(description)\n        \n        // Preset V\n        attributes = .statusBar\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.popBehavior = .animated(animation: .translation)\n        attributes.entryBackground = .color(color: .greenGrass)\n        descriptionString = \"Overrides the status bar\"\n        descriptionThumb = ThumbDesc.statusBarNote.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Status Bar Note\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        notes.append(description)\n        \n        // Preset VI\n        attributes = .bottomNote\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 6\n            )\n        )\n        attributes.entryBackground = .gradient(\n            gradient: .init(\n                colors: [Color.Purple.a300, Color.Purple.a400, Color.Purple.a700],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n        )\n        attributes.statusBar = .dark\n        descriptionString = \"Presented at the bottom / Above the notch\"\n        descriptionThumb = ThumbDesc.bottomToast.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Bottom Standard Note\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        notes.append(description)\n        \n        dataSource.append((\"Notes\", notes))\n    }\n    \n    private mutating func setupFloatPresets() {\n        var floats: [PresetDescription] = []\n        var description: PresetDescription\n        var attributes: EKAttributes\n        var descriptionString: String\n        var descriptionThumb: String\n\n        // Preset I\n        attributes = .topFloat\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.entryBackground = .gradient(\n            gradient: .init(\n                colors: [.amber, .pinky],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(duration: 0.3),\n                scale: .init(from: 1, to: 0.7, duration: 0.7)\n            )\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.5,\n                radius: 10\n            )\n        )\n        attributes.statusBar = .dark\n        attributes.scroll = .enabled(\n            swipeable: true,\n            pullbackAnimation: .easeOut\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString = \"Top float with gradient background\"\n        descriptionThumb = ThumbDesc.topFloat.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        floats.append(description)\n        \n        // Preset II\n        attributes = .bottomFloat\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.entryBackground = .gradient(\n            gradient: .init(\n                colors: [Color.BlueGradient.dark, Color.BlueGradient.light],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n        )\n        attributes.entryInteraction = .delayExit(by: 3)\n        attributes.scroll = .enabled(\n            swipeable: true,\n            pullbackAnimation: .jolt\n        )\n        attributes.statusBar = .dark\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString = \"Bottom float with gradient background. Touches delay exit\"\n        descriptionThumb = ThumbDesc.bottomFloat.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Bottom\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        floats.append(description)\n        \n        dataSource.append((\"Floats\", floats))\n    }\n    \n    private mutating func setupPopupPresets() {\n        var presets: [PresetDescription] = []\n        var attributes: EKAttributes\n        var description: PresetDescription\n        var descriptionString: String\n        var descriptionThumb: String\n\n        // Preset I\n        attributes = bottomAlertAttributes\n        attributes.displayMode = displayMode\n        attributes.entryBackground = .color(color: .musicBackground)\n        descriptionString = \"Bottom floating popup with dimmed background.\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Pop Up I\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset II\n        attributes = EKAttributes.centerFloat\n        attributes.hapticFeedbackType = .success\n        attributes.displayDuration = .infinity\n        attributes.entryBackground = .gradient(\n            gradient: .init(\n                colors: [EKColor(rgb: 0xfffbd5), EKColor(rgb: 0xb20a2c)],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n        )\n        attributes.screenBackground = .color(color: .dimmedDarkBackground)\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 8\n            )\n        )\n        attributes.screenInteraction = .dismiss\n        attributes.entryInteraction = .absorbTouches\n        attributes.scroll = .enabled(\n            swipeable: true,\n            pullbackAnimation: .jolt\n        )\n        attributes.roundCorners = .all(radius: 8)\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.7,\n                spring: .init(damping: 0.7, initialVelocity: 0)\n            ),\n            scale: .init(\n                from: 0.7,\n                to: 1,\n                duration: 0.4,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(duration: 0.2)\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(duration: 0.35)\n            )\n        )\n        attributes.positionConstraints.size = .init(\n            width: .offset(value: 20),\n            height: .intrinsic\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        attributes.statusBar = .dark\n        descriptionString = \"Centeralized floating popup with dimmed background\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Pop Up II\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset III\n        attributes = bottomAlertAttributes\n        attributes.displayMode = displayMode\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.5,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.entryBackground = .gradient(\n            gradient: .init(\n                colors: [Color.LightPink.first, Color.LightPink.last],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n        )\n        attributes.positionConstraints = .fullWidth\n        attributes.positionConstraints.safeArea = .empty(fillSafeArea: true)\n        attributes.roundCorners = .top(radius: 20)\n        descriptionString = \"Bottom toast popup with gradient background\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Pop Up III\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset IV\n        attributes = .topFloat\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.statusBar = .dark\n        attributes.displayDuration = .infinity\n        attributes.screenInteraction = .dismiss\n        attributes.entryInteraction = .absorbTouches\n        attributes.scroll = .enabled(\n            swipeable: true,\n            pullbackAnimation: .jolt\n        )\n        attributes.screenBackground = .color(color: .dimmedLightBackground)\n        attributes.entryBackground = .color(color: .white)\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.7,\n                spring: .init(damping: 1, initialVelocity: 0)\n            ),\n            scale: .init(\n                from: 0.6,\n                to: 1,\n                duration: 0.7\n            ),\n            fade: .init(\n                from: 0.8,\n                to: 1,\n                duration: 0.3\n            )\n        )\n        attributes.exitAnimation = .init(\n            scale: .init(\n                from: 1,\n                to: 0.7,\n                duration: 0.3\n            ),\n            fade: .init(\n                from: 1,\n                to: 0,\n                duration: 0.3\n            )\n        )\n        attributes.border = .value(color: .black, width: 0.5)\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.5,\n                radius: 5\n            )\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString = \"Top floating alert view with button bar. Smooths in animately.\"\n        descriptionThumb = ThumbDesc.topFloat.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top Alert View\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n\n        // Preset V\n        attributes = .centerFloat\n        attributes.displayMode = displayMode\n        attributes.windowLevel = .alerts\n        attributes.displayDuration = .infinity\n        attributes.hapticFeedbackType = .success\n        attributes.screenInteraction = .absorbTouches\n        attributes.entryInteraction = .absorbTouches\n        attributes.scroll = .disabled\n        attributes.screenBackground = .color(color: .dimmedLightBackground)\n        attributes.entryBackground = .color(color: .white)\n        attributes.entranceAnimation = .init(\n            scale: .init(\n                from: 0.9,\n                to: 1,\n                duration: 0.4,\n                spring: .init(damping: 1, initialVelocity: 0)\n            ),\n            fade: .init(\n                from: 0,\n                to: 1,\n                duration: 0.3\n            )\n        )\n        attributes.exitAnimation = .init(\n            fade: .init(\n                from: 1,\n                to: 0,\n                duration: 0.2\n            )\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 5\n            )\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString = \"Center floating alert view with button bar.\"\n        descriptionThumb = ThumbDesc.topFloat.rawValue\n        description = .init(\n            with: attributes, title: \"Center Alert View\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset VI\n        attributes = .centerFloat\n        attributes.displayMode = displayMode\n        attributes.windowLevel = .alerts\n        attributes.displayDuration = .infinity\n        attributes.hapticFeedbackType = .success\n        attributes.screenInteraction = .absorbTouches\n        attributes.entryInteraction = .absorbTouches\n        attributes.scroll = .disabled\n        attributes.screenBackground = .color(color: .dimmedLightBackground)\n        attributes.entryBackground = .visualEffect(style: .standard)\n        attributes.entranceAnimation = .init(\n            scale: .init(\n                from: 0.9,\n                to: 1,\n                duration: 0.4,\n                spring: .init(damping: 0.8, initialVelocity: 0)\n            ),\n            fade: .init(\n                from: 0,\n                to: 1,\n                duration: 0.3\n            )\n        )\n        attributes.exitAnimation = .init(\n            scale: .init(\n                from: 1,\n                to: 0.4,\n                duration: 0.4,\n                spring: .init(damping: 1, initialVelocity: 0)\n            ),\n            fade: .init(\n                from: 1,\n                to: 0,\n                duration: 0.2\n            )\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString = \"Appears in the center. Fun, expressive, and rich with animations\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Service Rating\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        dataSource.append((\"Alerts & Popups\", presets))\n    }\n    \n    private mutating func setupFormPresets() {\n        var presets: [PresetDescription] = []\n        var attributes: EKAttributes\n        var description: PresetDescription\n        var descriptionString: String\n        var descriptionThumb: String\n        \n        // Preset I\n        attributes = .float\n        attributes.displayMode = displayMode\n        attributes.windowLevel = .normal\n        attributes.position = .top\n        attributes.displayDuration = .infinity\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.65,\n                spring: .init(damping: 0.8, initialVelocity: 0)\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(\n                duration: 0.65,\n                spring: .init(damping: 0.8, initialVelocity: 0)\n            )\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(\n                    duration: 0.65,\n                    spring: .init(damping: 0.8, initialVelocity: 0)\n                )\n            )\n        )\n        attributes.entryInteraction = .absorbTouches\n        attributes.screenInteraction = .dismiss\n        attributes.entryBackground = .visualEffect(style: .standard)\n        attributes.screenBackground = .color(color: .dimmedDarkBackground)\n        attributes.scroll = .enabled(\n            swipeable: false,\n            pullbackAnimation: .jolt\n        )\n        attributes.statusBar = .light\n        attributes.positionConstraints.keyboardRelation = .bind(\n            offset: .init(\n                bottom: 10,\n                screenEdgeResistance: 5\n            )\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString =\n        \"\"\"\n        Keeps 10pts offset and resist screen top edge with 5pts offset. \\\n        Dismissed with background tap.\n        \"\"\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Top Float\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset II\n        attributes = .float\n        attributes.displayMode = displayMode\n        attributes.windowLevel = .normal\n        attributes.position = .center\n        attributes.displayDuration = .infinity\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.65,\n                anchorPosition: .bottom,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(\n                duration: 0.65,\n                anchorPosition: .top,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(\n                    duration: 0.65,\n                    spring: .init(damping: 1, initialVelocity: 0)\n                )\n            )\n        )\n        attributes.entryInteraction = .absorbTouches\n        attributes.screenInteraction = .dismiss\n        attributes.entryBackground = .color(color: .standardBackground)\n        attributes.screenBackground = .color(color: .dimmedDarkBackground)\n        attributes.border = .value(\n            color: UIColor(white: 0.6, alpha: 1),\n            width: 1\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 3\n            )\n        )\n        attributes.scroll = .enabled(\n            swipeable: false,\n            pullbackAnimation: .jolt\n        )\n        attributes.statusBar = .light\n        attributes.positionConstraints.keyboardRelation = .bind(\n            offset: .init(\n                bottom: 15,\n                screenEdgeResistance: 0\n            )\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString =\n        \"\"\"\n        Keeps 15pts offset. Resists screen top edge \\\n        (Could not exceed screen top bounds when the keyboard is open). \\\n        Dismissed with background tap.\n        \"\"\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Center Float\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset III\n        attributes = .toast\n        attributes.displayMode = displayMode\n        attributes.windowLevel = .normal\n        attributes.position = .bottom\n        attributes.displayDuration = .infinity\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.65,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(\n                duration: 0.65,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(\n                    duration: 0.65,\n                    spring: .init(damping: 1, initialVelocity: 0)\n                )\n            )\n        )\n        attributes.entryInteraction = .absorbTouches\n        attributes.screenInteraction = .dismiss\n        attributes.entryBackground = .gradient(\n            gradient: .init(\n                colors: [Color.Netflix.light, Color.Netflix.dark],\n                startPoint: .zero,\n                endPoint: CGPoint(x: 1, y: 1)\n            )\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 3\n            )\n        )\n        attributes.screenBackground = .color(color: .dimmedDarkBackground)\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.statusBar = .light\n        attributes.positionConstraints.keyboardRelation = .bind(\n            offset: .init(\n                bottom: 0,\n                screenEdgeResistance: 0\n            )\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        descriptionString = \"Keeps 10pts offset and resists screen top edge. Can be dismissed using swipe.\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Bottom Toast\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        dataSource.append((\"Forms\", presets))\n    }\n    \n    private mutating func setupCustomPresets() {\n        var presets: [PresetDescription] = []\n        var attributes: EKAttributes\n        var description: PresetDescription\n        var descriptionString: String\n        var descriptionThumb: String\n        \n        // Preset I\n        attributes = .bottomFloat\n        attributes.displayMode = displayMode\n        attributes.displayDuration = .infinity\n        attributes.screenBackground = .color(color: .dimmedLightBackground)\n        attributes.entryBackground = .color(color: .white)\n        attributes.screenInteraction = .dismiss\n        attributes.entryInteraction = .absorbTouches\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.5,\n                spring: .init(damping: 1, initialVelocity: 0)\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(duration: 0.35)\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(duration: 0.35)\n            )\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 6\n            )\n        )\n        attributes.positionConstraints.size = .init(\n            width: .fill,\n            height: .ratio(value: 0.6)\n        )\n        attributes.positionConstraints.verticalOffset = 0\n        attributes.positionConstraints.safeArea = .overridden\n        attributes.statusBar = .dark\n        descriptionString = \"Navigation flow with multiple view controllers\"\n        descriptionThumb = ThumbDesc.bottomPopup.rawValue\n        description = .init(\n            with: attributes,\n            title: \"Navigation Flow\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset II\n        attributes = .bottomFloat\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.displayDuration = 3\n        attributes.screenBackground = .clear\n        attributes.entryBackground = .clear\n        attributes.screenInteraction = .forward\n        attributes.entryInteraction = .absorbTouches\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.5,\n                spring: .init(damping: 0.9, initialVelocity: 0)\n            ),\n            scale: .init(\n                from: 0.8,\n                to: 1,\n                duration: 0.5,\n                spring: .init(damping: 0.8, initialVelocity: 0)\n            ),\n            fade: .init(\n                from: 0.7,\n                to: 1,\n                duration: 0.3\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(duration: 0.5),\n            scale: .init(\n                from: 1,\n                to: 0.8,\n                duration: 0.5\n            ),\n            fade: .init(\n                from: 1,\n                to: 0,\n                duration: 0.5\n            )\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(\n                    duration: 0.3\n                ),\n                scale: .init(\n                    from: 1,\n                    to: 0.8,\n                    duration: 0.3\n                )\n            )\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 6\n            )\n        )\n        attributes.positionConstraints.verticalOffset = 10\n        attributes.positionConstraints.size = .init(\n            width: .offset(value: 20),\n            height: .intrinsic\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        attributes.statusBar = .dark\n        descriptionString = \"Customized UIViewController that is using an injected view\"\n        descriptionThumb = ThumbDesc.bottomFloat.rawValue\n        description = .init(\n            with: attributes,\n            title: \"View Controller\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        \n        // Preset III\n        attributes = .bottomFloat\n        attributes.displayMode = displayMode\n        attributes.hapticFeedbackType = .success\n        attributes.displayDuration = 3\n        attributes.screenBackground = .clear\n        attributes.entryBackground = .clear\n        attributes.screenInteraction = .forward\n        attributes.entryInteraction = .absorbTouches\n        attributes.entranceAnimation = .init(\n            translate: .init(\n                duration: 0.5,\n                spring: .init(damping: 0.9, initialVelocity: 0)\n            ),\n            scale: .init(\n                from: 0.8,\n                to: 1,\n                duration: 0.5,\n                spring: .init(damping: 0.8, initialVelocity: 0)\n            ),\n            fade: .init(\n                from: 0.7,\n                to: 1,\n                duration: 0.3\n            )\n        )\n        attributes.exitAnimation = .init(\n            translate: .init(\n                duration: 0.5\n            ),\n            scale: .init(\n                from: 1,\n                to: 0.8,\n                duration: 0.5\n            ),\n            fade: .init(\n                from: 1,\n                to: 0,\n                duration: 0.5\n            )\n        )\n        attributes.popBehavior = .animated(\n            animation: .init(\n                translate: .init(\n                    duration: 0.3\n                ),\n                scale: .init(\n                    from: 1,\n                    to: 0.8,\n                    duration: 0.3\n                )\n            )\n        )\n        attributes.shadow = .active(\n            with: .init(\n                color: .black,\n                opacity: 0.3,\n                radius: 6\n            )\n        )\n        attributes.positionConstraints.verticalOffset = 10\n        attributes.positionConstraints.size = .init(\n            width: .offset(value: 20),\n            height: .intrinsic\n        )\n        attributes.positionConstraints.maxSize = .init(\n            width: .constant(value: UIScreen.main.minEdge),\n            height: .intrinsic\n        )\n        attributes.statusBar = .ignored\n        descriptionString =\n        \"\"\"\n        Customized view that is initialized by a nib file, \\\n        it is additionally added various attributes such as round corners and a mild shadow\n        \"\"\"\n        descriptionThumb = ThumbDesc.bottomFloat.rawValue\n        description = .init(\n            with: attributes,\n            title: \"View from Nib\",\n            description: descriptionString,\n            thumb: descriptionThumb\n        )\n        presets.append(description)\n        dataSource.append((\"Custom\", presets))\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/PresetsViewController.swift",
    "content": "//\n//  PresetsViewController.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 04/14/2018.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport SwiftEntryKit\nimport UIKit\n\n/** This view controller offers presets to choose from */\nclass PresetsViewController: UIViewController {\n    \n    enum DisplayModeSegment: Int {\n        case light\n        case dark\n        case inferred\n        \n        var displayMode: EKAttributes.DisplayMode {\n            switch self {\n            case .light:\n                return .light\n            case .dark:\n                return .dark\n            case .inferred:\n                return .inferred\n            }\n        }\n    }\n    \n    // MARK: - Properties\n    \n    private var displayMode: EKAttributes.DisplayMode {\n        return PresetsDataSource.displayMode\n    }\n    \n    private var dataSource = PresetsDataSource()\n    private let tableView = UITableView()\n    @IBOutlet private var displayModeSegmentedControl: UISegmentedControl!\n    \n    override var preferredStatusBarStyle: UIStatusBarStyle {\n        switch PresetsDataSource.displayMode {\n        case .dark:\n            return .lightContent\n        case .light:\n            if #available(iOS 13, *) {\n                return .darkContent\n            } else {\n                return .default\n            }\n        case .inferred:\n            return super.preferredStatusBarStyle\n        }\n    }\n    \n    // MARK: - Lifecycle & Setup\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        setupInterfaceStyle()\n        setupTableView()\n        displayModeSegmentedControl.selectedSegmentIndex = DisplayModeSegment.inferred.rawValue\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n    \n    @IBAction private func displayModeSegmentedControlValueChanged() {\n        guard let segment = DisplayModeSegment(rawValue: displayModeSegmentedControl.selectedSegmentIndex) else {\n            return\n        }\n        PresetsDataSource.displayMode = segment.displayMode\n        dataSource.setup()\n        setupInterfaceStyle()\n        tableView.reloadData()\n    }\n    \n    private func setupInterfaceStyle() {\n        navigationController?.navigationBar.titleTextAttributes = [\n            NSAttributedString.Key.foregroundColor: EKColor.standardContent.color(\n                for: traitCollection,\n                mode: PresetsDataSource.displayMode\n            )\n        ]\n        navigationController?.navigationBar.tintColor = EKColor.navigationItemColor.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        navigationController?.navigationBar.barTintColor = EKColor.navigationBackgroundColor.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        displayModeSegmentedControl.setTitleTextAttributes(\n            [NSAttributedString.Key.foregroundColor:\n                EKColor.standardContent.color(\n                    for: traitCollection,\n                    mode: PresetsDataSource.displayMode\n                )\n            ],\n            for: .normal\n        )\n        displayModeSegmentedControl.setTitleTextAttributes(\n            [NSAttributedString.Key.foregroundColor:\n                EKColor.standardContent.color(\n                    for: traitCollection,\n                    mode: PresetsDataSource.displayMode\n                )\n            ],\n            for: .selected\n        )\n        displayModeSegmentedControl.tintColor = EKColor.selectedBackground.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        view.backgroundColor = EKColor.standardBackground.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        tableView.backgroundColor = EKColor.standardBackground.color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        tableView.separatorColor = EKColor.standardContent.with(alpha: 0.3).color(\n            for: traitCollection,\n            mode: PresetsDataSource.displayMode\n        )\n        // Just in case view-controller-based-status-bar-appearance is being tinkered with\n        UIApplication.shared.statusBarStyle = preferredStatusBarStyle\n        setNeedsStatusBarAppearanceUpdate()\n    }\n    \n    private func setupTableView() {\n        view.addSubview(tableView)\n        tableView.estimatedRowHeight = UITableView.automaticDimension\n        tableView.estimatedSectionHeaderHeight = UITableView.automaticDimension\n        tableView.register(\n            PresetTableViewCell.self,\n            forCellReuseIdentifier: PresetTableViewCell.className\n        )\n        tableView.register(\n            SelectionHeaderView.self,\n            forHeaderFooterViewReuseIdentifier: SelectionHeaderView.className\n        )\n        tableView.dataSource = self\n        tableView.delegate = self\n        tableView.fillSuperview()\n    }\n    \n    // MARK: Entry Samples\n    \n    // Bumps a standard note\n    private func showNote(attributes: EKAttributes) {\n        let text = \"Pssst! I have something to tell you...\"\n        let style = EKProperty.LabelStyle(\n            font: MainFont.light.with(size: 14),\n            color: .white,\n            alignment: .center\n        )\n        let labelContent = EKProperty.LabelContent(\n            text: text,\n            style: style\n        )\n        let contentView = EKNoteMessageView(with: labelContent)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    private func showImageNote(attributes: EKAttributes) {\n        let text = \"The thrill is gone\"\n        let style = EKProperty.LabelStyle(\n            font: MainFont.light.with(size: 14),\n            color: .white,\n            alignment: .center,\n            displayMode: displayMode\n        )\n        let labelContent = EKProperty.LabelContent(\n            text: text,\n            style: style\n        )\n        let imageContent = EKProperty.ImageContent(\n            image: UIImage(named: \"ic_wifi\")!,\n            displayMode: displayMode\n        )\n        let contentView = EKImageNoteMessageView(\n            with: labelContent,\n            imageContent: imageContent\n        )\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    private func showAnimatingImageNote(attributes: EKAttributes) {\n        let text = \"Up and charge\"\n        let style = EKProperty.LabelStyle(\n            font: MainFont.light.with(size: 14),\n            color: .black,\n            alignment: .center,\n            displayMode: displayMode\n        )\n        let labelContent = EKProperty.LabelContent(\n            text: text,\n            style: style\n        )\n        let sequence = (0...5).map { \"battery\\($0)\" }\n        let animationDuration: TimeInterval = 1\n        let animation = EKProperty.ImageContent.TransformAnimation.animate(\n            duration: animationDuration,\n            options: [.curveEaseInOut],\n            transform: .init(scaleX: 1.1, y: 1.1)\n        )\n        let imageContent = EKProperty.ImageContent(\n            imagesNames: sequence,\n            imageSequenceAnimationDuration: animationDuration,\n            displayMode: displayMode,\n            animation: animation,\n            size: CGSize(width: 16, height: 16),\n            tint: .black,\n            contentMode: .scaleAspectFit\n        )\n        let contentView = EKImageNoteMessageView(\n            with: labelContent,\n            imageContent: imageContent\n        )\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    private func showProcessingNote(attributes: EKAttributes) {\n        let text = \"Waiting for the goodies to arrive!\"\n        let style = EKProperty.LabelStyle(\n            font: MainFont.light.with(size: 14),\n            color: .white,\n            alignment: .center,\n            displayMode: displayMode\n        )\n        let labelContent = EKProperty.LabelContent(\n            text: text,\n            style: style\n        )\n        let contentView = EKProcessingNoteMessageView(\n            with: labelContent,\n            activityIndicator: .white\n        )\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    // Bumps a status bar replacement entry\n    private func showStatusBarMessage(attributes: EKAttributes) {\n        let statusBarHeight = UIApplication.shared.statusBarFrame.maxY\n        let contentView: UIView\n        let font = MainFont.light.with(size: 12)\n        let labelStyle = EKProperty.LabelStyle(\n            font: font,\n            color: .white,\n            alignment: .center,\n            displayMode: displayMode\n        )\n        if statusBarHeight > 20 {\n            let leading = EKProperty.LabelContent(\n                text: \"My 🧠\",\n                style: labelStyle\n            )\n            let trailing = EKProperty.LabelContent(\n                text: \"Wonders!\",\n                style: labelStyle\n            )\n            contentView = EKXStatusBarMessageView(\n                leading: leading,\n                trailing: trailing\n            )\n        } else {\n            let labelContent = EKProperty.LabelContent(\n                text: \"My 🧠 is doing some thinking...\",\n                style: labelStyle\n            )\n            let noteView = EKNoteMessageView(with: labelContent)\n            noteView.verticalOffset = 0\n            noteView.set(.height, of: statusBarHeight)\n            contentView = noteView\n        }\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    // Show rating view\n    private func showRatingView(attributes: EKAttributes) {\n        let unselectedImage = EKProperty.ImageContent(\n            image: UIImage(named: \"ic_star_unselected\")!.withRenderingMode(.alwaysTemplate),\n            displayMode: displayMode,\n            tint: .standardContent\n        )\n        let selectedImage = EKProperty.ImageContent(\n            image: UIImage(named: \"ic_star_selected\")!.withRenderingMode(.alwaysTemplate),\n            displayMode: displayMode,\n            tint: EKColor.ratingStar\n        )\n        let initialTitle = EKProperty.LabelContent(\n            text: \"Rate our food\",\n            style: .init(\n                font: MainFont.medium.with(size: 34),\n                color: .standardContent,\n                alignment: .center,\n                displayMode: displayMode\n            )\n        )\n        let initialDescription = EKProperty.LabelContent(\n            text: \"How was it?\",\n            style: .init(\n                font: MainFont.light.with(size: 24),\n                color: EKColor.standardContent.with(alpha: 0.5),\n                alignment: .center,\n                displayMode: displayMode\n            )\n        )\n        let items = [(\"💩\", \"Pooish!\"), (\"🤨\", \"Ahhh?!\"), (\"👍\", \"OK!\"),\n                     (\"👌\", \"Tasty!\"), (\"😋\", \"Delicius!\")].map { texts -> EKProperty.EKRatingItemContent in\n                        let itemTitle = EKProperty.LabelContent(\n                            text: texts.0,\n                            style: .init(\n                                font: MainFont.medium.with(size: 48),\n                                color: .standardContent,\n                                alignment: .center,\n                                displayMode: displayMode\n                            )\n                        )\n                        let itemDescription = EKProperty.LabelContent(\n                            text: texts.1,\n                            style: .init(\n                                font: MainFont.light.with(size: 24),\n                                color: .standardContent,\n                                alignment: .center,\n                                displayMode: displayMode\n                            )\n                        )\n                        return EKProperty.EKRatingItemContent(\n                            title: itemTitle,\n                            description: itemDescription,\n                            unselectedImage: unselectedImage,\n                            selectedImage: selectedImage\n                        )\n        }\n        \n        var message: EKRatingMessage!\n        let lightFont = MainFont.light.with(size: 20)\n        let mediumFont = MainFont.medium.with(size: 20)\n        let closeButtonLabelStyle = EKProperty.LabelStyle(\n            font: mediumFont,\n            color: .standardContent,\n            displayMode: displayMode\n        )\n        let closeButtonLabel = EKProperty.LabelContent(\n            text: \"Dismiss\",\n            style: closeButtonLabelStyle\n        )\n        let closeButton = EKProperty.ButtonContent(\n            label: closeButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: EKColor.standardBackground.with(alpha: 0.2),\n            displayMode: displayMode) {\n                SwiftEntryKit.dismiss {\n                    // Here you may perform a completion handler\n                }\n        }\n        \n        let pinkyColor = EKColor.pinky\n        let okButtonLabelStyle = EKProperty.LabelStyle(\n            font: lightFont,\n            color: pinkyColor,\n            displayMode: displayMode\n        )\n        let okButtonLabel = EKProperty.LabelContent(\n            text: \"Tell us more\",\n            style: okButtonLabelStyle\n        )\n        let okButton = EKProperty.ButtonContent(\n            label: okButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: pinkyColor.with(alpha: 0.05),\n            displayMode: displayMode) {\n                SwiftEntryKit.dismiss()\n        }\n        let buttonsBarContent = EKProperty.ButtonBarContent(\n            with: closeButton, okButton,\n            separatorColor: EKColor(light: Color.Gray.light.light, dark: Color.Gray.mid.light),\n            horizontalDistributionThreshold: 1,\n            displayMode: displayMode,\n            expandAnimatedly: true\n        )\n        message = EKRatingMessage(\n            initialTitle: initialTitle,\n            initialDescription: initialDescription,\n            ratingItems: items,\n            buttonBarContent: buttonsBarContent) { index in\n                // Rating selected - do something\n        }\n        let contentView = EKRatingMessageView(with: message)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    // Bumps a notification structured entry\n    private func showNotificationMessage(attributes: EKAttributes,\n                                         title: String,\n                                         desc: String,\n                                         textColor: EKColor,\n                                         imageName: String? = nil) {\n        let title = EKProperty.LabelContent(\n            text: title,\n            style: .init(\n                font: MainFont.medium.with(size: 16),\n                color: textColor,\n                displayMode: displayMode\n            ),\n            accessibilityIdentifier: \"title\"\n        )\n        let description = EKProperty.LabelContent(\n            text: desc,\n            style: .init(\n                font: MainFont.light.with(size: 14),\n                color: textColor,\n                displayMode: displayMode\n            ),\n            accessibilityIdentifier: \"description\"\n        )\n        var image: EKProperty.ImageContent?\n        if let imageName = imageName {\n            image = EKProperty.ImageContent(\n                image: UIImage(named: imageName)!.withRenderingMode(.alwaysTemplate),\n                displayMode: displayMode,\n                size: CGSize(width: 35, height: 35),\n                tint: textColor,\n                accessibilityIdentifier: \"thumbnail\"\n            )\n        }\n        let simpleMessage = EKSimpleMessage(\n            image: image,\n            title: title,\n            description: description\n        )\n        let notificationMessage = EKNotificationMessage(simpleMessage: simpleMessage)\n        let contentView = EKNotificationMessageView(with: notificationMessage)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    // Bumps a chat message structured entry\n    private func showChatNotificationMessage(attributes: EKAttributes) {\n        let title = EKProperty.LabelContent(\n            text: \"Madi\",\n            style: .init(\n                font: MainFont.medium.with(size: 14),\n                color: .white,\n                displayMode: displayMode\n            )\n        )\n        let description = EKProperty.LabelContent(\n            text: \"Hey! I'll come by at your office for lunch... 🍲\",\n            style: .init(\n                font: MainFont.light.with(size: 12),\n                color: .white,\n                displayMode: displayMode\n            )\n        )\n        let time = EKProperty.LabelContent(\n            text: \"09:00\",\n            style: .init(\n                font: MainFont.light.with(size: 10),\n                color: .white,\n                displayMode: displayMode\n            )\n        )\n        let image = EKProperty.ImageContent.thumb(\n            with: \"ic_madi_profile\",\n            edgeSize: 35\n        )\n        let simpleMessage = EKSimpleMessage(\n            image: image,\n            title: title,\n            description: description\n        )\n        let notificationMessage = EKNotificationMessage(\n            simpleMessage: simpleMessage,\n            auxiliary: time\n        )\n        let contentView = EKNotificationMessageView(with: notificationMessage)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    private func showDarkAwesomePopupMessage(attributes: EKAttributes) {\n        let image = UIImage(named: \"ic_done_all_dark_48pt\")!.withRenderingMode(.alwaysTemplate)\n        let title = \"Awesome!\"\n        let description =\n        \"\"\"\n        You are using SwiftEntryKit, \\\n        and this is a customized alert \\\n        view that is floating at the bottom.\n        \"\"\"\n        showPopupMessage(attributes: attributes,\n                         title: title,\n                         titleColor: .text,\n                         description: description,\n                         descriptionColor: .subText,\n                         buttonTitleColor: .white,\n                         buttonBackgroundColor: .amber,\n                         image: image)\n    }\n    \n    private func showLightAwesomePopupMessage(attributes: EKAttributes) {\n        let image = UIImage(named: \"ic_done_all_light_48pt\")!.withRenderingMode(.alwaysTemplate)\n        let title = \"Awesome!\"\n        let description = \"You are using SwiftEntryKit, and this is a pop up with important content\"\n        showPopupMessage(attributes: attributes,\n                         title: title,\n                         titleColor: .white,\n                         description: description,\n                         descriptionColor: .white,\n                         buttonTitleColor: Color.Gray.mid,\n                         buttonBackgroundColor: .white,\n                         image: image)\n    }\n    \n    private func showPopupMessage(attributes: EKAttributes,\n                                  title: String,\n                                  titleColor: EKColor,\n                                  description: String,\n                                  descriptionColor: EKColor,\n                                  buttonTitleColor: EKColor,\n                                  buttonBackgroundColor: EKColor,\n                                  image: UIImage? = nil) {\n        \n        var themeImage: EKPopUpMessage.ThemeImage?\n        \n        if let image = image {\n            themeImage = EKPopUpMessage.ThemeImage(\n                image: EKProperty.ImageContent(\n                    image: image,\n                    displayMode: displayMode,\n                    size: CGSize(width: 60, height: 60),\n                    tint: titleColor,\n                    contentMode: .scaleAspectFit\n                )\n            )\n        }\n        let title = EKProperty.LabelContent(\n            text: title,\n            style: .init(\n                font: MainFont.medium.with(size: 24),\n                color: titleColor,\n                alignment: .center,\n                displayMode: displayMode\n            ),\n            accessibilityIdentifier: \"title\"\n        )\n        let description = EKProperty.LabelContent(\n            text: description,\n            style: .init(\n                font: MainFont.light.with(size: 16),\n                color: descriptionColor,\n                alignment: .center,\n                displayMode: displayMode\n            ),\n            accessibilityIdentifier: \"description\"\n        )\n        let button = EKProperty.ButtonContent(\n            label: .init(\n                text: \"Got it!\",\n                style: .init(\n                    font: MainFont.bold.with(size: 16),\n                    color: buttonTitleColor,\n                    displayMode: displayMode\n                )\n            ),\n            backgroundColor: buttonBackgroundColor,\n            highlightedBackgroundColor: buttonTitleColor.with(alpha: 0.05),\n            displayMode: displayMode,\n            accessibilityIdentifier: \"button\"\n        )\n        let message = EKPopUpMessage(\n            themeImage: themeImage,\n            title: title,\n            description: description,\n            button: button) {\n                SwiftEntryKit.dismiss()\n        }\n        let contentView = EKPopUpMessageView(with: message)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    private func showButtonBarMessage(attributes: EKAttributes) {\n        let title = EKProperty.LabelContent(\n            text: \"Dear Reader!\",\n            style: .init(\n                font: MainFont.medium.with(size: 15),\n                color: .black,\n                displayMode: displayMode\n            ),\n            accessibilityIdentifier: \"title\"\n        )\n        let description = EKProperty.LabelContent(\n            text: \"Get your coupon for a free book now\",\n            style: .init(\n                font: MainFont.light.with(size: 13),\n                color: .black,\n                displayMode: displayMode\n            ),\n            accessibilityIdentifier: \"description\"\n        )\n        let image = EKProperty.ImageContent(\n            imageName: \"ic_books\",\n            displayMode: displayMode,\n            size: CGSize(width: 35, height: 35),\n            contentMode: .scaleAspectFit,\n            accessibilityIdentifier: \"image\"\n        )\n        let simpleMessage = EKSimpleMessage(\n            image: image,\n            title: title,\n            description: description\n        )\n        let buttonFont = MainFont.medium.with(size: 16)\n        let closeButtonLabelStyle = EKProperty.LabelStyle(\n            font: buttonFont,\n            color: Color.Gray.a800,\n            displayMode: displayMode\n        )\n        let closeButtonLabel = EKProperty.LabelContent(\n            text: \"NOT NOW\",\n            style: closeButtonLabelStyle\n        )\n        let closeButton = EKProperty.ButtonContent(\n            label: closeButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: Color.Gray.a800.with(alpha: 0.05),\n            accessibilityIdentifier: \"close-button\") {\n                SwiftEntryKit.dismiss()\n        }\n        let okButtonLabelStyle = EKProperty.LabelStyle(\n            font: buttonFont,\n            color: Color.Teal.a600,\n            displayMode: displayMode\n        )\n        let okButtonLabel = EKProperty.LabelContent(\n            text: \"LET ME HAVE IT\",\n            style: okButtonLabelStyle\n        )\n        let okButton = EKProperty.ButtonContent(\n            label: okButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: Color.Teal.a600.with(alpha: 0.05),\n            displayMode: displayMode,\n            accessibilityIdentifier: \"ok-button\") { [unowned self] in\n                var attributes = self.dataSource.bottomAlertAttributes\n                attributes.entryBackground = .color(color: Color.Teal.a600)\n                attributes.entranceAnimation = .init(\n                    translate: .init(duration: 0.65, spring: .init(damping: 0.8, initialVelocity: 0))\n                )\n                let image = UIImage(named: \"ic_success\")!\n                let title = \"Congratz!\"\n                let description = \"Your book coupon is 5w1ft3ntr1k1t\"\n                self.showPopupMessage(\n                    attributes: attributes,\n                    title: title,\n                    titleColor: .white,\n                    description: description,\n                    descriptionColor: .white,\n                    buttonTitleColor: .subText,\n                    buttonBackgroundColor: .white,\n                    image: image\n                )\n        }\n        let buttonsBarContent = EKProperty.ButtonBarContent(\n            with: closeButton, okButton,\n            separatorColor: Color.Gray.light,\n            buttonHeight: 60,\n            displayMode: displayMode,\n            expandAnimatedly: true\n        )\n        let alertMessage = EKAlertMessage(\n            simpleMessage: simpleMessage,\n            imagePosition: .left,\n            buttonBarContent: buttonsBarContent\n        )\n        let contentView = EKAlertMessageView(with: alertMessage)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    private func showAlertView(attributes: EKAttributes) {\n        let title = EKProperty.LabelContent(\n            text: \"Hopa!\",\n            style: .init(\n                font: MainFont.medium.with(size: 15),\n                color: .black,\n                alignment: .center,\n                displayMode: displayMode\n            )\n        )\n        let text =\n        \"\"\"\n        This is a system-like alert, with several buttons. \\\n        You can display even more buttons if you want. \\\n        Click on one of them to dismiss it.\n        \"\"\"\n        let description = EKProperty.LabelContent(\n            text: text,\n            style: .init(\n                font: MainFont.light.with(size: 13),\n                color: .black,\n                alignment: .center,\n                displayMode: displayMode\n            )\n        )\n        let image = EKProperty.ImageContent(\n            imageName: \"ic_apple\",\n            displayMode: displayMode,\n            size: CGSize(width: 25, height: 25),\n            contentMode: .scaleAspectFit\n        )\n        let simpleMessage = EKSimpleMessage(\n            image: image,\n            title: title,\n            description: description\n        )\n        let buttonFont = MainFont.medium.with(size: 16)\n        let closeButtonLabelStyle = EKProperty.LabelStyle(\n            font: buttonFont,\n            color: Color.Gray.a800,\n            displayMode: displayMode\n        )\n        let closeButtonLabel = EKProperty.LabelContent(\n            text: \"NOT NOW\",\n            style: closeButtonLabelStyle\n        )\n        let closeButton = EKProperty.ButtonContent(\n            label: closeButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: Color.Gray.a800.with(alpha: 0.05),\n            displayMode: displayMode) {\n                SwiftEntryKit.dismiss()\n        }\n        let laterButtonLabelStyle = EKProperty.LabelStyle(\n            font: buttonFont,\n            color: Color.Teal.a600,\n            displayMode: displayMode\n        )\n        let laterButtonLabel = EKProperty.LabelContent(\n            text: \"MAYBE LATER\",\n            style: laterButtonLabelStyle\n        )\n        let laterButton = EKProperty.ButtonContent(\n            label: laterButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: Color.Teal.a600.with(alpha: 0.05),\n            displayMode: displayMode) {\n                SwiftEntryKit.dismiss()\n        }\n        let okButtonLabelStyle = EKProperty.LabelStyle(\n            font: buttonFont,\n            color: Color.Teal.a600,\n            displayMode: displayMode\n        )\n        let okButtonLabel = EKProperty.LabelContent(\n            text: \"SHOW ME\",\n            style: okButtonLabelStyle\n        )\n        let okButton = EKProperty.ButtonContent(\n            label: okButtonLabel,\n            backgroundColor: .clear,\n            highlightedBackgroundColor: Color.Teal.a600.with(alpha: 0.05),\n            displayMode: displayMode) {\n                SwiftEntryKit.dismiss()\n        }\n        // Generate the content\n        let buttonsBarContent = EKProperty.ButtonBarContent(\n            with: okButton, laterButton, closeButton,\n            separatorColor: Color.Gray.light,\n            displayMode: displayMode,\n            expandAnimatedly: true\n        )\n        let alertMessage = EKAlertMessage(\n            simpleMessage: simpleMessage,\n            buttonBarContent: buttonsBarContent\n        )\n        let contentView = EKAlertMessageView(with: alertMessage)\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    // Bumps a navigation controller\n    private func showNavigationController(with attributes: EKAttributes) {\n        let viewController = ContactsViewController()\n        let navigationController = ExampleNavigationViewController(rootViewController: viewController)\n        SwiftEntryKit.display(entry: navigationController, using: attributes)\n    }\n    \n    // Bumps a custom nib originated view\n    private func showCustomNibView(attributes: EKAttributes) {\n        SwiftEntryKit.display(entry: NibExampleView(), using: attributes)\n    }\n    \n    // Bumps a custom view controller that is using a view from nib\n    private func showCustomViewController(attributes: EKAttributes) {\n        let viewController = ExampleViewController(with: NibExampleView())\n        SwiftEntryKit.display(entry: viewController, using: attributes)\n    }\n    \n    // Sign in form\n    private func showSigninForm(attributes: EKAttributes, style: FormStyle) {\n        let titleStyle = EKProperty.LabelStyle(\n            font: MainFont.medium.with(size: 16),\n            color: .standardContent,\n            alignment: .center,\n            displayMode: displayMode\n        )\n        let title = EKProperty.LabelContent(\n            text: \"Sign in to your account\",\n            style: titleStyle\n        )\n        let textFields = FormFieldPresetFactory.fields(\n            by: [.email, .password],\n            style: style\n        )\n        let button = EKProperty.ButtonContent(\n            label: .init(text: \"Continue\", style: style.buttonTitle),\n            backgroundColor: style.buttonBackground,\n            highlightedBackgroundColor: style.buttonBackground.with(alpha: 0.8),\n            displayMode: displayMode,\n            accessibilityIdentifier: \"continueButton\") {\n                SwiftEntryKit.dismiss()\n        }\n        let contentView = EKFormMessageView(\n            with: title,\n            textFieldsContent: textFields,\n            buttonContent: button\n        )\n        SwiftEntryKit.display(entry: contentView, using: attributes)\n    }\n    \n    // Sign up form\n    private func showSignupForm(attributes: inout EKAttributes, style: FormStyle) {\n        let titleStyle = EKProperty.LabelStyle(\n            font: MainFont.light.with(size: 14),\n            color: style.textColor,\n            displayMode: displayMode\n        )\n        let title = EKProperty.LabelContent(\n            text: \"Fill your personal details\",\n            style: titleStyle\n        )\n        let textFields = FormFieldPresetFactory.fields(\n            by: [.fullName, .mobile, .email, .password],\n            style: style\n        )\n        let button = EKProperty.ButtonContent(\n            label: .init(text: \"Continue\", style: style.buttonTitle),\n            backgroundColor: style.buttonBackground,\n            highlightedBackgroundColor: style.buttonBackground.with(alpha: 0.8),\n            displayMode: displayMode) {\n                SwiftEntryKit.dismiss()\n        }\n        let contentView = EKFormMessageView(\n            with: title,\n            textFieldsContent: textFields,\n            buttonContent: button\n        )\n        attributes.lifecycleEvents.didAppear = {\n            contentView.becomeFirstResponder(with: 0)\n        }\n        SwiftEntryKit.display(entry: contentView, using: attributes, presentInsideKeyWindow: true)\n    }\n}\n\n// MARK: - UITableViewDelegate, UITableViewDataSource\n\nextension PresetsViewController: UITableViewDelegate, UITableViewDataSource {\n    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        tableView.deselectRow(at: indexPath, animated: true)\n        let attributes = dataSource[indexPath.section, indexPath.row].attributes\n        switch indexPath.section {\n        case 0:\n            toastCellSelected(with: attributes, row: indexPath.row)\n        case 1:\n            noteCellSelected(with: attributes, row: indexPath.row)\n        case 2:\n            floatCellSelected(with: attributes, row: indexPath.row)\n        case 3:\n            popupCellSelected(with: attributes, row: indexPath.row)\n        case 4:\n            formCellSelected(with: attributes, row: indexPath.row)\n        case 5:\n            customCellSelected(with: attributes, row: indexPath.row)\n        case 6:\n            showNavigationController(with: attributes)\n        default:\n            break\n        }\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: PresetTableViewCell.className,\n                                                 for: indexPath) as! PresetTableViewCell\n        cell.presetDescription = dataSource[indexPath.section, indexPath.row]\n        cell.displayMode = PresetsDataSource.displayMode\n        return cell\n    }\n    \n    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: SelectionHeaderView.className) as! SelectionHeaderView\n        header.text = dataSource[section].title\n        header.displayMode = PresetsDataSource.displayMode\n        return header\n    }\n    \n    func numberOfSections(in tableView: UITableView) -> Int {\n        return dataSource.dataSource.count\n    }\n    \n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return dataSource[section].data.count\n    }\n    \n    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {\n        return 80\n    }\n    \n    func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {\n        return 60\n    }\n}\n\n// MARK: Selection Helpers\nextension PresetsViewController {\n    \n    private func toastCellSelected(with attributes: EKAttributes, row: Int) {\n        switch row {\n        case 0:\n            let title = \"Mail Received!\"\n            let desc = \"Daniel sent you a message\"\n            showNotificationMessage(attributes: attributes,\n                                    title: title,\n                                    desc: desc,\n                                    textColor: .white,\n                                    imageName: \"paper-plane-light\")\n        case 1:\n            showChatNotificationMessage(attributes: attributes)\n        case 2:\n            let title = \"15% Discount!\"\n            let desc = \"Receive your coupon for 15% discount at Swifty Kitty Bakery\"\n            showNotificationMessage(attributes: attributes,\n                                    title: title,\n                                    desc: desc,\n                                    textColor: .standardContent,\n                                    imageName: \"ic_pizza\")\n        case 3:\n            let title = \"Simple Notification-Like Message\"\n            let desc =\n            \"\"\"\n            Robot moustache gentleman lip warmer nefarious, lip warmer robot moustache gentleman brandy crumb catcher groomed testosterone trophy nefarious, cappuccino collector testosterone trophy top gun testosterone trophy consectetur nefarious groomed brandy gentleman lip warmer robot moustache super mario crumb catcher. Toothbrush timothy dalton goose dali, louis xiii horseshoe mark lawrenson goose wario graeme souness tricky sneezes timothy dalton toothbrush louis xiii id dali?\n            \"\"\"\n            showNotificationMessage(attributes: attributes,\n                                    title: title,\n                                    desc: desc,\n                                    textColor: .standardContent)\n        default:\n            break\n        }\n    }\n    \n    private func noteCellSelected(with attributes: EKAttributes, row: Int) {\n        switch row {\n        case 0:\n            showNote(attributes: attributes)\n        case 1:\n            showProcessingNote(attributes: attributes)\n        case 2:\n            showImageNote(attributes: attributes)\n        case 3:\n            showAnimatingImageNote(attributes: attributes)\n        case 4:\n            showStatusBarMessage(attributes: attributes)\n        case 5:\n            showNote(attributes: attributes)\n        default:\n            break\n        }\n    }\n    \n    private func floatCellSelected(with attributes: EKAttributes, row: Int) {\n        let title = \"Kofi Shop\"\n        let desc = \"Over two weeks of quality coffee beans concentrated into a single entry kit\"\n        let image = \"ic_coffee_light\"\n        switch row {\n        case 0:\n            showNotificationMessage(attributes: attributes,\n                                    title: title,\n                                    desc: desc,\n                                    textColor: .white,\n                                    imageName: image)\n        case 1:\n            showNotificationMessage(attributes: attributes,\n                                    title: title,\n                                    desc: desc,\n                                    textColor: .white,\n                                    imageName: image)\n        default:\n            break\n        }\n    }\n    \n    private func popupCellSelected(with attributes: EKAttributes, row: Int) {\n        switch row {\n        case 0:\n            showDarkAwesomePopupMessage(attributes: attributes)\n        case 1:\n            showLightAwesomePopupMessage(attributes: attributes)\n        case 2:\n            showLightAwesomePopupMessage(attributes: attributes)\n        case 3:\n            showButtonBarMessage(attributes: attributes)\n        case 4:\n            showAlertView(attributes: attributes)\n        case 5:\n            showRatingView(attributes: attributes)\n        default:\n            break\n        }\n    }\n    \n    private func formCellSelected(with attributes: EKAttributes, row: Int) {\n        switch row {\n        case 0:\n            showSigninForm(attributes: attributes, style: .light)\n        case 1:\n            var attributes = attributes\n            showSignupForm(attributes: &attributes, style: .light)\n        case 2:\n            var attributes = attributes\n            showSignupForm(attributes: &attributes, style: .metallic)\n        default:\n            break\n        }\n    }\n    \n    private func customCellSelected(with attributes: EKAttributes, row: Int) {\n        switch row {\n        case 0:\n            showNavigationController(with: attributes)\n        case 1:\n            showCustomNibView(attributes: attributes)\n        case 2:\n            showCustomViewController(attributes: attributes)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/ExampleNavigationController/ContactsViewController.swift",
    "content": "//\n//  EmbeddedViewController.swift\n//  SwiftEntryKitDemo\n//\n//  Created by Daniel Huri on 3/15/19.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport UIKit\n\nclass ContactsViewController: UIViewController {\n\n    @IBOutlet private weak var tableView: UITableView!\n    \n    private let dataSource = [\"John\", \"Gregory\", \"David\", \"Jack\", \"Tony\", \"Torvi\", \"Walter\", \"Dexter\", \"Ramsay\"]\n    \n    init() {\n        super.init(nibName: type(of: self).className, bundle: nil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        navigationItem.title = \"Contacts\"\n        tableView.register(UITableViewCell.self, forCellReuseIdentifier: \"GenericCell\")\n    }\n}\n\n// MARK: UITableViewDelegate, UITableViewDataSource\n\nextension ContactsViewController: UITableViewDelegate, UITableViewDataSource {\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return dataSource.count\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: \"GenericCell\")!\n        cell.textLabel?.text = dataSource[indexPath.row]\n        return cell\n    }\n    \n    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        tableView.deselectRow(at: indexPath, animated: true)\n        let vc = DescriptionViewController(screenTitle: dataSource[indexPath.row])\n        navigationController!.pushViewController(vc, animated: true)\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/ExampleNavigationController/ContactsViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14460.31\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14460.20\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"ContactsViewController\" customModule=\"SwiftEntryKitDemo\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"tableView\" destination=\"a9F-D5-jui\" id=\"Ytr-eE-rdD\"/>\n                <outlet property=\"view\" destination=\"i5M-Pr-FkT\" id=\"sfx-zR-JGt\"/>\n            </connections>\n        </placeholder>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"i5M-Pr-FkT\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <tableView clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"a9F-D5-jui\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"375\" height=\"647\"/>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    <connections>\n                        <outlet property=\"dataSource\" destination=\"-1\" id=\"Obc-gA-2k3\"/>\n                        <outlet property=\"delegate\" destination=\"-1\" id=\"g7G-gF-thL\"/>\n                    </connections>\n                </tableView>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"a9F-D5-jui\" firstAttribute=\"leading\" secondItem=\"fnl-2z-Ty3\" secondAttribute=\"leading\" id=\"bXB-St-HnB\"/>\n                <constraint firstItem=\"a9F-D5-jui\" firstAttribute=\"top\" secondItem=\"fnl-2z-Ty3\" secondAttribute=\"top\" id=\"dGL-sx-yUc\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"a9F-D5-jui\" secondAttribute=\"bottom\" id=\"oX5-l5-9Nb\"/>\n                <constraint firstItem=\"fnl-2z-Ty3\" firstAttribute=\"trailing\" secondItem=\"a9F-D5-jui\" secondAttribute=\"trailing\" id=\"pIB-ca-76I\"/>\n            </constraints>\n            <viewLayoutGuide key=\"safeArea\" id=\"fnl-2z-Ty3\"/>\n            <point key=\"canvasLocation\" x=\"138.40000000000001\" y=\"152.47376311844079\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/ExampleNavigationController/DescriptionViewController.swift",
    "content": "//\n//  DescriptionViewController.swift\n//  SwiftEntryKitDemo\n//\n//  Created by Daniel Huri on 3/15/19.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nclass DescriptionViewController: UIViewController {\n\n    private let screenTitle: String\n    @IBOutlet private var label: UILabel!\n    \n    init(screenTitle: String) {\n        self.screenTitle = screenTitle\n        super.init(nibName: type(of: self).className, bundle: nil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        navigationItem.title = screenTitle\n        setupInterfaceStyle()\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n    \n    private func setupInterfaceStyle() {\n        view.backgroundColor = EKColor.standardBackground.color(\n            for: traitCollection,\n            mode: .inferred\n        )\n        label.textColor = EKColor.standardContent.color(\n            for: traitCollection,\n            mode: .inferred\n        )\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/ExampleNavigationController/DescriptionViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14845\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14799.2\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"DescriptionViewController\" customModule=\"SwiftEntryKitDemo\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"label\" destination=\"FCF-vL-OXH\" id=\"RGY-Wc-haI\"/>\n                <outlet property=\"view\" destination=\"i5M-Pr-FkT\" id=\"sfx-zR-JGt\"/>\n            </connections>\n        </placeholder>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"i5M-Pr-FkT\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FCF-vL-OXH\">\n                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"335\" height=\"647\"/>\n                    <string key=\"text\">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,\n\n</string>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <nil key=\"textColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n            <constraints>\n                <constraint firstItem=\"FCF-vL-OXH\" firstAttribute=\"leading\" secondItem=\"fnl-2z-Ty3\" secondAttribute=\"leading\" constant=\"20\" id=\"IFe-c6-gpk\"/>\n                <constraint firstItem=\"fnl-2z-Ty3\" firstAttribute=\"bottom\" secondItem=\"FCF-vL-OXH\" secondAttribute=\"bottom\" constant=\"20\" id=\"dEB-7w-Cbc\"/>\n                <constraint firstItem=\"FCF-vL-OXH\" firstAttribute=\"top\" secondItem=\"fnl-2z-Ty3\" secondAttribute=\"top\" id=\"rLp-BM-e4h\"/>\n                <constraint firstItem=\"fnl-2z-Ty3\" firstAttribute=\"trailing\" secondItem=\"FCF-vL-OXH\" secondAttribute=\"trailing\" constant=\"20\" id=\"v5o-kd-lLa\"/>\n            </constraints>\n            <viewLayoutGuide key=\"safeArea\" id=\"fnl-2z-Ty3\"/>\n            <point key=\"canvasLocation\" x=\"138.40000000000001\" y=\"152.47376311844079\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/ExampleNavigationController/ExampleNavigationViewController.swift",
    "content": "//\n//  ExampleNavigationViewController.swift\n//  SwiftEntryKitDemo\n//\n//  Created by Daniel Huri on 3/15/19.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nclass ExampleNavigationViewController: UINavigationController {\n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        navigationBar.tintColor = EKColor.navigationItemColor.color(for: traitCollection, mode: .inferred)\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/ExampleViewController/ExampleViewController.swift",
    "content": "//\n//  ExampleViewController.swift\n//  SwiftEntryKitDemo\n//\n//  Created by Daniel Huri on 6/8/18.\n//  Copyright © 2018 CocoaPods. All rights reserved.\n//\n\nimport UIKit\n\nclass ExampleViewController: UIViewController {\n\n    private let injectedView: UIView\n    \n    init(with view: UIView) {\n        injectedView = view\n        super.init(nibName: nil, bundle: nil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func loadView() {\n        view = injectedView\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/NibExampleView/NibExampleView.swift",
    "content": "//\n//  NibExampleView.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nclass NibExampleView: UIView {\n    \n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        setup()\n    }\n    \n    init() {\n        super.init(frame: .zero)\n        setup()\n    }\n    \n    private func setup() {\n        fromNib()\n        clipsToBounds = true\n        layer.cornerRadius = 5\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Presets/Samples/NibExampleView/NibExampleView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14113\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14088\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"NibExampleView\" customModule=\"SwiftEntryKitDemo\" customModuleProvider=\"target\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view clipsSubviews=\"YES\" contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"120\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"audience-band-blur-518389\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4m1-eK-fCE\">\n                    <rect key=\"frame\" x=\"16\" y=\"15\" width=\"90\" height=\"90\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" priority=\"750\" constant=\"90\" id=\"2GR-mh-BCf\"/>\n                        <constraint firstAttribute=\"width\" secondItem=\"4m1-eK-fCE\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"2mn-3H-6Yj\"/>\n                        <constraint firstAttribute=\"height\" relation=\"lessThanOrEqual\" constant=\"90\" id=\"qyO-MX-yYU\"/>\n                    </constraints>\n                </imageView>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"NOW PLAYING\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uzi-I6-Y4b\">\n                    <rect key=\"frame\" x=\"118\" y=\"26\" width=\"80\" height=\"15\"/>\n                    <fontDescription key=\"fontDescription\" name=\"HelveticaNeue-Light\" family=\"Helvetica Neue\" pointSize=\"12\"/>\n                    <color key=\"textColor\" red=\"0.99999600649999998\" green=\"1\" blue=\"1\" alpha=\"0.60624464897260277\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"1000\" verticalHuggingPriority=\"251\" horizontalCompressionResistancePriority=\"1000\" text=\"Further\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ryf-7I-m6R\">\n                    <rect key=\"frame\" x=\"118\" y=\"51\" width=\"50.5\" height=\"18\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" relation=\"lessThanOrEqual\" constant=\"100\" id=\"5cr-Bv-tAx\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" name=\"HelveticaNeue-Medium\" family=\"Helvetica Neue\" pointSize=\"15\"/>\n                    <color key=\"textColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Kings of Lion\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1Ku-Ab-fMo\">\n                    <rect key=\"frame\" x=\"118\" y=\"74\" width=\"82\" height=\"17\"/>\n                    <fontDescription key=\"fontDescription\" name=\"HelveticaNeue\" family=\"Helvetica Neue\" pointSize=\"14\"/>\n                    <color key=\"textColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.50422731164383561\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <button opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"1000\" horizontalCompressionResistancePriority=\"1000\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lij-bw-5XF\">\n                    <rect key=\"frame\" x=\"292\" y=\"42\" width=\"36\" height=\"36\"/>\n                    <state key=\"normal\" image=\"ic_pause_circle_outline_white_36pt\"/>\n                </button>\n                <button opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"1000\" horizontalCompressionResistancePriority=\"1000\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zHX-T5-W7D\">\n                    <rect key=\"frame\" x=\"331\" y=\"48\" width=\"24\" height=\"24\"/>\n                    <state key=\"normal\" image=\"ic_fast_forward_white\"/>\n                </button>\n                <button opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"1000\" horizontalCompressionResistancePriority=\"1000\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"soo-Bj-Ivd\">\n                    <rect key=\"frame\" x=\"266\" y=\"48\" width=\"24\" height=\"24\"/>\n                    <state key=\"normal\" image=\"ic_fast_rewind_white\"/>\n                </button>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"0.21568627450980393\" green=\"0.22745098039215686\" blue=\"0.29803921568627451\" alpha=\"0.90333369006849318\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"soo-Bj-Ivd\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"Ryf-7I-m6R\" secondAttribute=\"trailing\" constant=\"30\" id=\"1mh-je-7qU\"/>\n                <constraint firstItem=\"soo-Bj-Ivd\" firstAttribute=\"centerY\" secondItem=\"lij-bw-5XF\" secondAttribute=\"centerY\" id=\"2FK-pu-cmQ\"/>\n                <constraint firstItem=\"lij-bw-5XF\" firstAttribute=\"centerY\" secondItem=\"4m1-eK-fCE\" secondAttribute=\"centerY\" id=\"ELT-AM-x3k\"/>\n                <constraint firstItem=\"Ryf-7I-m6R\" firstAttribute=\"top\" secondItem=\"uzi-I6-Y4b\" secondAttribute=\"bottom\" constant=\"10\" id=\"Mmy-lJ-jmc\"/>\n                <constraint firstItem=\"zHX-T5-W7D\" firstAttribute=\"centerY\" secondItem=\"lij-bw-5XF\" secondAttribute=\"centerY\" id=\"Qy6-nn-dQH\"/>\n                <constraint firstItem=\"4m1-eK-fCE\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerY\" id=\"VLq-Vi-yvM\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"4m1-eK-fCE\" secondAttribute=\"bottom\" constant=\"15\" id=\"Wwb-sG-sms\"/>\n                <constraint firstItem=\"1Ku-Ab-fMo\" firstAttribute=\"leading\" secondItem=\"Ryf-7I-m6R\" secondAttribute=\"leading\" id=\"Wx6-8k-vOn\"/>\n                <constraint firstItem=\"zHX-T5-W7D\" firstAttribute=\"leading\" secondItem=\"lij-bw-5XF\" secondAttribute=\"trailing\" constant=\"3\" id=\"bXJ-OU-eQq\"/>\n                <constraint firstItem=\"1Ku-Ab-fMo\" firstAttribute=\"top\" secondItem=\"Ryf-7I-m6R\" secondAttribute=\"bottom\" constant=\"5\" id=\"bhU-P1-E9t\"/>\n                <constraint firstItem=\"Ryf-7I-m6R\" firstAttribute=\"leading\" secondItem=\"uzi-I6-Y4b\" secondAttribute=\"leading\" id=\"l8T-rh-9sO\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"zHX-T5-W7D\" secondAttribute=\"trailing\" constant=\"20\" id=\"nsM-uz-MRl\"/>\n                <constraint firstItem=\"Ryf-7I-m6R\" firstAttribute=\"centerY\" secondItem=\"4m1-eK-fCE\" secondAttribute=\"centerY\" id=\"q5F-rv-yaD\"/>\n                <constraint firstItem=\"uzi-I6-Y4b\" firstAttribute=\"leading\" secondItem=\"4m1-eK-fCE\" secondAttribute=\"trailing\" constant=\"12\" id=\"rIq-1o-aZi\"/>\n                <constraint firstItem=\"4m1-eK-fCE\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"16\" id=\"tQA-RH-Ihz\"/>\n                <constraint firstItem=\"4m1-eK-fCE\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" constant=\"15\" id=\"uTf-x9-Rcv\"/>\n                <constraint firstItem=\"lij-bw-5XF\" firstAttribute=\"leading\" secondItem=\"soo-Bj-Ivd\" secondAttribute=\"trailing\" constant=\"2\" id=\"wf3-dK-5UO\"/>\n            </constraints>\n            <nil key=\"simulatedTopBarMetrics\"/>\n            <nil key=\"simulatedBottomBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"33.5\" y=\"335\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"audience-band-blur-518389\" width=\"400\" height=\"267\"/>\n        <image name=\"ic_fast_forward_white\" width=\"24\" height=\"24\"/>\n        <image name=\"ic_fast_rewind_white\" width=\"24\" height=\"24\"/>\n        <image name=\"ic_pause_circle_outline_white_36pt\" width=\"36\" height=\"36\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Example/SwiftEntryKit/SwiftEntryKit.h",
    "content": "//\n//  SwiftEntryKit.h\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/23/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for SwiftEntryKit.\nFOUNDATION_EXPORT double SwiftEntryKitVersionNumber;\n\n//! Project version string for SwiftEntryKit.\nFOUNDATION_EXPORT const unsigned char SwiftEntryKitVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <SwiftEntryKit/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Example/SwiftEntryKit/Utils/CGRect+Utils.swift",
    "content": "//\n//  CGRect.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/28/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nextension CGRect {\n    var minEdge: CGFloat {\n        return min(width, height)\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Utils/Font.swift",
    "content": "//\n//  Font.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/23/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\ntypealias MainFont = Font.HelveticaNeue\n\nenum Font {\n    enum HelveticaNeue: String {\n        case ultraLightItalic = \"UltraLightItalic\"\n        case medium = \"Medium\"\n        case mediumItalic = \"MediumItalic\"\n        case ultraLight = \"UltraLight\"\n        case italic = \"Italic\"\n        case light = \"Light\"\n        case thinItalic = \"ThinItalic\"\n        case lightItalic = \"LightItalic\"\n        case bold = \"Bold\"\n        case thin = \"Thin\"\n        case condensedBlack = \"CondensedBlack\"\n        case condensedBold = \"CondensedBold\"\n        case boldItalic = \"BoldItalic\"\n        \n        func with(size: CGFloat) -> UIFont {\n            return UIFont(name: \"HelveticaNeue-\\(rawValue)\", size: size)!\n        }\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Utils/Object+ClassName.swift",
    "content": "//\n//  Object+ClassName.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\nextension NSObject {\n    var className: String {\n        return String(describing: type(of: self))\n    }\n    \n    class var className: String {\n        return String(describing: self)\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Utils/UIColor+Utils.swift",
    "content": "//\n//  UIColor+Utils.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\nimport SwiftEntryKit\n\nextension UIColor {\n    static func by(r: Int, g: Int, b: Int, a: CGFloat = 1) -> UIColor {\n        let d = CGFloat(255)\n        return UIColor(red: CGFloat(r) / d, green: CGFloat(g) / d, blue: CGFloat(b) / d, alpha: a)\n    }\n    \n    convenience init(red: Int, green: Int, blue: Int) {\n        assert(red >= 0 && red <= 255, \"Invalid red component\")\n        assert(green >= 0 && green <= 255, \"Invalid green component\")\n        assert(blue >= 0 && blue <= 255, \"Invalid blue component\")\n        \n        self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)\n    }\n    \n    convenience init(rgb: Int) {\n        self.init(\n            red: (rgb >> 16) & 0xFF,\n            green: (rgb >> 8) & 0xFF,\n            blue: rgb & 0xFF\n        )\n    }\n    \n    var ekColor: EKColor {\n        return EKColor(self)\n    }\n    \n    static let dimmedLightBackground = UIColor(white: 100.0/255.0, alpha: 0.3)\n    static let dimmedDarkBackground = UIColor(white: 50.0/255.0, alpha: 0.3)\n    static let dimmedDarkestBackground = UIColor(white: 0, alpha: 0.5)\n    \n    static let pinky = UIColor(rgb: 0xE91E63)\n    static let amber = UIColor(rgb: 0xFFC107)\n    static let satCyan = UIColor(rgb: 0x00BCD4)\n    static let redish = UIColor(rgb: 0xFF5252)\n    static let greenGrass = UIColor(rgb: 0x4CAF50)\n    \n    static let chatMessageLightMode = UIColor(red: 48, green: 47, blue: 48)\n    static let chatMessageDarkMode = UIColor(red: 207, green: 208, blue: 207)\n    \n    static let textLightMode = UIColor(red: 33, green: 33, blue: 33)\n    static let textDarkMode = UIColor(red: 222, green: 222, blue: 222)\n    \n    static let subTextLightMode = UIColor(red: 117, green: 117, blue: 117)\n    static let subTextDarkMode = UIColor(red: 138, green: 138, blue: 138)\n    \n    static let musicBackgroundDark = UIColor(red: 36, green: 39, blue: 42)\n    static let musicRedish = UIColor(red: 219, green: 58, blue: 94)\n\n    static let lightNavigationBarBackground = UIColor(red: 251, green: 251, blue: 253)\n    \n    static let darkHeaderBackground = UIColor(red: 25, green: 26, blue: 25)\n    \n    static let darkSegmentedControl = UIColor(red: 55, green: 71, blue: 79)\n}\n\nextension EKColor {\n    \n    static var segmentedControlTint: EKColor {\n        return EKColor(.gray)\n    }\n    \n    static var navigationItemColor: EKColor {\n        return EKColor(light: .gray,\n                       dark: .musicRedish)\n    }\n    \n    static var navigationBackgroundColor: EKColor {\n        return EKColor(light: .lightNavigationBarBackground,\n                       dark: .black)\n    }\n\n    static var headerBackground: EKColor {\n        return EKColor(light: Color.BlueGray.c50.with(alpha: 0.95).light,\n                       dark: .darkHeaderBackground)\n    }\n    \n    static var headerText: EKColor {\n        return EKColor(.white).with(alpha: 0.95)\n    }\n    \n    static var satCyan: EKColor {\n        return EKColor(.satCyan)\n    }\n    \n    static var amber: EKColor {\n        return EKColor(.amber)\n    }\n    \n    static var pinky: EKColor {\n        return EKColor(.pinky)\n    }\n    \n    static var greenGrass: EKColor {\n        return EKColor(.greenGrass)\n    }\n    \n    static var redish: EKColor {\n        return EKColor(.redish)\n    }\n    \n    static var ratingStar: EKColor {\n        return EKColor(light: .amber,\n                       dark: .musicRedish)\n    }\n    \n    static var musicBackground: EKColor {\n        return EKColor(light: .white,\n                       dark: .musicBackgroundDark)\n    }\n    \n    static var musicText: EKColor {\n        return EKColor(light: .black,\n                       dark: .musicRedish)\n    }\n    \n    static var selectedBackground: EKColor {\n        return EKColor(light: UIColor(white: 0.9, alpha: 1),\n                       dark: UIColor(white: 0.1, alpha: 1))\n    }\n    \n    static var dimmedDarkBackground: EKColor {\n        return EKColor(light: .dimmedDarkBackground,\n                       dark: .dimmedDarkestBackground)\n    }\n    \n    static var dimmedLightBackground: EKColor {\n        return EKColor(light: .dimmedLightBackground,\n                       dark: .dimmedDarkestBackground)\n    }\n    \n    static var chatMessage: EKColor {\n        return EKColor(light: .chatMessageLightMode,\n                       dark: .chatMessageLightMode)\n    }\n    \n    static var text: EKColor {\n        return EKColor(light: .textLightMode,\n                       dark: .textDarkMode)\n    }\n    \n    static var subText: EKColor {\n        return EKColor(light: .subTextLightMode,\n                       dark: .subTextDarkMode)\n    }\n}\n\nstruct Color {\n    struct BlueGray {\n        static let c50 = EKColor(rgb: 0xeceff1)\n        static let c100 = EKColor(rgb: 0xcfd8dc)\n        static let c300 = EKColor(rgb: 0x90a4ae)\n        static let c400 = EKColor(rgb: 0x78909c)\n        static let c700 = EKColor(rgb: 0x455a64)\n        static let c800 = EKColor(rgb: 0x37474f)\n        static let c900 = EKColor(rgb: 0x263238)\n    }\n    \n    struct Netflix {\n        static let light = EKColor(rgb: 0x485563)\n        static let dark = EKColor(rgb: 0x29323c)\n    }\n    \n    struct Gray {\n        static let a800 = EKColor(rgb: 0x424242)\n        static let mid = EKColor(rgb: 0x616161)\n        static let light = EKColor(red: 230, green: 230, blue: 230)\n    }\n    \n    struct Purple {\n        static let a300 = EKColor(rgb: 0xba68c8)\n        static let a400 = EKColor(rgb: 0xab47bc)\n        static let a700 = EKColor(rgb: 0xaa00ff)\n        static let deep = EKColor(rgb: 0x673ab7)\n    }\n    \n    struct BlueGradient {\n        static let light = EKColor(red: 100, green: 172, blue: 196)\n        static let dark = EKColor(red: 27, green: 47, blue: 144)\n    }\n    \n    struct Yellow {\n        static let a700 = EKColor(rgb: 0xffd600)\n    }\n    \n    struct Teal {\n        static let a700 = EKColor(rgb: 0x00bfa5)\n        static let a600 = EKColor(rgb: 0x00897b)\n    }\n    \n    struct Orange {\n        static let a50 = EKColor(rgb: 0xfff3e0)\n    }\n    \n    struct LightBlue {\n        static let a700 = EKColor(rgb: 0x0091ea)\n    }\n    \n    struct LightPink {\n        static let first = EKColor(rgb: 0xff9a9e)\n        static let last = EKColor(rgb: 0xfad0c4)\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Utils/UIScreen+Utils.swift",
    "content": "//\n//  UIScreen+Utils.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/28/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nextension UIScreen {\n    var minEdge: CGFloat {\n        return UIScreen.main.bounds.minEdge\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit/Utils/UIView+Nib.swift",
    "content": "//\n//  UIView+Nib.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nextension UIView {\n\n    @discardableResult\n    func fromNib<T : UIView>() -> T? {\n        guard let contentView = Bundle(for: type(of: self)).loadNibNamed(type(of: self).className, owner: self, options: nil)?.first as? T else {\n            return nil\n        }\n        addSubview(contentView)\n        contentView.fillSuperview()\n        return contentView\n    }\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t142D493C223C1E7F00020ABF /* ExampleNavigationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142D493B223C1E7F00020ABF /* ExampleNavigationViewController.swift */; };\n\t\t142D4947223C1F5A00020ABF /* ContactsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142D4945223C1F5A00020ABF /* ContactsViewController.swift */; };\n\t\t142D4948223C1F5A00020ABF /* ContactsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 142D4946223C1F5A00020ABF /* ContactsViewController.xib */; };\n\t\t142D494B223C204700020ABF /* DescriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142D4949223C204700020ABF /* DescriptionViewController.swift */; };\n\t\t142D494C223C204700020ABF /* DescriptionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 142D494A223C204700020ABF /* DescriptionViewController.xib */; };\n\t\t14333AE3208FA09E00DCFC7B /* PresetDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14333AE2208FA09E00DCFC7B /* PresetDescription.swift */; };\n\t\t143C1573271C814E009A7D03 /* UIView+QuickLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143C156E271C814E009A7D03 /* UIView+QuickLayout.swift */; };\n\t\t143C1574271C814E009A7D03 /* UIViewArray+QuickLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143C156F271C814E009A7D03 /* UIViewArray+QuickLayout.swift */; };\n\t\t143C1575271C814E009A7D03 /* UIView+QLContentWrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143C1570271C814E009A7D03 /* UIView+QLContentWrap.swift */; };\n\t\t143C1576271C814E009A7D03 /* QLUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143C1571271C814E009A7D03 /* QLUtils.swift */; };\n\t\t143C1577271C814E009A7D03 /* QLCompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143C1572271C814E009A7D03 /* QLCompatibility.swift */; };\n\t\t143C6A2220B54E4A00F7DD89 /* SwiftEntryKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 143C6A2020B54E4A00F7DD89 /* SwiftEntryKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t143C6A2520B54E4A00F7DD89 /* SwiftEntryKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 143C6A1E20B54E4A00F7DD89 /* SwiftEntryKit.framework */; };\n\t\t143C6A2620B54E4A00F7DD89 /* SwiftEntryKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 143C6A1E20B54E4A00F7DD89 /* SwiftEntryKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t143F3AA22090A6A7009F3719 /* ShadowSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143F3AA12090A6A7009F3719 /* ShadowSelectionTableViewCell.swift */; };\n\t\t143F3AA42090A70E009F3719 /* RoundCornersSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143F3AA32090A70E009F3719 /* RoundCornersSelectionTableViewCell.swift */; };\n\t\t143F3AAA2090AFB8009F3719 /* BackgroundStyleSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143F3AA92090AFB8009F3719 /* BackgroundStyleSelectionTableViewCell.swift */; };\n\t\t143F3AAC2090B312009F3719 /* UserInteractionSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143F3AAB2090B312009F3719 /* UserInteractionSelectionTableViewCell.swift */; };\n\t\t143F3AAE2090B4E2009F3719 /* HapticFeedbackSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143F3AAD2090B4E2009F3719 /* HapticFeedbackSelectionTableViewCell.swift */; };\n\t\t143F3AB22090B7F0009F3719 /* ScrollSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143F3AB12090B7F0009F3719 /* ScrollSelectionTableViewCell.swift */; };\n\t\t144E51BD20D56E150051FDCA /* EKAttributes+LifecycleActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144E51BC20D56E150051FDCA /* EKAttributes+LifecycleActions.swift */; };\n\t\t145F56B820B84ACA0027EB67 /* EKAttributes+StatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145F56B720B84ACA0027EB67 /* EKAttributes+StatusBar.swift */; };\n\t\t145F56BB20B863220027EB67 /* UIApplication+EKAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145F56BA20B863220027EB67 /* UIApplication+EKAppearance.swift */; };\n\t\t1461DEFD21E0A9FC0034E08C /* EntryAppearanceDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1461DEFC21E0A9FC0034E08C /* EntryAppearanceDescriptor.swift */; };\n\t\t14665621209204A5008FB96D /* AnimationSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14665620209204A5008FB96D /* AnimationSelectionTableViewCell.swift */; };\n\t\t147A9A612092682E00A49D7A /* SelectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147A9A602092682E00A49D7A /* SelectionHeaderView.swift */; };\n\t\t147A9A6320926A7500A49D7A /* MaxWidthSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147A9A6220926A7500A49D7A /* MaxWidthSelectionTableViewCell.swift */; };\n\t\t147A9A6520926C5D00A49D7A /* HeightSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147A9A6420926C5D00A49D7A /* HeightSelectionTableViewCell.swift */; };\n\t\t1496D952209CC2AF002CBB22 /* UIView+Nib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1496D951209CC2AF002CBB22 /* UIView+Nib.swift */; };\n\t\t1496D956209CC6EF002CBB22 /* Object+ClassName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1496D955209CC6EF002CBB22 /* Object+ClassName.swift */; };\n\t\t149D0A0B20AF07EE000AA6C4 /* AttributesCreationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14CF407820AEEA6E00C744D1 /* AttributesCreationTest.swift */; };\n\t\t149D0A1220AF1EE7000AA6C4 /* FormFieldPresetFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 149D0A1120AF1EE7000AA6C4 /* FormFieldPresetFactory.swift */; };\n\t\t14A1AB3520930120001CA5B4 /* PresetsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A1AB3420930120001CA5B4 /* PresetsDataSource.swift */; };\n\t\t14A40C63208B7AA800B79474 /* PlaygroundViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A40C62208B7AA800B79474 /* PlaygroundViewController.swift */; };\n\t\t14A6AAC420CA7208005F3D81 /* ExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A6AAC320CA7208005F3D81 /* ExampleViewController.swift */; };\n\t\t14A7B11F22ECEDE8009A4265 /* EKAttributes+DisplayMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A7B11E22ECEDE8009A4265 /* EKAttributes+DisplayMode.swift */; };\n\t\t14A7B12222ECEF68009A4265 /* UIColor+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A7B12122ECEF68009A4265 /* UIColor+Utils.swift */; };\n\t\t14B3A50720C1198A002306C4 /* EKRatingMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B3A50620C1198A002306C4 /* EKRatingMessageView.swift */; };\n\t\t14B3A51220C16B64002306C4 /* EKRatingMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B3A51120C16B64002306C4 /* EKRatingMessage.swift */; };\n\t\t14B3A51420C16BAC002306C4 /* EKAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B3A51320C16BAC002306C4 /* EKAlertMessage.swift */; };\n\t\t14B3A51620C16BC3002306C4 /* EKSimpleMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B3A51520C16BC3002306C4 /* EKSimpleMessage.swift */; };\n\t\t14B3A51820C16D7A002306C4 /* EKRatingSymbolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B3A51720C16D7A002306C4 /* EKRatingSymbolView.swift */; };\n\t\t14B3A51A20C16E44002306C4 /* EKRatingSymbolsContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B3A51920C16E44002306C4 /* EKRatingSymbolsContainerView.swift */; };\n\t\t14B48B5820B81C9700CE3EF4 /* EKRootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1920B81C9700CE3EF4 /* EKRootViewController.swift */; };\n\t\t14B48B5920B81C9700CE3EF4 /* EKEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1A20B81C9700CE3EF4 /* EKEntryView.swift */; };\n\t\t14B48B5A20B81C9700CE3EF4 /* EKWindowProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1B20B81C9700CE3EF4 /* EKWindowProvider.swift */; };\n\t\t14B48B5B20B81C9700CE3EF4 /* EKWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1C20B81C9700CE3EF4 /* EKWindow.swift */; };\n\t\t14B48B5C20B81C9700CE3EF4 /* EKBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1D20B81C9700CE3EF4 /* EKBackgroundView.swift */; };\n\t\t14B48B5D20B81C9700CE3EF4 /* EKWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1E20B81C9700CE3EF4 /* EKWrapperView.swift */; };\n\t\t14B48B5E20B81C9700CE3EF4 /* EKContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B1F20B81C9700CE3EF4 /* EKContentView.swift */; };\n\t\t14B48B5F20B81C9700CE3EF4 /* EKStyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2020B81C9700CE3EF4 /* EKStyleView.swift */; };\n\t\t14B48B6020B81C9700CE3EF4 /* UIView+Responder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2220B81C9700CE3EF4 /* UIView+Responder.swift */; };\n\t\t14B48B6120B81C9700CE3EF4 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2320B81C9700CE3EF4 /* GradientView.swift */; };\n\t\t14B48B6220B81C9700CE3EF4 /* HapticFeedbackGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2420B81C9700CE3EF4 /* HapticFeedbackGenerator.swift */; };\n\t\t14B48B6320B81C9700CE3EF4 /* UIView+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2620B81C9700CE3EF4 /* UIView+Utils.swift */; };\n\t\t14B48B6420B81C9700CE3EF4 /* UIRectCorner+Short.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2720B81C9700CE3EF4 /* UIRectCorner+Short.swift */; };\n\t\t14B48B6520B81C9700CE3EF4 /* UIEdgeInsets+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2820B81C9700CE3EF4 /* UIEdgeInsets+Utils.swift */; };\n\t\t14B48B6620B81C9700CE3EF4 /* UIView+Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2920B81C9700CE3EF4 /* UIView+Shadow.swift */; };\n\t\t14B48B6720B81C9700CE3EF4 /* SwiftEntryKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2A20B81C9700CE3EF4 /* SwiftEntryKit.swift */; };\n\t\t14B48B6820B81C9700CE3EF4 /* EKProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2C20B81C9700CE3EF4 /* EKProperty.swift */; };\n\t\t14B48B6920B81C9700CE3EF4 /* EKAttributes+Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B2E20B81C9700CE3EF4 /* EKAttributes+Shadow.swift */; };\n\t\t14B48B6B20B81C9700CE3EF4 /* EKAttributes+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3020B81C9700CE3EF4 /* EKAttributes+Position.swift */; };\n\t\t14B48B6C20B81C9700CE3EF4 /* EKAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3120B81C9700CE3EF4 /* EKAttributes.swift */; };\n\t\t14B48B6D20B81C9700CE3EF4 /* EKAttributes+UserInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3220B81C9700CE3EF4 /* EKAttributes+UserInteraction.swift */; };\n\t\t14B48B6E20B81C9700CE3EF4 /* EKAttributes+Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3320B81C9700CE3EF4 /* EKAttributes+Duration.swift */; };\n\t\t14B48B6F20B81C9700CE3EF4 /* EKAttributes+Validations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3420B81C9700CE3EF4 /* EKAttributes+Validations.swift */; };\n\t\t14B48B7020B81C9700CE3EF4 /* EKAttributes+PopBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3520B81C9700CE3EF4 /* EKAttributes+PopBehavior.swift */; };\n\t\t14B48B7120B81C9700CE3EF4 /* EKAttributes+Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3620B81C9700CE3EF4 /* EKAttributes+Animation.swift */; };\n\t\t14B48B7220B81C9700CE3EF4 /* EKAttributes+PositionConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3720B81C9700CE3EF4 /* EKAttributes+PositionConstraints.swift */; };\n\t\t14B48B7320B81C9700CE3EF4 /* EKAttributes+Precedence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3820B81C9700CE3EF4 /* EKAttributes+Precedence.swift */; };\n\t\t14B48B7420B81C9700CE3EF4 /* EKAttributes+Scroll.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3920B81C9700CE3EF4 /* EKAttributes+Scroll.swift */; };\n\t\t14B48B7520B81C9700CE3EF4 /* EKAttributes+Presets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3A20B81C9700CE3EF4 /* EKAttributes+Presets.swift */; };\n\t\t14B48B7620B81C9700CE3EF4 /* EKAttributes+WindowLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3B20B81C9700CE3EF4 /* EKAttributes+WindowLevel.swift */; };\n\t\t14B48B7720B81C9700CE3EF4 /* EKAttributes+BackgroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3C20B81C9700CE3EF4 /* EKAttributes+BackgroundStyle.swift */; };\n\t\t14B48B7820B81C9700CE3EF4 /* EKAttributes+HapticFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3D20B81C9700CE3EF4 /* EKAttributes+HapticFeedback.swift */; };\n\t\t14B48B7920B81C9700CE3EF4 /* EKAttributes+FrameStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3E20B81C9700CE3EF4 /* EKAttributes+FrameStyle.swift */; };\n\t\t14B48B7A20B81C9700CE3EF4 /* EKPopUpMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B3F20B81C9700CE3EF4 /* EKPopUpMessage.swift */; };\n\t\t14B48B7B20B81C9700CE3EF4 /* EKNotificationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4020B81C9700CE3EF4 /* EKNotificationMessage.swift */; };\n\t\t14B48B7C20B81C9700CE3EF4 /* EKNotificationMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4220B81C9700CE3EF4 /* EKNotificationMessageView.swift */; };\n\t\t14B48B7D20B81C9700CE3EF4 /* EKAlertMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4320B81C9700CE3EF4 /* EKAlertMessageView.swift */; };\n\t\t14B48B7E20B81C9700CE3EF4 /* EKSimpleMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4420B81C9700CE3EF4 /* EKSimpleMessageView.swift */; };\n\t\t14B48B7F20B81C9700CE3EF4 /* EKImageNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4620B81C9700CE3EF4 /* EKImageNoteMessageView.swift */; };\n\t\t14B48B8020B81C9700CE3EF4 /* EKNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4720B81C9700CE3EF4 /* EKNoteMessageView.swift */; };\n\t\t14B48B8120B81C9700CE3EF4 /* EKXStatusBarMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4820B81C9700CE3EF4 /* EKXStatusBarMessageView.swift */; };\n\t\t14B48B8220B81C9700CE3EF4 /* EKAccessoryNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4920B81C9700CE3EF4 /* EKAccessoryNoteMessageView.swift */; };\n\t\t14B48B8320B81C9700CE3EF4 /* EKProcessingNoteMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4A20B81C9700CE3EF4 /* EKProcessingNoteMessageView.swift */; };\n\t\t14B48B8420B81C9700CE3EF4 /* EKFormMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4B20B81C9700CE3EF4 /* EKFormMessageView.swift */; };\n\t\t14B48B8520B81C9700CE3EF4 /* EKTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4D20B81C9700CE3EF4 /* EKTextField.swift */; };\n\t\t14B48B8620B81C9700CE3EF4 /* EKButtonBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4E20B81C9700CE3EF4 /* EKButtonBarView.swift */; };\n\t\t14B48B8720B81C9700CE3EF4 /* EKPopUpMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B4F20B81C9700CE3EF4 /* EKPopUpMessageView.swift */; };\n\t\t14B48B8820B81C9700CE3EF4 /* EKMessageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B48B5020B81C9700CE3EF4 /* EKMessageContentView.swift */; };\n\t\t14C729D5209476A90060D267 /* BorderSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C729D4209476A90060D267 /* BorderSelectionTableViewCell.swift */; };\n\t\t14C729D7209496180060D267 /* CGRect+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C729D6209496180060D267 /* CGRect+Utils.swift */; };\n\t\t14C729D9209496730060D267 /* UIScreen+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C729D8209496730060D267 /* UIScreen+Utils.swift */; };\n\t\t14C75E082096430D0002465E /* PrioritySelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C75E072096430D0002465E /* PrioritySelectionTableViewCell.swift */; };\n\t\t14C894F8208E70D5003D8CE3 /* SelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C894F6208E70D5003D8CE3 /* SelectionTableViewCell.swift */; };\n\t\t14C894FB208E79B8003D8CE3 /* EntryAttributeWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C894FA208E79B8003D8CE3 /* EntryAttributeWrapper.swift */; };\n\t\t14C894FE208E7DDE003D8CE3 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C894FD208E7DDE003D8CE3 /* Font.swift */; };\n\t\t14C89500208E81BF003D8CE3 /* PositionSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C894FF208E81BF003D8CE3 /* PositionSelectionTableViewCell.swift */; };\n\t\t14C89502208E83AA003D8CE3 /* WindowLevelSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C89501208E83AA003D8CE3 /* WindowLevelSelectionTableViewCell.swift */; };\n\t\t14C89504208E870C003D8CE3 /* DisplayDurationSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C89503208E870C003D8CE3 /* DisplayDurationSelectionTableViewCell.swift */; };\n\t\t14D18CCD2090FE970019AE7F /* SafeAreaSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D18CCC2090FE970019AE7F /* SafeAreaSelectionTableViewCell.swift */; };\n\t\t14D18CCF209105290019AE7F /* WidthSelectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D18CCE209105290019AE7F /* WidthSelectionTableViewCell.swift */; };\n\t\t14D18CD2209118DA0019AE7F /* NibExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D18CD1209118DA0019AE7F /* NibExampleView.swift */; };\n\t\t14D18CD4209118E90019AE7F /* NibExampleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 14D18CD3209118E90019AE7F /* NibExampleView.xib */; };\n\t\t14DF7B6A21BBCD4D0058B2BB /* EKButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DF7B6921BBCD4D0058B2BB /* EKButtonView.swift */; };\n\t\t14E24A1D208B600E00F32B13 /* UIColor+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E24A1C208B600E00F32B13 /* UIColor+Utils.swift */; };\n\t\t14E59DBE22E49C0D0080AB4F /* EKColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E59DBD22E49C0D0080AB4F /* EKColor.swift */; };\n\t\t14F36800208B585E001E8F56 /* PresetsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F367FE208B585E001E8F56 /* PresetsViewController.swift */; };\n\t\t14F36801208B585E001E8F56 /* PresetTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F367FF208B585E001E8F56 /* PresetTableViewCell.swift */; };\n\t\t14F3FD86213A6ED900CA3010 /* EntryCachingHeuristic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F3FD85213A6ED900CA3010 /* EntryCachingHeuristic.swift */; };\n\t\t607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; };\n\t\t607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; };\n\t\t607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; };\n\t\t607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; };\n\t\tC207011E12B68340B41AED68 /* Pods_SwiftEntryKitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7287A554A48DB0976C7AA96F /* Pods_SwiftEntryKitTests.framework */; };\n\t\tED3C4B61645C539D4E1B2C91 /* Pods_SwiftEntryKitDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 39B9C8169640826800BA255C /* Pods_SwiftEntryKitDemo.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t143C6A2320B54E4A00F7DD89 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 607FACC81AFB9204008FA782 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 143C6A1D20B54E4A00F7DD89;\n\t\t\tremoteInfo = SwiftEntryKit;\n\t\t};\n\t\t607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 607FACC81AFB9204008FA782 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 607FACCF1AFB9204008FA782;\n\t\t\tremoteInfo = SwiftEntryKit;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t143C6A2A20B54E4A00F7DD89 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t143C6A2620B54E4A00F7DD89 /* SwiftEntryKit.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t0A7410C89E315570D823186E /* Pods-SwiftEntryKitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-SwiftEntryKitTests.release.xcconfig\"; path = \"Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t12AB00853602FB01F90EB33D /* Pods-SwiftEntryKitDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-SwiftEntryKitDemo.debug.xcconfig\"; path = \"Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t142D493B223C1E7F00020ABF /* ExampleNavigationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleNavigationViewController.swift; sourceTree = \"<group>\"; };\n\t\t142D4945223C1F5A00020ABF /* ContactsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsViewController.swift; sourceTree = \"<group>\"; };\n\t\t142D4946223C1F5A00020ABF /* ContactsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ContactsViewController.xib; sourceTree = \"<group>\"; };\n\t\t142D4949223C204700020ABF /* DescriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionViewController.swift; sourceTree = \"<group>\"; };\n\t\t142D494A223C204700020ABF /* DescriptionViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DescriptionViewController.xib; sourceTree = \"<group>\"; };\n\t\t1430769C20B5E5970069BA1B /* QuickLayout.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLayout.framework; path = ../Carthage/Build/iOS/QuickLayout.framework; sourceTree = \"<group>\"; };\n\t\t14333AE2208FA09E00DCFC7B /* PresetDescription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresetDescription.swift; sourceTree = \"<group>\"; };\n\t\t143C156E271C814E009A7D03 /* UIView+QuickLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+QuickLayout.swift\"; sourceTree = \"<group>\"; };\n\t\t143C156F271C814E009A7D03 /* UIViewArray+QuickLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIViewArray+QuickLayout.swift\"; sourceTree = \"<group>\"; };\n\t\t143C1570271C814E009A7D03 /* UIView+QLContentWrap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+QLContentWrap.swift\"; sourceTree = \"<group>\"; };\n\t\t143C1571271C814E009A7D03 /* QLUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QLUtils.swift; sourceTree = \"<group>\"; };\n\t\t143C1572271C814E009A7D03 /* QLCompatibility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QLCompatibility.swift; sourceTree = \"<group>\"; };\n\t\t143C6A1E20B54E4A00F7DD89 /* SwiftEntryKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftEntryKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t143C6A2020B54E4A00F7DD89 /* SwiftEntryKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftEntryKit.h; sourceTree = \"<group>\"; };\n\t\t143C6A2120B54E4A00F7DD89 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t143F3AA12090A6A7009F3719 /* ShadowSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t143F3AA32090A70E009F3719 /* RoundCornersSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundCornersSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t143F3AA92090AFB8009F3719 /* BackgroundStyleSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundStyleSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t143F3AAB2090B312009F3719 /* UserInteractionSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInteractionSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t143F3AAD2090B4E2009F3719 /* HapticFeedbackSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HapticFeedbackSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t143F3AB12090B7F0009F3719 /* ScrollSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t144E51BC20D56E150051FDCA /* EKAttributes+LifecycleActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+LifecycleActions.swift\"; sourceTree = \"<group>\"; };\n\t\t14580CCA20B7F4FB001AF703 /* DemoAppInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = DemoAppInfo.plist; sourceTree = \"<group>\"; };\n\t\t145F56B720B84ACA0027EB67 /* EKAttributes+StatusBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+StatusBar.swift\"; sourceTree = \"<group>\"; };\n\t\t145F56BA20B863220027EB67 /* UIApplication+EKAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIApplication+EKAppearance.swift\"; sourceTree = \"<group>\"; };\n\t\t1461DEFC21E0A9FC0034E08C /* EntryAppearanceDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryAppearanceDescriptor.swift; sourceTree = \"<group>\"; };\n\t\t14665620209204A5008FB96D /* AnimationSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t147A9A602092682E00A49D7A /* SelectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectionHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t147A9A6220926A7500A49D7A /* MaxWidthSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaxWidthSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t147A9A6420926C5D00A49D7A /* HeightSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeightSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t1496D951209CC2AF002CBB22 /* UIView+Nib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIView+Nib.swift\"; sourceTree = \"<group>\"; };\n\t\t1496D955209CC6EF002CBB22 /* Object+ClassName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"Object+ClassName.swift\"; sourceTree = \"<group>\"; };\n\t\t1496D957209CC860002CBB22 /* CREDITS.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = CREDITS.md; path = ../CREDITS.md; sourceTree = \"<group>\"; };\n\t\t149D0A1120AF1EE7000AA6C4 /* FormFieldPresetFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormFieldPresetFactory.swift; sourceTree = \"<group>\"; };\n\t\t14A1AB3420930120001CA5B4 /* PresetsDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresetsDataSource.swift; sourceTree = \"<group>\"; };\n\t\t14A40C62208B7AA800B79474 /* PlaygroundViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaygroundViewController.swift; sourceTree = \"<group>\"; };\n\t\t14A6AAC320CA7208005F3D81 /* ExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t14A7B11E22ECEDE8009A4265 /* EKAttributes+DisplayMode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+DisplayMode.swift\"; sourceTree = \"<group>\"; };\n\t\t14A7B12122ECEF68009A4265 /* UIColor+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIColor+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t14B0B95020B7E4FE00D24D8A /* QuickLayout.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLayout.framework; path = \"../../../Library/Developer/Xcode/DerivedData/QuickLayout-aotxzuhsyjyfzgcifoglldyfgnnw/Build/Products/Debug-iphonesimulator/QuickLayout-iOS/QuickLayout.framework\"; sourceTree = \"<group>\"; };\n\t\t14B3A50620C1198A002306C4 /* EKRatingMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKRatingMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B3A51120C16B64002306C4 /* EKRatingMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKRatingMessage.swift; sourceTree = \"<group>\"; };\n\t\t14B3A51320C16BAC002306C4 /* EKAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKAlertMessage.swift; sourceTree = \"<group>\"; };\n\t\t14B3A51520C16BC3002306C4 /* EKSimpleMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKSimpleMessage.swift; sourceTree = \"<group>\"; };\n\t\t14B3A51720C16D7A002306C4 /* EKRatingSymbolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKRatingSymbolView.swift; sourceTree = \"<group>\"; };\n\t\t14B3A51920C16E44002306C4 /* EKRatingSymbolsContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKRatingSymbolsContainerView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1920B81C9700CE3EF4 /* EKRootViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKRootViewController.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1A20B81C9700CE3EF4 /* EKEntryView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKEntryView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1B20B81C9700CE3EF4 /* EKWindowProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKWindowProvider.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1C20B81C9700CE3EF4 /* EKWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKWindow.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1D20B81C9700CE3EF4 /* EKBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKBackgroundView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1E20B81C9700CE3EF4 /* EKWrapperView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKWrapperView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B1F20B81C9700CE3EF4 /* EKContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKContentView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B2020B81C9700CE3EF4 /* EKStyleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKStyleView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B2220B81C9700CE3EF4 /* UIView+Responder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+Responder.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B2320B81C9700CE3EF4 /* GradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B2420B81C9700CE3EF4 /* HapticFeedbackGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HapticFeedbackGenerator.swift; sourceTree = \"<group>\"; };\n\t\t14B48B2620B81C9700CE3EF4 /* UIView+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B2720B81C9700CE3EF4 /* UIRectCorner+Short.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIRectCorner+Short.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B2820B81C9700CE3EF4 /* UIEdgeInsets+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIEdgeInsets+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B2920B81C9700CE3EF4 /* UIView+Shadow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+Shadow.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B2A20B81C9700CE3EF4 /* SwiftEntryKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftEntryKit.swift; sourceTree = \"<group>\"; };\n\t\t14B48B2C20B81C9700CE3EF4 /* EKProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKProperty.swift; sourceTree = \"<group>\"; };\n\t\t14B48B2E20B81C9700CE3EF4 /* EKAttributes+Shadow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Shadow.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3020B81C9700CE3EF4 /* EKAttributes+Position.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Position.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3120B81C9700CE3EF4 /* EKAttributes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKAttributes.swift; sourceTree = \"<group>\"; };\n\t\t14B48B3220B81C9700CE3EF4 /* EKAttributes+UserInteraction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+UserInteraction.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3320B81C9700CE3EF4 /* EKAttributes+Duration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Duration.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3420B81C9700CE3EF4 /* EKAttributes+Validations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Validations.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3520B81C9700CE3EF4 /* EKAttributes+PopBehavior.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+PopBehavior.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3620B81C9700CE3EF4 /* EKAttributes+Animation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Animation.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3720B81C9700CE3EF4 /* EKAttributes+PositionConstraints.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+PositionConstraints.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3820B81C9700CE3EF4 /* EKAttributes+Precedence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Precedence.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3920B81C9700CE3EF4 /* EKAttributes+Scroll.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Scroll.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3A20B81C9700CE3EF4 /* EKAttributes+Presets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+Presets.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3B20B81C9700CE3EF4 /* EKAttributes+WindowLevel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+WindowLevel.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3C20B81C9700CE3EF4 /* EKAttributes+BackgroundStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+BackgroundStyle.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3D20B81C9700CE3EF4 /* EKAttributes+HapticFeedback.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+HapticFeedback.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3E20B81C9700CE3EF4 /* EKAttributes+FrameStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"EKAttributes+FrameStyle.swift\"; sourceTree = \"<group>\"; };\n\t\t14B48B3F20B81C9700CE3EF4 /* EKPopUpMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKPopUpMessage.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4020B81C9700CE3EF4 /* EKNotificationMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKNotificationMessage.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4220B81C9700CE3EF4 /* EKNotificationMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKNotificationMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4320B81C9700CE3EF4 /* EKAlertMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKAlertMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4420B81C9700CE3EF4 /* EKSimpleMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKSimpleMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4620B81C9700CE3EF4 /* EKImageNoteMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKImageNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4720B81C9700CE3EF4 /* EKNoteMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4820B81C9700CE3EF4 /* EKXStatusBarMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKXStatusBarMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4920B81C9700CE3EF4 /* EKAccessoryNoteMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKAccessoryNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4A20B81C9700CE3EF4 /* EKProcessingNoteMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKProcessingNoteMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4B20B81C9700CE3EF4 /* EKFormMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKFormMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4D20B81C9700CE3EF4 /* EKTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKTextField.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4E20B81C9700CE3EF4 /* EKButtonBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKButtonBarView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B4F20B81C9700CE3EF4 /* EKPopUpMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKPopUpMessageView.swift; sourceTree = \"<group>\"; };\n\t\t14B48B5020B81C9700CE3EF4 /* EKMessageContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKMessageContentView.swift; sourceTree = \"<group>\"; };\n\t\t14C729D4209476A90060D267 /* BorderSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14C729D6209496180060D267 /* CGRect+Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"CGRect+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t14C729D8209496730060D267 /* UIScreen+Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIScreen+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t14C75E072096430D0002465E /* PrioritySelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrioritySelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14C894F6208E70D5003D8CE3 /* SelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14C894FA208E79B8003D8CE3 /* EntryAttributeWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryAttributeWrapper.swift; sourceTree = \"<group>\"; };\n\t\t14C894FD208E7DDE003D8CE3 /* Font.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Font.swift; sourceTree = \"<group>\"; };\n\t\t14C894FF208E81BF003D8CE3 /* PositionSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14C89501208E83AA003D8CE3 /* WindowLevelSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowLevelSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14C89503208E870C003D8CE3 /* DisplayDurationSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayDurationSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14CF407720AEC75F00C744D1 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CHANGELOG.md; path = ../CHANGELOG.md; sourceTree = \"<group>\"; };\n\t\t14CF407820AEEA6E00C744D1 /* AttributesCreationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributesCreationTest.swift; sourceTree = \"<group>\"; };\n\t\t14D18CCC2090FE970019AE7F /* SafeAreaSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14D18CCE209105290019AE7F /* WidthSelectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidthSelectionTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14D18CD1209118DA0019AE7F /* NibExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibExampleView.swift; sourceTree = \"<group>\"; };\n\t\t14D18CD3209118E90019AE7F /* NibExampleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NibExampleView.xib; sourceTree = \"<group>\"; };\n\t\t14DF7B6921BBCD4D0058B2BB /* EKButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EKButtonView.swift; sourceTree = \"<group>\"; };\n\t\t14E24A1C208B600E00F32B13 /* UIColor+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIColor+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\t14E59DBD22E49C0D0080AB4F /* EKColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EKColor.swift; sourceTree = \"<group>\"; };\n\t\t14F367FE208B585E001E8F56 /* PresetsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresetsViewController.swift; sourceTree = \"<group>\"; };\n\t\t14F367FF208B585E001E8F56 /* PresetTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresetTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t14F3FD85213A6ED900CA3010 /* EntryCachingHeuristic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryCachingHeuristic.swift; sourceTree = \"<group>\"; };\n\t\t2953CEDC51190E5442C4A150 /* Pods-SwiftEntryKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-SwiftEntryKitTests.debug.xcconfig\"; path = \"Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t2A856CAE48665E23BC76CB3B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = \"<group>\"; };\n\t\t39B9C8169640826800BA255C /* Pods_SwiftEntryKitDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SwiftEntryKitDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t607FACD01AFB9204008FA782 /* SwiftEntryKitDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftEntryKitDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t607FACE51AFB9204008FA782 /* SwiftEntryKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftEntryKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t7287A554A48DB0976C7AA96F /* Pods_SwiftEntryKitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SwiftEntryKitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCAFB554B7EC0872395B9099A /* Pods-SwiftEntryKitDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-SwiftEntryKitDemo.release.xcconfig\"; path = \"Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tEFEC60E1244126F18ABBB375 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = \"<group>\"; };\n\t\tF1F450C1E75BEC09B67F526C /* SwiftEntryKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = SwiftEntryKit.podspec; path = ../SwiftEntryKit.podspec; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t143C6A1A20B54E4A00F7DD89 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t607FACCD1AFB9204008FA782 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t143C6A2520B54E4A00F7DD89 /* SwiftEntryKit.framework in Frameworks */,\n\t\t\t\tED3C4B61645C539D4E1B2C91 /* Pods_SwiftEntryKitDemo.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t607FACE21AFB9204008FA782 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC207011E12B68340B41AED68 /* Pods_SwiftEntryKitTests.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t142D4944223C1F1B00020ABF /* ExampleNavigationController */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t142D493B223C1E7F00020ABF /* ExampleNavigationViewController.swift */,\n\t\t\t\t142D4945223C1F5A00020ABF /* ContactsViewController.swift */,\n\t\t\t\t142D4946223C1F5A00020ABF /* ContactsViewController.xib */,\n\t\t\t\t142D4949223C204700020ABF /* DescriptionViewController.swift */,\n\t\t\t\t142D494A223C204700020ABF /* DescriptionViewController.xib */,\n\t\t\t);\n\t\t\tpath = ExampleNavigationController;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t143C156D271C814E009A7D03 /* QuickLayout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t143C156E271C814E009A7D03 /* UIView+QuickLayout.swift */,\n\t\t\t\t143C156F271C814E009A7D03 /* UIViewArray+QuickLayout.swift */,\n\t\t\t\t143C1570271C814E009A7D03 /* UIView+QLContentWrap.swift */,\n\t\t\t\t143C1571271C814E009A7D03 /* QLUtils.swift */,\n\t\t\t\t143C1572271C814E009A7D03 /* QLCompatibility.swift */,\n\t\t\t);\n\t\t\tpath = QuickLayout;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t143C6A1F20B54E4A00F7DD89 /* SwiftEntryKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t143C6A2020B54E4A00F7DD89 /* SwiftEntryKit.h */,\n\t\t\t\t143C6A2120B54E4A00F7DD89 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = SwiftEntryKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t149B2B57208F0C22007C829F /* Presets */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14C729C6209447CA0060D267 /* Samples */,\n\t\t\t\t14F367FE208B585E001E8F56 /* PresetsViewController.swift */,\n\t\t\t\t14F367FF208B585E001E8F56 /* PresetTableViewCell.swift */,\n\t\t\t\t149D0A1120AF1EE7000AA6C4 /* FormFieldPresetFactory.swift */,\n\t\t\t\t14A1AB36209371A5001CA5B4 /* PresetsData */,\n\t\t\t);\n\t\t\tpath = Presets;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A1AB36209371A5001CA5B4 /* PresetsData */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A1AB3420930120001CA5B4 /* PresetsDataSource.swift */,\n\t\t\t\t14333AE2208FA09E00DCFC7B /* PresetDescription.swift */,\n\t\t\t);\n\t\t\tpath = PresetsData;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14A6AABB20CA71D9005F3D81 /* ExampleViewController */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14A6AAC320CA7208005F3D81 /* ExampleViewController.swift */,\n\t\t\t);\n\t\t\tpath = ExampleViewController;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B1720B81C9700CE3EF4 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B1820B81C9700CE3EF4 /* Infra */,\n\t\t\t\t14B48B2120B81C9700CE3EF4 /* Utils */,\n\t\t\t\t14B48B2520B81C9700CE3EF4 /* Extensions */,\n\t\t\t\t14B48B2A20B81C9700CE3EF4 /* SwiftEntryKit.swift */,\n\t\t\t\t14B48B2B20B81C9700CE3EF4 /* Model */,\n\t\t\t\t14B48B4120B81C9700CE3EF4 /* MessageViews */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tpath = ../Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B1820B81C9700CE3EF4 /* Infra */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14F3FD85213A6ED900CA3010 /* EntryCachingHeuristic.swift */,\n\t\t\t\t14B48B1B20B81C9700CE3EF4 /* EKWindowProvider.swift */,\n\t\t\t\t14B48B1C20B81C9700CE3EF4 /* EKWindow.swift */,\n\t\t\t\t14B48B1920B81C9700CE3EF4 /* EKRootViewController.swift */,\n\t\t\t\t14B48B1A20B81C9700CE3EF4 /* EKEntryView.swift */,\n\t\t\t\t14B48B1D20B81C9700CE3EF4 /* EKBackgroundView.swift */,\n\t\t\t\t14B48B1E20B81C9700CE3EF4 /* EKWrapperView.swift */,\n\t\t\t\t14B48B1F20B81C9700CE3EF4 /* EKContentView.swift */,\n\t\t\t\t14B48B2020B81C9700CE3EF4 /* EKStyleView.swift */,\n\t\t\t);\n\t\t\tpath = Infra;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B2120B81C9700CE3EF4 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B2220B81C9700CE3EF4 /* UIView+Responder.swift */,\n\t\t\t\t14B48B2320B81C9700CE3EF4 /* GradientView.swift */,\n\t\t\t\t14B48B2420B81C9700CE3EF4 /* HapticFeedbackGenerator.swift */,\n\t\t\t);\n\t\t\tpath = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B2520B81C9700CE3EF4 /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t143C156D271C814E009A7D03 /* QuickLayout */,\n\t\t\t\t14B48B2620B81C9700CE3EF4 /* UIView+Utils.swift */,\n\t\t\t\t14B48B2720B81C9700CE3EF4 /* UIRectCorner+Short.swift */,\n\t\t\t\t14B48B2820B81C9700CE3EF4 /* UIEdgeInsets+Utils.swift */,\n\t\t\t\t14B48B2920B81C9700CE3EF4 /* UIView+Shadow.swift */,\n\t\t\t\t145F56BA20B863220027EB67 /* UIApplication+EKAppearance.swift */,\n\t\t\t\t14A7B12122ECEF68009A4265 /* UIColor+Utils.swift */,\n\t\t\t);\n\t\t\tpath = Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B2B20B81C9700CE3EF4 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B2D20B81C9700CE3EF4 /* EntryAttributes */,\n\t\t\t\t14B48B2C20B81C9700CE3EF4 /* EKProperty.swift */,\n\t\t\t\t14B48B3F20B81C9700CE3EF4 /* EKPopUpMessage.swift */,\n\t\t\t\t14B48B4020B81C9700CE3EF4 /* EKNotificationMessage.swift */,\n\t\t\t\t14B3A51320C16BAC002306C4 /* EKAlertMessage.swift */,\n\t\t\t\t14B3A51520C16BC3002306C4 /* EKSimpleMessage.swift */,\n\t\t\t\t14B3A51120C16B64002306C4 /* EKRatingMessage.swift */,\n\t\t\t\t14E59DBD22E49C0D0080AB4F /* EKColor.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B2D20B81C9700CE3EF4 /* EntryAttributes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B3120B81C9700CE3EF4 /* EKAttributes.swift */,\n\t\t\t\t14A7B11E22ECEDE8009A4265 /* EKAttributes+DisplayMode.swift */,\n\t\t\t\t144E51BC20D56E150051FDCA /* EKAttributes+LifecycleActions.swift */,\n\t\t\t\t14B48B3620B81C9700CE3EF4 /* EKAttributes+Animation.swift */,\n\t\t\t\t14B48B3C20B81C9700CE3EF4 /* EKAttributes+BackgroundStyle.swift */,\n\t\t\t\t14B48B3820B81C9700CE3EF4 /* EKAttributes+Precedence.swift */,\n\t\t\t\t14B48B3320B81C9700CE3EF4 /* EKAttributes+Duration.swift */,\n\t\t\t\t14B48B3E20B81C9700CE3EF4 /* EKAttributes+FrameStyle.swift */,\n\t\t\t\t14B48B3D20B81C9700CE3EF4 /* EKAttributes+HapticFeedback.swift */,\n\t\t\t\t14B48B3520B81C9700CE3EF4 /* EKAttributes+PopBehavior.swift */,\n\t\t\t\t14B48B3020B81C9700CE3EF4 /* EKAttributes+Position.swift */,\n\t\t\t\t14B48B3720B81C9700CE3EF4 /* EKAttributes+PositionConstraints.swift */,\n\t\t\t\t14B48B3A20B81C9700CE3EF4 /* EKAttributes+Presets.swift */,\n\t\t\t\t14B48B3920B81C9700CE3EF4 /* EKAttributes+Scroll.swift */,\n\t\t\t\t14B48B2E20B81C9700CE3EF4 /* EKAttributes+Shadow.swift */,\n\t\t\t\t145F56B720B84ACA0027EB67 /* EKAttributes+StatusBar.swift */,\n\t\t\t\t14B48B3220B81C9700CE3EF4 /* EKAttributes+UserInteraction.swift */,\n\t\t\t\t14B48B3420B81C9700CE3EF4 /* EKAttributes+Validations.swift */,\n\t\t\t\t14B48B3B20B81C9700CE3EF4 /* EKAttributes+WindowLevel.swift */,\n\t\t\t);\n\t\t\tpath = EntryAttributes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B4120B81C9700CE3EF4 /* MessageViews */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B4C20B81C9700CE3EF4 /* MessagesUtils */,\n\t\t\t\t14B48B4520B81C9700CE3EF4 /* Notes */,\n\t\t\t\t14B48B4220B81C9700CE3EF4 /* EKNotificationMessageView.swift */,\n\t\t\t\t14B48B4320B81C9700CE3EF4 /* EKAlertMessageView.swift */,\n\t\t\t\t14B48B4420B81C9700CE3EF4 /* EKSimpleMessageView.swift */,\n\t\t\t\t14B48B4B20B81C9700CE3EF4 /* EKFormMessageView.swift */,\n\t\t\t\t14B48B4F20B81C9700CE3EF4 /* EKPopUpMessageView.swift */,\n\t\t\t\t14B48B5020B81C9700CE3EF4 /* EKMessageContentView.swift */,\n\t\t\t\t14B3A50620C1198A002306C4 /* EKRatingMessageView.swift */,\n\t\t\t);\n\t\t\tpath = MessageViews;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B4520B81C9700CE3EF4 /* Notes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B4620B81C9700CE3EF4 /* EKImageNoteMessageView.swift */,\n\t\t\t\t14B48B4720B81C9700CE3EF4 /* EKNoteMessageView.swift */,\n\t\t\t\t14B48B4820B81C9700CE3EF4 /* EKXStatusBarMessageView.swift */,\n\t\t\t\t14B48B4920B81C9700CE3EF4 /* EKAccessoryNoteMessageView.swift */,\n\t\t\t\t14B48B4A20B81C9700CE3EF4 /* EKProcessingNoteMessageView.swift */,\n\t\t\t);\n\t\t\tpath = Notes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14B48B4C20B81C9700CE3EF4 /* MessagesUtils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14B48B4D20B81C9700CE3EF4 /* EKTextField.swift */,\n\t\t\t\t14DF7B6921BBCD4D0058B2BB /* EKButtonView.swift */,\n\t\t\t\t14B48B4E20B81C9700CE3EF4 /* EKButtonBarView.swift */,\n\t\t\t\t14B3A51720C16D7A002306C4 /* EKRatingSymbolView.swift */,\n\t\t\t\t14B3A51920C16E44002306C4 /* EKRatingSymbolsContainerView.swift */,\n\t\t\t\t1461DEFC21E0A9FC0034E08C /* EntryAppearanceDescriptor.swift */,\n\t\t\t);\n\t\t\tpath = MessagesUtils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14C729C6209447CA0060D267 /* Samples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t142D4944223C1F1B00020ABF /* ExampleNavigationController */,\n\t\t\t\t14A6AABB20CA71D9005F3D81 /* ExampleViewController */,\n\t\t\t\t14D18CD0209118950019AE7F /* NibExampleView */,\n\t\t\t);\n\t\t\tpath = Samples;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14C894F3208E70A4003D8CE3 /* Playground */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14C894FA208E79B8003D8CE3 /* EntryAttributeWrapper.swift */,\n\t\t\t\t14A40C62208B7AA800B79474 /* PlaygroundViewController.swift */,\n\t\t\t\t14D18CCB2090F53D0019AE7F /* Cells */,\n\t\t\t);\n\t\t\tpath = Playground;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14C894FC208E7DD0003D8CE3 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14C894FD208E7DDE003D8CE3 /* Font.swift */,\n\t\t\t\t1496D955209CC6EF002CBB22 /* Object+ClassName.swift */,\n\t\t\t\t14C729D8209496730060D267 /* UIScreen+Utils.swift */,\n\t\t\t\t14C729D6209496180060D267 /* CGRect+Utils.swift */,\n\t\t\t\t14E24A1C208B600E00F32B13 /* UIColor+Utils.swift */,\n\t\t\t\t1496D951209CC2AF002CBB22 /* UIView+Nib.swift */,\n\t\t\t);\n\t\t\tpath = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14D18CCB2090F53D0019AE7F /* Cells */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t147A9A602092682E00A49D7A /* SelectionHeaderView.swift */,\n\t\t\t\t14C894F6208E70D5003D8CE3 /* SelectionTableViewCell.swift */,\n\t\t\t\t14C894FF208E81BF003D8CE3 /* PositionSelectionTableViewCell.swift */,\n\t\t\t\t14C89501208E83AA003D8CE3 /* WindowLevelSelectionTableViewCell.swift */,\n\t\t\t\t14C75E072096430D0002465E /* PrioritySelectionTableViewCell.swift */,\n\t\t\t\t14C89503208E870C003D8CE3 /* DisplayDurationSelectionTableViewCell.swift */,\n\t\t\t\t143F3AA12090A6A7009F3719 /* ShadowSelectionTableViewCell.swift */,\n\t\t\t\t143F3AA32090A70E009F3719 /* RoundCornersSelectionTableViewCell.swift */,\n\t\t\t\t14C729D4209476A90060D267 /* BorderSelectionTableViewCell.swift */,\n\t\t\t\t143F3AA92090AFB8009F3719 /* BackgroundStyleSelectionTableViewCell.swift */,\n\t\t\t\t143F3AAB2090B312009F3719 /* UserInteractionSelectionTableViewCell.swift */,\n\t\t\t\t143F3AAD2090B4E2009F3719 /* HapticFeedbackSelectionTableViewCell.swift */,\n\t\t\t\t143F3AB12090B7F0009F3719 /* ScrollSelectionTableViewCell.swift */,\n\t\t\t\t14D18CCC2090FE970019AE7F /* SafeAreaSelectionTableViewCell.swift */,\n\t\t\t\t14D18CCE209105290019AE7F /* WidthSelectionTableViewCell.swift */,\n\t\t\t\t147A9A6420926C5D00A49D7A /* HeightSelectionTableViewCell.swift */,\n\t\t\t\t147A9A6220926A7500A49D7A /* MaxWidthSelectionTableViewCell.swift */,\n\t\t\t\t14665620209204A5008FB96D /* AnimationSelectionTableViewCell.swift */,\n\t\t\t);\n\t\t\tpath = Cells;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14D18CD0209118950019AE7F /* NibExampleView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14D18CD1209118DA0019AE7F /* NibExampleView.swift */,\n\t\t\t\t14D18CD3209118E90019AE7F /* NibExampleView.xib */,\n\t\t\t);\n\t\t\tpath = NibExampleView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACC71AFB9204008FA782 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t607FACF51AFB993E008FA782 /* Podspec Metadata */,\n\t\t\t\t607FACD21AFB9204008FA782 /* DemoApp */,\n\t\t\t\t607FACE81AFB9204008FA782 /* Tests */,\n\t\t\t\t14B48B1720B81C9700CE3EF4 /* Source */,\n\t\t\t\t143C6A1F20B54E4A00F7DD89 /* SwiftEntryKit */,\n\t\t\t\t607FACD11AFB9204008FA782 /* Products */,\n\t\t\t\t89834CCE498EB0030FCF4F08 /* Frameworks */,\n\t\t\t\tEA8D55529124D081F838F6C2 /* Pods */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACD11AFB9204008FA782 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t607FACD01AFB9204008FA782 /* SwiftEntryKitDemo.app */,\n\t\t\t\t607FACE51AFB9204008FA782 /* SwiftEntryKitTests.xctest */,\n\t\t\t\t143C6A1E20B54E4A00F7DD89 /* SwiftEntryKit.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACD21AFB9204008FA782 /* DemoApp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t607FACD51AFB9204008FA782 /* AppDelegate.swift */,\n\t\t\t\t149B2B57208F0C22007C829F /* Presets */,\n\t\t\t\t14C894F3208E70A4003D8CE3 /* Playground */,\n\t\t\t\t14C894FC208E7DD0003D8CE3 /* Utils */,\n\t\t\t\t607FACD91AFB9204008FA782 /* Main.storyboard */,\n\t\t\t\t607FACDC1AFB9204008FA782 /* Images.xcassets */,\n\t\t\t\t607FACDE1AFB9204008FA782 /* LaunchScreen.xib */,\n\t\t\t\t607FACD31AFB9204008FA782 /* Supporting Files */,\n\t\t\t);\n\t\t\tname = DemoApp;\n\t\t\tpath = SwiftEntryKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACD31AFB9204008FA782 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14580CCA20B7F4FB001AF703 /* DemoAppInfo.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACE81AFB9204008FA782 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14CF407820AEEA6E00C744D1 /* AttributesCreationTest.swift */,\n\t\t\t\t607FACE91AFB9204008FA782 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACE91AFB9204008FA782 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t607FACEA1AFB9204008FA782 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACF51AFB993E008FA782 /* Podspec Metadata */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF1F450C1E75BEC09B67F526C /* SwiftEntryKit.podspec */,\n\t\t\t\tEFEC60E1244126F18ABBB375 /* README.md */,\n\t\t\t\t14CF407720AEC75F00C744D1 /* CHANGELOG.md */,\n\t\t\t\t1496D957209CC860002CBB22 /* CREDITS.md */,\n\t\t\t\t2A856CAE48665E23BC76CB3B /* LICENSE */,\n\t\t\t);\n\t\t\tname = \"Podspec Metadata\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t89834CCE498EB0030FCF4F08 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1430769C20B5E5970069BA1B /* QuickLayout.framework */,\n\t\t\t\t14B0B95020B7E4FE00D24D8A /* QuickLayout.framework */,\n\t\t\t\t39B9C8169640826800BA255C /* Pods_SwiftEntryKitDemo.framework */,\n\t\t\t\t7287A554A48DB0976C7AA96F /* Pods_SwiftEntryKitTests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEA8D55529124D081F838F6C2 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t12AB00853602FB01F90EB33D /* Pods-SwiftEntryKitDemo.debug.xcconfig */,\n\t\t\t\tCAFB554B7EC0872395B9099A /* Pods-SwiftEntryKitDemo.release.xcconfig */,\n\t\t\t\t2953CEDC51190E5442C4A150 /* Pods-SwiftEntryKitTests.debug.xcconfig */,\n\t\t\t\t0A7410C89E315570D823186E /* Pods-SwiftEntryKitTests.release.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t143C6A1B20B54E4A00F7DD89 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t143C6A2220B54E4A00F7DD89 /* SwiftEntryKit.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t143C6A1D20B54E4A00F7DD89 /* SwiftEntryKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 143C6A2920B54E4A00F7DD89 /* Build configuration list for PBXNativeTarget \"SwiftEntryKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t143C6A1920B54E4A00F7DD89 /* Sources */,\n\t\t\t\t143C6A1A20B54E4A00F7DD89 /* Frameworks */,\n\t\t\t\t143C6A1B20B54E4A00F7DD89 /* Headers */,\n\t\t\t\t143C6A1C20B54E4A00F7DD89 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SwiftEntryKit;\n\t\t\tproductName = SwiftEntryKit;\n\t\t\tproductReference = 143C6A1E20B54E4A00F7DD89 /* SwiftEntryKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t607FACCF1AFB9204008FA782 /* SwiftEntryKitDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget \"SwiftEntryKitDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC3E3CEC7DFE6251C762E5986 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t607FACCC1AFB9204008FA782 /* Sources */,\n\t\t\t\t607FACCD1AFB9204008FA782 /* Frameworks */,\n\t\t\t\t607FACCE1AFB9204008FA782 /* Resources */,\n\t\t\t\t143C6A2A20B54E4A00F7DD89 /* Embed Frameworks */,\n\t\t\t\t7AEBD4A94FB4F3507967F562 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t143C6A2420B54E4A00F7DD89 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SwiftEntryKitDemo;\n\t\t\tproductName = SwiftEntryKit;\n\t\t\tproductReference = 607FACD01AFB9204008FA782 /* SwiftEntryKitDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t607FACE41AFB9204008FA782 /* SwiftEntryKitTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget \"SwiftEntryKitTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t42BA4D0F12EC6E75EA1B321D /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t607FACE11AFB9204008FA782 /* Sources */,\n\t\t\t\t607FACE21AFB9204008FA782 /* Frameworks */,\n\t\t\t\t607FACE31AFB9204008FA782 /* Resources */,\n\t\t\t\t40FB9744AA238E60A78C9944 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t607FACE71AFB9204008FA782 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SwiftEntryKitTests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 607FACE51AFB9204008FA782 /* SwiftEntryKitTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t607FACC81AFB9204008FA782 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0830;\n\t\t\t\tLastUpgradeCheck = 0830;\n\t\t\t\tORGANIZATIONNAME = CocoaPods;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t143C6A1D20B54E4A00F7DD89 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.3;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t607FACCF1AFB9204008FA782 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t\t607FACE41AFB9204008FA782 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 607FACCF1AFB9204008FA782;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject \"SwiftEntryKit\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 607FACC71AFB9204008FA782;\n\t\t\tproductRefGroup = 607FACD11AFB9204008FA782 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t607FACCF1AFB9204008FA782 /* SwiftEntryKitDemo */,\n\t\t\t\t143C6A1D20B54E4A00F7DD89 /* SwiftEntryKit */,\n\t\t\t\t607FACE41AFB9204008FA782 /* SwiftEntryKitTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t143C6A1C20B54E4A00F7DD89 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t607FACCE1AFB9204008FA782 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t142D4948223C1F5A00020ABF /* ContactsViewController.xib in Resources */,\n\t\t\t\t607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */,\n\t\t\t\t607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */,\n\t\t\t\t142D494C223C204700020ABF /* DescriptionViewController.xib in Resources */,\n\t\t\t\t607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */,\n\t\t\t\t14D18CD4209118E90019AE7F /* NibExampleView.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t607FACE31AFB9204008FA782 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t40FB9744AA238E60A78C9944 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 12;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftEntryKit.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-SwiftEntryKitTests/Pods-SwiftEntryKitTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t42BA4D0F12EC6E75EA1B321D /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-SwiftEntryKitTests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t7AEBD4A94FB4F3507967F562 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 8;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftEntryKit.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-SwiftEntryKitDemo/Pods-SwiftEntryKitDemo-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tC3E3CEC7DFE6251C762E5986 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-SwiftEntryKitDemo-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t143C6A1920B54E4A00F7DD89 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t14A7B11F22ECEDE8009A4265 /* EKAttributes+DisplayMode.swift in Sources */,\n\t\t\t\t14B48B5F20B81C9700CE3EF4 /* EKStyleView.swift in Sources */,\n\t\t\t\t14B48B7120B81C9700CE3EF4 /* EKAttributes+Animation.swift in Sources */,\n\t\t\t\t14B3A51A20C16E44002306C4 /* EKRatingSymbolsContainerView.swift in Sources */,\n\t\t\t\t143C1576271C814E009A7D03 /* QLUtils.swift in Sources */,\n\t\t\t\t14B48B8820B81C9700CE3EF4 /* EKMessageContentView.swift in Sources */,\n\t\t\t\t144E51BD20D56E150051FDCA /* EKAttributes+LifecycleActions.swift in Sources */,\n\t\t\t\t14B48B6F20B81C9700CE3EF4 /* EKAttributes+Validations.swift in Sources */,\n\t\t\t\t14F3FD86213A6ED900CA3010 /* EntryCachingHeuristic.swift in Sources */,\n\t\t\t\t14B48B6620B81C9700CE3EF4 /* UIView+Shadow.swift in Sources */,\n\t\t\t\t14B48B7A20B81C9700CE3EF4 /* EKPopUpMessage.swift in Sources */,\n\t\t\t\t14B48B6920B81C9700CE3EF4 /* EKAttributes+Shadow.swift in Sources */,\n\t\t\t\t14B48B8220B81C9700CE3EF4 /* EKAccessoryNoteMessageView.swift in Sources */,\n\t\t\t\t14B48B8720B81C9700CE3EF4 /* EKPopUpMessageView.swift in Sources */,\n\t\t\t\t14B48B5A20B81C9700CE3EF4 /* EKWindowProvider.swift in Sources */,\n\t\t\t\t14B48B7920B81C9700CE3EF4 /* EKAttributes+FrameStyle.swift in Sources */,\n\t\t\t\t14B48B8520B81C9700CE3EF4 /* EKTextField.swift in Sources */,\n\t\t\t\t14B48B7C20B81C9700CE3EF4 /* EKNotificationMessageView.swift in Sources */,\n\t\t\t\t14B48B7820B81C9700CE3EF4 /* EKAttributes+HapticFeedback.swift in Sources */,\n\t\t\t\t143C1573271C814E009A7D03 /* UIView+QuickLayout.swift in Sources */,\n\t\t\t\t145F56B820B84ACA0027EB67 /* EKAttributes+StatusBar.swift in Sources */,\n\t\t\t\t14B48B6220B81C9700CE3EF4 /* HapticFeedbackGenerator.swift in Sources */,\n\t\t\t\t14B48B8420B81C9700CE3EF4 /* EKFormMessageView.swift in Sources */,\n\t\t\t\t14B48B7D20B81C9700CE3EF4 /* EKAlertMessageView.swift in Sources */,\n\t\t\t\t14B48B6B20B81C9700CE3EF4 /* EKAttributes+Position.swift in Sources */,\n\t\t\t\t14B48B7E20B81C9700CE3EF4 /* EKSimpleMessageView.swift in Sources */,\n\t\t\t\t14B48B6120B81C9700CE3EF4 /* GradientView.swift in Sources */,\n\t\t\t\t14B48B6720B81C9700CE3EF4 /* SwiftEntryKit.swift in Sources */,\n\t\t\t\t14B48B5B20B81C9700CE3EF4 /* EKWindow.swift in Sources */,\n\t\t\t\t14A7B12222ECEF68009A4265 /* UIColor+Utils.swift in Sources */,\n\t\t\t\t14B48B7420B81C9700CE3EF4 /* EKAttributes+Scroll.swift in Sources */,\n\t\t\t\t14B48B6C20B81C9700CE3EF4 /* EKAttributes.swift in Sources */,\n\t\t\t\t14B48B7020B81C9700CE3EF4 /* EKAttributes+PopBehavior.swift in Sources */,\n\t\t\t\t14B48B6020B81C9700CE3EF4 /* UIView+Responder.swift in Sources */,\n\t\t\t\t14B48B8120B81C9700CE3EF4 /* EKXStatusBarMessageView.swift in Sources */,\n\t\t\t\t14B48B7220B81C9700CE3EF4 /* EKAttributes+PositionConstraints.swift in Sources */,\n\t\t\t\t145F56BB20B863220027EB67 /* UIApplication+EKAppearance.swift in Sources */,\n\t\t\t\t14B48B7720B81C9700CE3EF4 /* EKAttributes+BackgroundStyle.swift in Sources */,\n\t\t\t\t14B48B6E20B81C9700CE3EF4 /* EKAttributes+Duration.swift in Sources */,\n\t\t\t\t1461DEFD21E0A9FC0034E08C /* EntryAppearanceDescriptor.swift in Sources */,\n\t\t\t\t14B48B6420B81C9700CE3EF4 /* UIRectCorner+Short.swift in Sources */,\n\t\t\t\t14B48B5C20B81C9700CE3EF4 /* EKBackgroundView.swift in Sources */,\n\t\t\t\t14B3A51420C16BAC002306C4 /* EKAlertMessage.swift in Sources */,\n\t\t\t\t14B48B5820B81C9700CE3EF4 /* EKRootViewController.swift in Sources */,\n\t\t\t\t14B3A50720C1198A002306C4 /* EKRatingMessageView.swift in Sources */,\n\t\t\t\t14DF7B6A21BBCD4D0058B2BB /* EKButtonView.swift in Sources */,\n\t\t\t\t143C1574271C814E009A7D03 /* UIViewArray+QuickLayout.swift in Sources */,\n\t\t\t\t14B48B7520B81C9700CE3EF4 /* EKAttributes+Presets.swift in Sources */,\n\t\t\t\t14B48B7B20B81C9700CE3EF4 /* EKNotificationMessage.swift in Sources */,\n\t\t\t\t14B48B8620B81C9700CE3EF4 /* EKButtonBarView.swift in Sources */,\n\t\t\t\t143C1575271C814E009A7D03 /* UIView+QLContentWrap.swift in Sources */,\n\t\t\t\t14B48B5E20B81C9700CE3EF4 /* EKContentView.swift in Sources */,\n\t\t\t\t14B48B6D20B81C9700CE3EF4 /* EKAttributes+UserInteraction.swift in Sources */,\n\t\t\t\t14B48B7F20B81C9700CE3EF4 /* EKImageNoteMessageView.swift in Sources */,\n\t\t\t\t14E59DBE22E49C0D0080AB4F /* EKColor.swift in Sources */,\n\t\t\t\t14B48B6820B81C9700CE3EF4 /* EKProperty.swift in Sources */,\n\t\t\t\t14B48B6520B81C9700CE3EF4 /* UIEdgeInsets+Utils.swift in Sources */,\n\t\t\t\t14B3A51620C16BC3002306C4 /* EKSimpleMessage.swift in Sources */,\n\t\t\t\t14B48B5D20B81C9700CE3EF4 /* EKWrapperView.swift in Sources */,\n\t\t\t\t14B48B6320B81C9700CE3EF4 /* UIView+Utils.swift in Sources */,\n\t\t\t\t14B3A51820C16D7A002306C4 /* EKRatingSymbolView.swift in Sources */,\n\t\t\t\t14B3A51220C16B64002306C4 /* EKRatingMessage.swift in Sources */,\n\t\t\t\t14B48B7620B81C9700CE3EF4 /* EKAttributes+WindowLevel.swift in Sources */,\n\t\t\t\t14B48B5920B81C9700CE3EF4 /* EKEntryView.swift in Sources */,\n\t\t\t\t14B48B8320B81C9700CE3EF4 /* EKProcessingNoteMessageView.swift in Sources */,\n\t\t\t\t14B48B8020B81C9700CE3EF4 /* EKNoteMessageView.swift in Sources */,\n\t\t\t\t14B48B7320B81C9700CE3EF4 /* EKAttributes+Precedence.swift in Sources */,\n\t\t\t\t143C1577271C814E009A7D03 /* QLCompatibility.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t607FACCC1AFB9204008FA782 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t143F3AAC2090B312009F3719 /* UserInteractionSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14D18CCF209105290019AE7F /* WidthSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14C75E082096430D0002465E /* PrioritySelectionTableViewCell.swift in Sources */,\n\t\t\t\t147A9A6320926A7500A49D7A /* MaxWidthSelectionTableViewCell.swift in Sources */,\n\t\t\t\t142D494B223C204700020ABF /* DescriptionViewController.swift in Sources */,\n\t\t\t\t14E24A1D208B600E00F32B13 /* UIColor+Utils.swift in Sources */,\n\t\t\t\t14C89500208E81BF003D8CE3 /* PositionSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14F36800208B585E001E8F56 /* PresetsViewController.swift in Sources */,\n\t\t\t\t142D493C223C1E7F00020ABF /* ExampleNavigationViewController.swift in Sources */,\n\t\t\t\t142D4947223C1F5A00020ABF /* ContactsViewController.swift in Sources */,\n\t\t\t\t14D18CD2209118DA0019AE7F /* NibExampleView.swift in Sources */,\n\t\t\t\t1496D952209CC2AF002CBB22 /* UIView+Nib.swift in Sources */,\n\t\t\t\t14A40C63208B7AA800B79474 /* PlaygroundViewController.swift in Sources */,\n\t\t\t\t1496D956209CC6EF002CBB22 /* Object+ClassName.swift in Sources */,\n\t\t\t\t143F3AAE2090B4E2009F3719 /* HapticFeedbackSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14C729D5209476A90060D267 /* BorderSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14A6AAC420CA7208005F3D81 /* ExampleViewController.swift in Sources */,\n\t\t\t\t143F3AA42090A70E009F3719 /* RoundCornersSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14C894F8208E70D5003D8CE3 /* SelectionTableViewCell.swift in Sources */,\n\t\t\t\t14665621209204A5008FB96D /* AnimationSelectionTableViewCell.swift in Sources */,\n\t\t\t\t607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */,\n\t\t\t\t14D18CCD2090FE970019AE7F /* SafeAreaSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14C894FE208E7DDE003D8CE3 /* Font.swift in Sources */,\n\t\t\t\t14C894FB208E79B8003D8CE3 /* EntryAttributeWrapper.swift in Sources */,\n\t\t\t\t143F3AB22090B7F0009F3719 /* ScrollSelectionTableViewCell.swift in Sources */,\n\t\t\t\t143F3AA22090A6A7009F3719 /* ShadowSelectionTableViewCell.swift in Sources */,\n\t\t\t\t147A9A6520926C5D00A49D7A /* HeightSelectionTableViewCell.swift in Sources */,\n\t\t\t\t149D0A1220AF1EE7000AA6C4 /* FormFieldPresetFactory.swift in Sources */,\n\t\t\t\t14333AE3208FA09E00DCFC7B /* PresetDescription.swift in Sources */,\n\t\t\t\t147A9A612092682E00A49D7A /* SelectionHeaderView.swift in Sources */,\n\t\t\t\t14C729D9209496730060D267 /* UIScreen+Utils.swift in Sources */,\n\t\t\t\t14A1AB3520930120001CA5B4 /* PresetsDataSource.swift in Sources */,\n\t\t\t\t14C89504208E870C003D8CE3 /* DisplayDurationSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14F36801208B585E001E8F56 /* PresetTableViewCell.swift in Sources */,\n\t\t\t\t14C89502208E83AA003D8CE3 /* WindowLevelSelectionTableViewCell.swift in Sources */,\n\t\t\t\t143F3AAA2090AFB8009F3719 /* BackgroundStyleSelectionTableViewCell.swift in Sources */,\n\t\t\t\t14C729D7209496180060D267 /* CGRect+Utils.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t607FACE11AFB9204008FA782 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t149D0A0B20AF07EE000AA6C4 /* AttributesCreationTest.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t143C6A2420B54E4A00F7DD89 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 143C6A1D20B54E4A00F7DD89 /* SwiftEntryKit */;\n\t\t\ttargetProxy = 143C6A2320B54E4A00F7DD89 /* PBXContainerItemProxy */;\n\t\t};\n\t\t607FACE71AFB9204008FA782 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 607FACCF1AFB9204008FA782 /* SwiftEntryKitDemo */;\n\t\t\ttargetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t607FACD91AFB9204008FA782 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t607FACDA1AFB9204008FA782 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t607FACDF1AFB9204008FA782 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t143C6A2720B54E4A00F7DD89 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = SwiftEntryKit/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.huri.SwiftEntryKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_WORKSPACE = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t143C6A2820B54E4A00F7DD89 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = SwiftEntryKit/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.huri.SwiftEntryKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_WORKSPACE = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t607FACED1AFB9204008FA782 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t607FACEE1AFB9204008FA782 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t607FACF01AFB9204008FA782 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 12AB00853602FB01F90EB33D /* Pods-SwiftEntryKitDemo.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)\",\n\t\t\t\t\t\"\\\"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\\\"\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = SwiftEntryKit/DemoAppInfo.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tMODULE_NAME = ExampleApp;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.huri.SwiftEntryKitDemo;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_WORKSPACE = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t607FACF11AFB9204008FA782 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = CAFB554B7EC0872395B9099A /* Pods-SwiftEntryKitDemo.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)\",\n\t\t\t\t\t\"\\\"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\\\"\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = SwiftEntryKit/DemoAppInfo.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tMODULE_NAME = ExampleApp;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.huri.SwiftEntryKitDemo;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_WORKSPACE = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t607FACF31AFB9204008FA782 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2953CEDC51190E5442C4A150 /* Pods-SwiftEntryKitTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PLATFORM_DIR)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"\\\"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t607FACF41AFB9204008FA782 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 0A7410C89E315570D823186E /* Pods-SwiftEntryKitTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PLATFORM_DIR)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"\\\"${PODS_CONFIGURATION_BUILD_DIR}/SwiftEntryKit\\\"\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t143C6A2920B54E4A00F7DD89 /* Build configuration list for PBXNativeTarget \"SwiftEntryKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t143C6A2720B54E4A00F7DD89 /* Debug */,\n\t\t\t\t143C6A2820B54E4A00F7DD89 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject \"SwiftEntryKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t607FACED1AFB9204008FA782 /* Debug */,\n\t\t\t\t607FACEE1AFB9204008FA782 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget \"SwiftEntryKitDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t607FACF01AFB9204008FA782 /* Debug */,\n\t\t\t\t607FACF11AFB9204008FA782 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget \"SwiftEntryKitTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t607FACF31AFB9204008FA782 /* Debug */,\n\t\t\t\t607FACF41AFB9204008FA782 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 607FACC81AFB9204008FA782 /* Project object */;\n}\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:SwiftEntryKit.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcodeproj/xcshareddata/xcschemes/SwiftEntryKit.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"143C6A1D20B54E4A00F7DD89\"\n               BuildableName = \"SwiftEntryKit.framework\"\n               BlueprintName = \"SwiftEntryKit\"\n               ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"607FACE41AFB9204008FA782\"\n               BuildableName = \"SwiftEntryKitTests.xctest\"\n               BlueprintName = \"SwiftEntryKitTests\"\n               ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"143C6A1D20B54E4A00F7DD89\"\n            BuildableName = \"SwiftEntryKit.framework\"\n            BlueprintName = \"SwiftEntryKit\"\n            ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"143C6A1D20B54E4A00F7DD89\"\n            BuildableName = \"SwiftEntryKit.framework\"\n            BlueprintName = \"SwiftEntryKit\"\n            ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"143C6A1D20B54E4A00F7DD89\"\n            BuildableName = \"SwiftEntryKit.framework\"\n            BlueprintName = \"SwiftEntryKit\"\n            ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcodeproj/xcshareddata/xcschemes/SwiftEntryKitDemo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"607FACCF1AFB9204008FA782\"\n               BuildableName = \"SwiftEntryKitDemo.app\"\n               BlueprintName = \"SwiftEntryKitDemo\"\n               ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"607FACE41AFB9204008FA782\"\n               BuildableName = \"SwiftEntryKitTests.xctest\"\n               BlueprintName = \"SwiftEntryKitTests\"\n               ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"607FACCF1AFB9204008FA782\"\n            BuildableName = \"SwiftEntryKitDemo.app\"\n            BlueprintName = \"SwiftEntryKitDemo\"\n            ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"607FACE41AFB9204008FA782\"\n               BuildableName = \"SwiftEntryKitTests.xctest\"\n               BlueprintName = \"SwiftEntryKitTests\"\n               ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"607FACCF1AFB9204008FA782\"\n            BuildableName = \"SwiftEntryKitDemo.app\"\n            BlueprintName = \"SwiftEntryKitDemo\"\n            ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"607FACCF1AFB9204008FA782\"\n            BuildableName = \"SwiftEntryKitDemo.app\"\n            BlueprintName = \"SwiftEntryKitDemo\"\n            ReferencedContainer = \"container:SwiftEntryKit.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:SwiftEntryKit.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/SwiftEntryKit.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Tests/AttributesCreationTest.swift",
    "content": "//\n//  AttributesCreation.swift\n//  SwiftEntryKitDemo\n//\n//  Created by Daniel Huri on 5/18/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport XCTest\n@testable import SwiftEntryKit\n\nclass AttributesCreationTest: XCTestSuite {\n\n    func testDisplayPriorityInitMax() {\n        var attributes = EKAttributes()\n        attributes.precedence.priority = .max\n        XCTAssertEqual(attributes.precedence.priority, .max)\n        XCTAssertEqual(attributes.precedence.priority.rawValue, EKAttributes.Precedence.Priority.maxRawValue)\n    }\n    \n    func testDisplayPriorityInitHigh() {\n        var attributes = EKAttributes()\n        attributes.precedence.priority = .high\n        XCTAssertEqual(attributes.precedence.priority, .high)\n        XCTAssertEqual(attributes.precedence.priority.rawValue, EKAttributes.Precedence.Priority.maxRawValue)\n    }\n    \n    func testDisplayPriorityInitCustom() {\n        \n        var attributes = EKAttributes()\n\n        let custom1 = EKAttributes.Precedence.override(priority: .init(999), dropEnqueuedEntries: true)\n        attributes.precedence.priority = custom1.priority\n        XCTAssertEqual(attributes.precedence.priority, custom1.priority)\n        XCTAssertEqual(attributes.precedence.priority.rawValue, 999)\n        \n        let custom2 = EKAttributes.Precedence.override(priority: .init(1), dropEnqueuedEntries: true)\n        attributes.precedence.priority = custom2.priority\n        XCTAssertEqual(attributes.precedence.priority, custom2.priority)\n        XCTAssertEqual(attributes.precedence.priority.rawValue, 1)\n        \n        XCTAssertLessThan(custom2.priority, custom1.priority)\n    }\n    \n    func testPositionTop() {\n        var attributes = EKAttributes()\n        attributes.position = .top\n        XCTAssertEqual(attributes.position, .top)\n        XCTAssertTrue(attributes.position.isTop)\n    }\n    \n    func testPositionCenter() {\n        var attributes = EKAttributes()\n        attributes.position = .center\n        XCTAssertEqual(attributes.position, .center)\n        XCTAssertTrue(attributes.position.isCenter)\n    }\n    \n    func testPositionBottom() {\n        var attributes = EKAttributes()\n        attributes.position = .bottom\n        XCTAssertEqual(attributes.position, .bottom)\n        XCTAssertTrue(attributes.position.isBottom)\n    }\n            \n    func testDisplayDurationInfinite() {\n        var attributes = EKAttributes()\n        attributes.displayDuration = .infinity\n        XCTAssertTrue(attributes.validateDisplayDuration)\n        XCTAssertTrue(attributes.isValid)\n    }\n    \n    func testDisplayDurationConstant() {\n        var attributes = EKAttributes()\n        attributes.displayDuration = 1\n        XCTAssertTrue(attributes.validateDisplayDuration)\n        XCTAssertTrue(attributes.isValid)\n    }\n\n    \n    func testWindowLevelNormal() {\n        var attributes = EKAttributes()\n        attributes.windowLevel = .normal\n        XCTAssertEqual(attributes.windowLevel.value, .normal)\n        XCTAssertTrue(attributes.validateWindowLevel)\n        XCTAssertTrue(attributes.isValid)\n    }\n    \n    func testWindowLevelStatus() {\n        var attributes = EKAttributes()\n        attributes.windowLevel = .statusBar\n        XCTAssertEqual(attributes.windowLevel.value, .statusBar)\n        XCTAssertTrue(attributes.validateWindowLevel)\n        XCTAssertTrue(attributes.isValid)\n    }\n    \n    func testWindowLevelAlert() {\n        var attributes = EKAttributes()\n        attributes.windowLevel = .alerts\n        XCTAssertEqual(attributes.windowLevel.value, .alert)\n        XCTAssertTrue(attributes.validateWindowLevel)\n        XCTAssertTrue(attributes.isValid)\n    }\n    \n    func testWindowLevelCustom() {\n        var attributes = EKAttributes()\n        let level = UIWindow.Level(rawValue: 1)\n        attributes.windowLevel = .custom(level: level)\n        \n        XCTAssertEqual(attributes.windowLevel.value, level)\n        XCTAssertTrue(attributes.validateWindowLevel)\n        XCTAssertTrue(attributes.isValid)\n    }\n    \n    func testWindowLevelNegative() {\n        var attributes = EKAttributes()\n        let level = UIWindow.Level(rawValue: -1)\n        attributes.windowLevel = .custom(level: level)\n        \n        XCTAssertEqual(attributes.windowLevel.value, level)\n        XCTAssertFalse(attributes.validateWindowLevel)\n        XCTAssertFalse(attributes.isValid)\n    }\n\n}\n"
  },
  {
    "path": "Example/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Daniel Huri, huri000@gmail.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "PULL_REQUEST_TEMPLATE.md",
    "content": "### Issue Link 🔗\n*A link to the issue & short explanation*\n\n### Goals 🥅\n*What have I tried to achieve / improve + use case example*\n\n### Implementation Details ✏️\n*How did I implement*\n\n### Testing Details 🔍\n*How did I test my implementation*\n\n### Screenshot Links 📷\n*Since this a visual project, focusing maily on UI and UX, please attach screenshots in case of UI related change*\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.0\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"SwiftEntryKit\",\n  platforms: [\n    .iOS(.v9)\n  ],\n  products: [\n    .library(name: \"SwiftEntryKit\", targets: [\"SwiftEntryKit\"])\n  ],\n  targets: [\n    .target(\n      name: \"SwiftEntryKit\",\n      path: \"Source\"\n    )\n  ],\n  swiftLanguageVersions: [\n    .v5\n  ]\n)\n"
  },
  {
    "path": "README.md",
    "content": "# SwiftEntryKit <img align=\"left\" height=42 src=\"https://github.com/huri000/assets/blob/master/swift-entrykit/project-icon.png\">\n\n[![Platform](http://img.shields.io/badge/platform-iOS-blue.svg?style=flat)](https://developer.apple.com/iphone/index.action)\n[![Language](http://img.shields.io/badge/language-Swift-brightgreen.svg?style=flat)](https://developer.apple.com/swift)\n[![Version](https://img.shields.io/cocoapods/v/SwiftEntryKit.svg?style=flat-square)](http://cocoapods.org/pods/SwiftEntryKit)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Accio: Supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio)\n[![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat)](http://mit-license.org)\n![](https://travis-ci.com/huri000/SwiftEntryKit.svg?branch=master)\n\n 🤗 Donations can be made [here](#donations).\n\n## Table of Contents\n\n* [Overview](#overview)\n  * [Features](#features)\n* [Example Project](#example-project)\n  * [Example Project Installation](#example-project-installation)\n  * [Presets](#presets)\n  * [Playground](#playground)\n* [Requirements](#requirements)\n* [Installation](#installation)\n* [Usage](#usage)\n  * [Quick Usage](#quick-usage)\n  * [Entry Attributes](#entry-attributes)\n    * [Entry Name](#entry-name)\n    * [Window Level](#window-level)\n    * [Display Position](#display-position)\n    * [Precedence](#precedence)\n      * [Override](#override)\n      * [Enqueue](#enqueue)\n        * [Heuristics](#heuristics)\n      * [Display Priority](#display-priority)\n    * [Display Duration](#display-duration)\n    * [Position Constraints](#position-constraints)\n    * [User Interaction](#user-interaction)\n    * [Scroll Behavior](#scroll-behavior)\n    * [Haptic Feedback](#haptic-feedback)\n    * [Lifecycle Events](#lifecycle-events)\n    * [Display Mode](#display-mode)\n    * [Background Style](#background-style)\n    * [Shadow](#shadow)\n    * [Round Corners](#round-corners)\n    * [Border](#border)\n    * [Animations](#animations)\n    * [Pop Behavior](#pop-behavior)\n    * [Status Bar](#status-bar)\n  * [Presets Usage Example](#presets-usage-example)\n  * [Custom View Usage Example](#custom-view-usage-example)\n  * [Displaying a View Controller](#displaying-a-view-controller)\n  * [Alternative Rollback Window](#alternative-rollback-window)\n  * [Dismissing an Entry](#dismissing-an-entry)\n  * [Swiping and Rubber Banding](#swiping-and-rubber-banding)\n  * [Dealing With Safe Area](#dealing-with-safe-area)\n  * [Dealing With Orientation Change](#dealing-with-orientation-change)\n  * [Swift and Objective-C Interoperability](#swift-and-objective-c-interoperability)\n* [Author](#author)\n* [Donations](#donations)\n* [License](#license)\n\n## Overview\n\nSwiftEntryKit is a simple yet versatile content presenter written in Swift.\n\n### Features\n\nBanners or pop-ups are called *Entries*.\n\n- Entries are displayed inside a separate UIWindow (of type EKWindow), so users are able to navigate the app freely while entries are being displayed in a non intrusive manner.\n- The kit offers beautiful [presets](#presets) that can be themed with your own colors and fonts.\n- **Customization**: Entries are highly customizable\n  - [x] Can be [positioned](#display-position) either at the top, center, or the bottom of the screen.\n  - [x] Can be displayed within or outside the screen safe area.\n  - [x] Can be stylized: have a [border](#border), [drop-shadow](#shadow) and [round corners](#round-corners).\n  - [x] Their content and the surrounding background can be blurred, dimmed, colored or have a gradient [style](#background-style).\n  - [x] Transition [animations](#animations) are customizable - entrance, exit and pop (by another entry).\n  - [x] The [user interaction](#user-interaction) with the entry or the screen can be intercepted.\n  - [x] Entries can be enqueued or override previous entries using the [precedence](#precedence) attribute.\n  - [x] Each entry has a [display priority](#display-priority) attribute. That means that it can be dismissed only by other entry with an equal or higher priority. \n  - [x] Presets support accessibility.\n  - [x] Entries have an optional rubber banding effect while panning.\n  - [x] Entries can be optionally dismissed using a simple [swipe gesture](#swiping-and-rubber-banding).\n  - [x] Entries can be optionally injected with [lifecycle events](#lifecycle-events): *will* and *did* appear/disappear.\n  - [x] The [status bar style](#status-bar) is settable for the display duration of the entry.\n  - [x] Supports [navigation controllers](#presets) & [custom views](#custom-view-usage-example) as well!\n\n## Example Project\n\nThe example project contains various presets and examples you can use and modify as your like.\n\n### Example Project Installation \n\nYou can either use the terminal or git client such as Source Tree.\n\n#### Terminal Users\n\n```bash\n$ git clone https://github.com/huri000/SwiftEntryKit.git\n```\n\n#### Git Client (Source Tree)\nClone https://github.com/huri000/SwiftEntryKit.git \n\n### Presets\n\n| Toasts | Notes | Floats | Popups |\n| --- | --- | --- | --- |\n| ![toasts_example](https://github.com/huri000/assets/blob/master/swift-entrykit/toasts.gif) | ![notes_example](https://github.com/huri000/assets/blob/master/swift-entrykit/notes.gif) | ![floats_example](https://github.com/huri000/assets/blob/master/swift-entrykit/floats.gif) | ![popup_example](https://github.com/huri000/assets/blob/master/swift-entrykit/popups.gif) |\n\n| Alerts | Forms | Rating | More... |\n| --- | --- | --- | --- |\n| ![alert_example](https://github.com/huri000/assets/blob/master/swift-entrykit/alerts.gif) | ![form_example](https://github.com/huri000/assets/blob/master/swift-entrykit/forms.gif) | ![rating_example](https://github.com/huri000/assets/blob/master/swift-entrykit/rating.gif) | ![custom_example](https://github.com/huri000/assets/blob/master/swift-entrykit/custom.gif) |\n\n### Playground\n\n**noun: a place where people can play 🏈**\n\nThe example app contains a playground screen, an interface that allows you to customize your preferable entries.\nThe playground screen has some limitations (allows to select constant values) but you can easily modify the code to suit your needs. Check it out!\n\nThe Playground Screen | Top Toast Sample\n--- | ---\n![playground_example](https://github.com/huri000/assets/blob/master/swift-entrykit/playground.gif) | ![playground-sample-1](https://github.com/huri000/assets/blob/master/swift-entrykit/playground-sample-1.jpeg)\n\n## Requirements\n\n- iOS 9 or any higher version.\n- Xcode 9 or any higher version.\n- Swift 4.0 or any higher version.\n- The library has not been tested with iOS 8.x.y or a lower version.\n\n## Installation\n\n- SwiftEntryKit is compatible with Swift 5 as of release *1.0.0*. \n- SwiftEntryKit is compatible with Swift 4.2 as of release *0.8.1*. \n- Developers who use lower Swift version should install release *0.7.2*.\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:\n\n```bash\n$ gem install cocoapods\n```\n\nTo integrate SwiftEntryKit into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\nsource 'https://github.com/cocoapods/specs.git'\nplatform :ios, '9.0'\nuse_frameworks!\n\npod 'SwiftEntryKit', '2.0.0'\n```\n\nThen, run the following command:\n\n```bash\n$ pod install\n```\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate SwiftEntryKit into your Xcode project using Carthage, specify the following in your `Cartfile`:\n\n```ogdl\ngithub \"huri000/SwiftEntryKit\" == 2.0.0\n```\n\n### Accio\n\n[Accio](https://github.com/JamitLabs/Accio) is a decentralized dependency manager driven by SwiftPM that works for iOS/tvOS/watchOS/macOS projects.\n\nYou can install Accio with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew tap JamitLabs/Accio https://github.com/JamitLabs/Accio.git\n$ brew install accio\n```\n\nTo integrate SwiftEntryKit into your Xcode project using Accio, specify the following in your `Package.swift` manifest:\n\n```swift\n.package(url: \"https://github.com/huri000/SwiftEntryKit\", .exact(\"2.0.0\"))\n```\n\nAfter specifying `\"SwiftEntryKit\"` as a dependency of the target in which you want to use it, run `accio install`.\n\n## Usage\n\n### Quick Usage\n\nNo setup is needed! Each time you wish to display an entry, just create your view and initialize an EKAttributes struct.\nSee also the [preset usage example](#presets-usage-example), and the example project.\nlikewise:\n```Swift\n// Customized view\nlet customView = SomeCustomView()\n/*\nDo some customization on customView\n*/\n\n// Attributes struct that describes the display, style, user interaction and animations of customView.\nvar attributes = EKAttributes()\n/*\nAdjust preferable attributes\n*/\n```\nAnd then, just call:\n```Swift\nSwiftEntryKit.display(entry: customView, using: attributes)\n```\nThe kit will replace the application main window with the EKWindow instance and display the entry.\n\n### Entry Attributes\n\n*EKAttributes* is the entry's descriptor. Each time an entry is displayed, an EKAttributes struct is necessary to describe the entry's presentation, position inside the screen, the display duration, its frame constraints (if needed), its styling (corners, border and shadow), the user interaction events, the animations (in / out) and more.\n\nCreate a mutable EKAttributes structure likewise:\n```Swift\nvar attributes = EKAttributes()\n```\n\nBelow are the properties that can be modified in the *EKAttributes*:\n\n#### Entry Name\nEntries can have names.\nWhen an EKAttributes struct is instantiated, it is nameless, meaning, the `name` property is `nil`. \nIt is recommended to set a meaningful name for an entry.\n\n```Swift \nattributes.name = \"Top Note\"\n```\n\nEntries with names can be specifically referred to later, for example, you can inquire whether a **specific** entry is currently displayed:\n```Swift\nif SwiftEntryKit.isCurrentlyDisplaying(entryNamed: \"Top Note\") {\n    /* Do your things */\n}\n```\n\n#### Window Level\nEntries can be displayed above the application main window, above the status bar, above the alerts window or even have a custom level (UIWindowLevel).\n\nFor example, set the window level to *normal*, likewise:\n```Swift \nattributes.windowLevel = .normal\n```\nThis causes the entry to appear above the application key window and below the status bar.\n\nThe default value of `windowLevel` is `.statusBar`.\n\n#### Display Position\nThe entry can be displayed either at the *top*, *center*, or the *bottom* of the screen.\n\nFor example, set the display position to *bottom*, likewise:\n```Swift \nattributes.position = .bottom\n```\n\nThe default value of `position` is `.top`.\n\n#### Precedence\nThe precedence attribute of an entry describes the manner in which entries are pushed in. It offers 2 approaches for managing the presentation priority of multiple simultaneous entries.\n\n##### Override\nIf the [display priority](#display-priority) is equal or higher than the currently displayed entry, override it.\n\nExample for setting `.override` precedence with `.max` display priority while ignoring entries that are already enqueued (leaving them to display after the new entry is dismissed).\n\n```Swift \nattributes.precedence = .override(priority: .max, dropEnqueuedEntries: false)\n```\n\nYou can optionally flush the entries that are inside the queue.\n\nIn case  `dropEnqueuedEntries` is `false`, enqueued entries remain in the queue. The first enqueued entry will show right after the new entry pops out. \nIn case  `dropEnqueuedEntries` is `true`, the entry-queue is flushed as the new entry is being displayed.\n\n##### Enqueue\nIf the queue is empty, display the entry immediately, otherwise, insert the entry into the queue until its turn to show arrives.\n\nExample for setting `.enqueue` precedence with `.normal` display priority: \n\n```Swift \nattributes.precedence = .enqueue(priority: .normal)\n```\n\n###### Heuristics\n\nThere are 2 possible heuristics for entries prioritization in the queue:\n\n- Display Priority Queue: The entries are sorted by their [display priority](#display-priority), then by chronological order.\n- Chronological Queue: The entries are sorted only by their chronological order (standard queue).\n\nSelect the heuristic that suits you best by doing the following, only once, before using `SwiftEntryKit` to display entries.\n\n```Swift \nEKAttributes.Precedence.QueueingHeuristic.value = .priority\n```\n\nOr:\n\n```Swift \nEKAttributes.Precedence.QueueingHeuristic.value = .chronological\n```\n\nThe default value of `EKAttributes.Precedence.QueueingHeuristic.value` is `.priority`.\n\nThe default value of precedence is `.override(priority: .normal, dropEnqueuedEntries: false)`.\n\n##### Display Priority \nThe display priority of the entry determines whether it dismisses other entries or is dismissed by them. \nAn entry can be dismissed only by an entry with an equal or a higher display priority.\n\n```Swift\nlet highPriorityAttributes = EKAttributes()\nhighPriorityAttributes.precedence.priority = .high\n\nlet normalPriorityAttributes = EKAttributes()\nnormalPriorityAttributes.precedence.priority = .normal\n\n// Display high priority entry\nSwiftEntryKit.display(entry: view1, using: highPriorityAttributes)\n\n// Display normal priority entry (ignored!)\nSwiftEntryKit.display(entry: view2, using: normalPriorityAttributes)\n```\n\n*view2* won't be displayed!\n\n#### Display Duration\nThe display duration of the entry (Counted from the moment the entry has finished its entrance animation and until the exit animation begins).\n\nDisplay for 4 seconds:\n```Swift\nattributes.displayDuration = 4\n```\n\nDisplay for an infinite duration\n```Swift\nattributes.displayDuration = .infinity\n```\n\nThe default value of `displayDuration` is `2`.\n\n#### Position Constraints \nConstraints that tie the entry tightly to the screen context, for example: Height, Width, Max Width, Max Height, Additional Vertical Offset & Safe Area related info.\n\n- Entries that support Auto Layout - Their height is inferred from the constraints that applied to them.\n- Entries that don't support Auto Layout - Their exact size must be explicitly set using `positionConstraints`'s `size` property.\n\nFor example:\n\nRatio edge - signifies that the ratio of the width edge has a ratio of 0.9 of the screen's width.\n```Swift\nlet widthConstraint = EKAttributes.PositionConstraints.Edge.ratio(value: 0.9)\n```\n\nIntrinsic edge - signifies that the wanted height value is the content height - Decided by the entries vertical constraints\n```Swift\nlet heightConstraint = EKAttributes.PositionConstraints.Edge.intrinsic\n```\n\nCreate the entry size constraints likewise:\n```Swift\nattributes.positionConstraints.size = .init(width: widthConstraint, height: heightConstraint)\n```\nYou can also set *attributes.positionConstraints.maxSize* in order to make sure the entry does not exceeds predefined limitations. This is useful on [device orientation change](#how-to-deal-with-orientation-change).\n\nSafe Area - can be used to override the safe area or to color it (More examples are in the example project)\nThat snippet implies that the safe area insets should be kept and not be a part of the entry.\n```Swift\nattributes.positionConstraints.safeArea = .empty(fillSafeArea: false)\n```\n\nVertical Offset - an additional offset that can be applied to the entry (Other than the safe area).\n```Swift\nattributes.positionConstraints.verticalOffset = 10\n```\n\nAutorotation - whether the entry autorotates along with the orientation of the device. Defaults to `true`.\n```Swift\nattributes.positionConstraints.rotation.isEnabled = false\n```\n\nKeyboard Releation - used to bind an entry to the keyboard once the keyboard is displayed.\n\n```Swift\nlet offset = EKAttributes.PositionConstraints.KeyboardRelation.Offset(bottom: 10, screenEdgeResistance: 20)\nlet keyboardRelation = EKAttributes.PositionConstraints.KeyboardRelation.bind(offset: offset)\nattributes.positionConstraints.keyboardRelation = keyboardRelation\n```\nIn the example above the entry's bottom is tuned to have a 10pts offset from the top of the keyboard (while it shows)\nBecause the entry's frame might exceed the screen bounds, the user might not see all the entry - we wouldn't want that. Therefore, an additional associated value has been added - `screenEdgeResistance` with value of 20pts. That is, to make sure that the entry remains within the bounds of the screen, and always visible to the user.\nThe extreme situation might occur as the device orientation is landscape and the keyboard shows up (See example project form presets for more information).\n\n#### User Interaction\nThe entry and the screen can be interacted by the user. User interaction be can intercepted in various ways:\n\nAn interaction (Any touch whatsoever) with the entry delays its exit by 3s:\n```Swift\nattributes.entryInteraction = .delayExit(by: 3)\n```\n\nA tap on the entry / screen dismisses it immediately:\n```Swift\nattributes.entryInteraction = .dismiss\nattributes.screenInteraction = .dismiss\n```\n\nA tap on the entry is swallowed (ignored):\n```Swift\nattributes.entryInteraction = .absorbTouches\n```\n\nA tap on the screen is forwarded to the lower level window, in most cases the receiver will be the application window.\nThis is very useful when you want to display an unintrusive content like banners and push notification entries.\n```Swift\nattributes.screenInteraction = .forward\n```\n\nPass additional actions that are invoked when the user taps the entry:\n```Swift\nlet action = {\n    // Do something useful\n}\nattributes.entryInteraction.customTapActions.append(action)\n```\n\nThe default value of `screenInteraction` is `.forward`.\n\nThe default value of `entryInteraction` is `.dismiss`.\n\n#### Scroll Behavior\nDescribes the entry behavior when it's being scrolled, that is, dismissal by a swipe gesture and a rubber band effect much similar to a UIScrollView.\n\nDisable the pan and swipe gestures on the entry:\n```Swift\nattributes.scroll = .disabled\n```\n\nEnable swipe and stretch and pullback with jolt effect:\n```Swift\nattributes.scroll = .enabled(swipeable: true, pullbackAnimation: .jolt)\n```\n\nEnable swipe and stretch and pullback with an ease-out effect:\n```Swift\nattributes.scroll = .enabled(swipeable: true, pullbackAnimation: .easeOut)\n```\n\nEnable swipe but disable stretch:\n```Swift\nattributes.scroll = .edgeCrossingDisabled(swipeable: true)\n```\n\nThe default value of `scroll` is `.enabled(swipeable: true, pullbackAnimation: .jolt)`.\n\n#### [Haptic Feedback](https://developer.apple.com/ios/human-interface-guidelines/user-interaction/feedback/)\nThe device can produce a haptic feedback, thus adding an additional sensory depth to each entry.\n\nThe default value of `hapticFeedbackType` is `.none`.\n\n#### Lifecycle Events\nEvents can be injected to the entry so that they are to be called during its lifecycle.\n\n```Swift\nattributes.lifecycleEvents.willAppear = {\n    // Executed before the entry animates inside \n}\n\nattributes.lifecycleEvents.didAppear = {\n    // Executed after the entry animates inside\n}\n\nattributes.lifecycleEvents.willDisappear = {\n    // Executed before the entry animates outside\n}\n\nattributes.lifecycleEvents.didDisappear = {\n    // Executed after the entry animates outside\n}\n```\n\n#### Display Mode\nTo allow you to fully support any user interface style, `SwiftEntryKit` introduces two specialized types:\n- `EKColor` describes a color under light and dark modes.\n- `EKAttributes.BackgroundStyle.BlurStyle` describes a blur effect under light and dark modes. \n\nThe following forces `SwiftEntryKit` to display the entry on dark mode.\n```Swift\nattributes.displayMode = .dark\n```\n\nThe possible values are: `.light`, `.dark`, `.inferred`.\nThe default value is `.inferred`, which means that the entry will be displayed with the current user interface style.\n\n#### Background Style\nThe entry and the screen can have various background styles, such as blur, color, gradient and even an image.\n\nThe following example implies clear background for both the entry and the screen:\n```Swift\nattributes.entryBackground = .clear\nattributes.screenBackground = .clear\n```\n\nColored entry background and dimmed screen background:\n```Swift\nattributes.entryBackground = .color(color: .standardContent)\nattributes.screenBackground = .color(color: EKColor(UIColor(white: 0.5, alpha: 0.5)))\n```\n\nGradient entry background (diagonal vector):\n```Swift\nlet colors: [EKColor] = ...\nattributes.entryBackground = .gradient(gradient: .init(colors: colors, startPoint: .zero, endPoint: CGPoint(x: 1, y: 1)))\n```\n\nVisual Effect entry background:\n```Swift\nattributes.entryBackground = .visualEffect(style: .dark)\n```\n\nThe default value of `entryBackground` and `screenBackground` is `.clear`. \n\n#### Shadow\nThe shadow that surrounds the entry.\n\nEnable shadow around the entry:\n```Swift\nattributes.shadow = .active(with: .init(color: .black, opacity: 0.3, radius: 10, offset: .zero))\n```\n\nDisable shadow around the entry:\n```Swift\nattributes.shadow = .none\n```\n\nThe default value of `shadow` is `.none`. \n\n#### Round Corners\nRound corners around the entry.\n\nOnly top left and right corners with radius of 10:\n```Swift\nattributes.roundCorners = .top(radius: 10)\n```\n\nOnly bottom left and right corners with radius of 10:\n```Swift\nattributes.roundCorners = .bottom(radius: 10)\n```\n\nAll corners with radius of 10:\n```Swift\nattributes.roundCorners = .all(radius: 10)\n```\n\nNo round corners:\n```Swift\nattributes.roundCorners = .none\n```\n\nThe default value of `roundCorners` is `.none`. \n\n#### Border\nThe border around the entry.\n\nAdd a black border with thickness of 0.5pts:\n```Swift\nattributes.border = .value(color: .black, width: 0.5)\n```\n\nNo border:\n```Swift\nattributes.border = .none\n```\n\nThe default value of `border` is `.none`. \n\n#### Animations\nDescribes how the entry animates into and out of the screen. \n\n* Each animation descriptor can have up to 3 types of animations at the same time. Those can be combined to a single complex one!\n* Translation animation anchor can be explicitly set but it receives a default value according to position of the entry.\n\nExample for _translation_ from top with spring, _scale_ in and even _fade in_ as a single entrance animation:\n```Swift\nattributes.entranceAnimation = .init(\n                 translate: .init(duration: 0.7, anchorPosition: .top, spring: .init(damping: 1, initialVelocity: 0)), \n                 scale: .init(from: 0.6, to: 1, duration: 0.7), \n                 fade: .init(from: 0.8, to: 1, duration: 0.3))\n```\n\nThe default value of `entranceAnimation` and `exitAnimation` is `.translation` - The entry translates in or out, respectively, with duration of 0.3 seconds. \n\n#### Pop Behavior\nDescribes the entry behavior when it's being popped (dismissed by an entry with equal / higher display-priority.\n\nThe entry is being popped animatedly:\n```Swift\nattributes.popBehavior = .animated(animation: .init(translate: .init(duration: 0.2)))\n```\n\nThe entry is being overridden (Disappears promptly):\n```Swift\nattributes.popBehavior = .overridden\n```\n\nThe default value of `popBehavior` is `.animated(animation: .translation)` - It translates out with duration of 0.3 seconds. \n\n#### Status Bar\nThe status bar appearance can be modified during the display of the entry. \nSwiftEntryKit supports both *View controller-based status bar appearance* and manual setting. \n\nSetting the status bar style is fairly simple - \n\nStatus bar becomes visible and gets a light style:\n```Swift\nattributes.statusBar = .light\n```\n\nThe status bar becomes hidden:\n```Swift\nattributes.statusBar = .hidden\n```\n\nThe status bar appearance is inferred from the previous context (won't be changed):\n```Swift\nattributes.statusBar = .inferred\n```\n\nIn case there is an already presenting entry with lower/equal display priority, the status bar will change its style. \nWhen the entry is removed, the status bar gets its initial style back.\n\nThe default value of `statusBar` is `.inferred`. \n\n#### EKAttributes' interface is as follows:\n\n```Swift\npublic struct EKAttributes\n\n    // Identification\n    public var name: String?\n\n    // Display\n    public var windowLevel: WindowLevel\n    public var position: Position\n    public var precedence: Precedence\n    public var displayDuration: DisplayDuration\n    public var positionConstraints: PositionConstraints\n\n    // User Interaction\n    public var screenInteraction: UserInteraction\n    public var entryInteraction: UserInteraction\n    public var scroll: Scroll\n    public var hapticFeedbackType: NotificationHapticFeedback\n    public var lifecycleEvents: LifecycleEvents\n\n    // Theme & Style\n    public var displayMode = DisplayMode.inferred\n    public var entryBackground: BackgroundStyle\n    public var screenBackground: BackgroundStyle\n    public var shadow: Shadow\n    public var roundCorners: RoundCorners\n    public var border: Border\n    public var statusBar: StatusBar\n    \n    // Animations\n    public var entranceAnimation: Animation\n    public var exitAnimation: Animation\n    public var popBehavior: PopBehavior\n}\n```\n\n### Presets Usage Example:\n\nYou can use one of the presets that come with SwiftEntryKit, doing these 4 simple steps:\n\n1. Create your *EKAttributes* struct and set your preferable properties.\n2. Create *EKNotificationMessage* struct (The Content) and set the content.\n3. Create *EKNotificationMessageView* (The View) and inject *EKNotificationMessage* struct to it.\n4. Display the entry using *SwiftEntryKit* class method.\n\n#### EKNotificationMessageView preset example:\n\n```Swift\n// Generate top floating entry and set some properties\nvar attributes = EKAttributes.topFloat\nattributes.entryBackground = .gradient(gradient: .init(colors: [EKColor(.red), EKColor(.green)], startPoint: .zero, endPoint: CGPoint(x: 1, y: 1)))\nattributes.popBehavior = .animated(animation: .init(translate: .init(duration: 0.3), scale: .init(from: 1, to: 0.7, duration: 0.7)))\nattributes.shadow = .active(with: .init(color: .black, opacity: 0.5, radius: 10, offset: .zero))\nattributes.statusBar = .dark\nattributes.scroll = .enabled(swipeable: true, pullbackAnimation: .jolt)\nattributes.positionConstraints.maxSize = .init(width: .constant(value: UIScreen.main.minEdge), height: .intrinsic)\n\nlet title = EKProperty.LabelContent(text: titleText, style: .init(font: titleFont, color: textColor))\nlet description = EKProperty.LabelContent(text: descText, style: .init(font: descFont, color: textColor))\nlet image = EKProperty.ImageContent(image: UIImage(named: imageName)!, size: CGSize(width: 35, height: 35))\nlet simpleMessage = EKSimpleMessage(image: image, title: title, description: description)\nlet notificationMessage = EKNotificationMessage(simpleMessage: simpleMessage)\n\nlet contentView = EKNotificationMessageView(with: notificationMessage)\nSwiftEntryKit.display(entry: contentView, using: attributes)\n```\n\n### Custom View Usage Example:\n\n```Swift\n// Create a basic toast that appears at the top\nvar attributes = EKAttributes.topToast\n\n// Set its background to white\nattributes.entryBackground = .color(color: .white)\n\n// Animate in and out using default translation\nattributes.entranceAnimation = .translation\nattributes.exitAnimation = .translation\n\nlet customView = UIView()\n/*\n... Customize the view as you like ...\n*/\n\n// Display the view with the configuration\nSwiftEntryKit.display(entry: customView, using: attributes)\n```\n\n### Displaying a View Controller\nAs from version 0.4.0, view controllers are supported as well.\n\n```Swift\nSwiftEntryKit.display(entry: customViewController, using: attributes)\n```\n\n### Alternative Rollback Window\nBy default, the window held by the application delegate becomes the key again right after SwiftEntryKit has finished displaying the entry.\nThis behavior can be changed using `rollbackWindow` parameter.\n\n```Swift\nSwiftEntryKit.display(entry: view, using: attributes, rollbackWindow: .custom(window: alternativeWindow))\n```\nAfter the entry has been dismissed, the given window `alternativeWindow` would become the key instead of the window that is held by the application delegate.\n\n### Dismissing an Entry\nYou can dismiss the currently displayed entry by simply invoke *dismiss* in the SwiftEntryKit class, likewise:\n\n```Swift\nSwiftEntryKit.dismiss()\n```\nOr:\n\n```Swift\nSwiftEntryKit.dismiss(.displayed)\n```\n\nThis dismisses the entry animatedly using its *exitAnimation* attribute and on completion, the window would be removed as well.\n\nYou can dismiss the currently displayed entry and flush the queue as well, likewise:\n\n```Swift\nSwiftEntryKit.dismiss(.all)\n```\n\nOnly flush the queue, leaving any currently displayed entry to its natural lifecycle:\n\n```Swift\nSwiftEntryKit.dismiss(.queue)\n```\n\nDismiss a specific entry by name - either currently displayed or enqueued. All the entries with the given name are dismissed.\n\n```Swift\nSwiftEntryKit.dismiss(.specific(entryName: \"Entry Name\"))\n```\n\nDismiss any entry with a lower or equal display priority of `.normal`.\n\n```Swift\nSwiftEntryKit.dismiss(.prioritizedLowerOrEqualTo(priority: .normal))\n```\n\n#### Using a completion handler\n\nInject a trailing closure to be executed after the entry dismissal.\n\n```Swift\nSwiftEntryKit.dismiss {\n    // Executed right after the entry has been dismissed\n}\n```\n\n### Is Currently Displaying\nInquire whether an entry is currently displayed:\n```Swift\nif SwiftEntryKit.isCurrentlyDisplaying {\n    /* Do your things */\n}\n```\n\nInquire whether a **specific** entry is currently displayed using the `name` property inside `EKAttributes`.\n```Swift\nif SwiftEntryKit.isCurrentlyDisplaying(entryNamed: \"Top Note\") {\n/* Do your things */\n}\n```\n\n### Queue Contains\nInquire whether the queue of entries is not empty:\n```Swift\nif SwiftEntryKit.isQueueEmpty {\n    /* Do your things */\n}\n```\n\nInquire whether the queue of entries contains an entry with name:\n```Swift\nif SwiftEntryKit.queueContains(entryNamed: \"Custom-Name\") {\n    /* Do your things */\n}\n```\n\n### Swiping and Rubber Banding\nEntries can be panned vertically (This ability can be enabled using the *scroll* attributes). \nThefore it's only natural that an entry can be dismissed using a swipe-like gesture.\n\nEnable swipe gesture. When the swipe gesture fails (doesn't pass the velocity threshold) ease it back.\n```Swift\nattributes.scroll = .enabled(swipeable: true, pullbackAnimation: .easeOut)\n```\n\nEnable swipe gesture. When the swipe gesture fails throw it back out with a jolt.\n```Swift\nattributes.scroll = .enabled(swipeable: true, pullbackAnimation: .jolt)\n```\n\nThe *PullbackAnimation* values (duration, damping & initialSpringVelocity) can be customized as well.\n\nSwipe | Jolt |\n--- | --- |\n![swipe_example](https://github.com/huri000/assets/blob/master/swift-entrykit/swipe.gif) | ![band_example](https://github.com/huri000/assets/blob/master/swift-entrykit/rubber_band.gif) |\n\n### Dealing with safe area:\n*EKAttributes.PositionConstraints.SafeArea* may be used to override the safe area with the entry's content, or to fill the safe area with a background color (like [Toasts](https://github.com/huri000/assets/blob/master/swift-entrykit/toasts.gif) do), or even leave the safe area empty (Like [Floats](https://github.com/huri000/assets/blob/master/swift-entrykit/floats.gif) do).\n\nSwiftEntryKit supports iOS 11.x.y and is backward compatible to iOS 9.x.y, so the status bar area is treated as same as the safe area in earlier iOS versions.\n\n### Dealing with orientation change:\nSwiftEntryKit identifies orientation changes and adjust the entry's layout to those changes.\nTherefore, if you wish to limit the entries's width, you are able to do so by giving it a maximum value, likewise:\n\n```Swift\nvar attributes = EKAttributes.topFloat\n\n// Give the entry the width of the screen minus 20pts from each side, the height is decided by the content's contraint's\nattributes.positionConstraints.size = .init(width: .offset(value: 20), height: .intrinsic)\n\n// Give the entry maximum width of the screen minimum edge - thus the entry won't grow much when the device orientation changes from portrait to landscape mode.\nlet edgeWidth = min(UIScreen.main.bounds.width, UIScreen.main.bounds.height)\nattributes.positionConstraints.maxSize = .init(width: .constant(value: edgeWidth), height: .intrinsic)\n\nlet customView = UIView()\n/*\n... Customize the view as you like ...\n*/\n\n// Use class method of SwiftEntryKit to display the view using the desired attributes\nSwiftEntryKit.display(entry: customView, using: attributes)\n```\n\nOrientation Change Demonstration |\n--- |\n![orientation_change](https://github.com/huri000/assets/blob/master/swift-entrykit/orientation.gif)\n\n### Dark Mode in the Example Project\n\nYou can tinker with the display mode using a segmented control on presets screen, forcing light and dark modes.\nAll the presets are dark mode ready, but only some in the example project demonstrate dark mode capabilities.\n\n![light_dark](https://github.com/huri000/assets/blob/master/swift-entrykit/dark-light.gif)\n\n### Swift and Objective-C Interoperability\nSwiftEntryKit's APIs use the Swift language exclusive syntax (enums, associated values, and more). \nTherefore, `SwiftEntryKit` cannot be referenced directly from an Objective-C file (*.m*, *.h* or *.mm*).\n\nYet, it is pretty easy to integrate SwiftEntryKit into an Objective-C project using a simple *.swift* class that is a sort of adapter between `SwiftEntryKit` and your Objective-C code.\n\n[This project](https://github.com/huri000/ObjcEntryKitExample) demonstrates that using Carthage and CocoaPods.  \n\n## Author\n\nDaniel Huri, huri000@gmail.com\n\n## Donations\n\nDonations can be made by sending either Bitcoin or Ether to the following addresses.\n\n| BTC | ETH |\n| :---: | :---: | \n| 134TiBiUvVNt7Na5KXEFBSChLdgVDw1Hnr | 0xAe6616181FCdde4793AE749Ce21Cd5Af9333A3E2 |\n| ![btc_address](https://github.com/huri000/assets/blob/master/donate/btc-address.png) | ![eth_address](https://github.com/huri000/assets/blob/master/donate/eth-address.png) |\n\n## Thank You\n\nThanks Lily Azar, lilushkaa@gmail.com for those awesome preset icons. \n\n## Credits\n\n[**Icons Credits**](/CREDITS.md)\n\n## License\n\nSwiftEntryKit is available under the MIT license. See the [LICENSE](/LICENSE) file for more info.\n\n### Exceptions\nPlease be aware that any use of the icons inside the project requires attribution to the creator. See [credits](/CREDITS.md) for the creators list.\n"
  },
  {
    "path": "Source/Extensions/QuickLayout/QLCompatibility.swift",
    "content": "//\n//  QLCompatibility.swift\n//  Pods\n//\n//  Created by Daniel Huri on 5/12/18.\n//\n\nimport Foundation\nimport UIKit\n\npublic typealias QLAttribute = NSLayoutConstraint.Attribute\npublic typealias QLRelation = NSLayoutConstraint.Relation\npublic typealias QLView = UIView\npublic typealias QLPriority = UILayoutPriority\n"
  },
  {
    "path": "Source/Extensions/QuickLayout/QLUtils.swift",
    "content": "//\n//  QLUtils.swift\n//  QuickLayout\n//\n//  Created by Daniel Huri on 11/21/17.\n//\n\nimport Foundation\nimport UIKit\n\n/**\n Typealias for dictionary that contains multiple constraints\n */\npublic typealias QLMultipleConstraints = [QLAttribute: NSLayoutConstraint]\n\n/**\n Extends layout priority to other readable types\n */\npublic extension QLPriority {\n    static let must = QLPriority(rawValue: 999)\n    static let zero = QLPriority(rawValue: 0)\n}\n\n/**\n Represents pair of attributes\n */\npublic struct QLAttributePair {\n    public let first: QLAttribute\n    public let second: QLAttribute\n}\n\n/**\n Represents size constraints\n */\npublic struct QLSizeConstraints {\n    public let width: NSLayoutConstraint\n    public let height: NSLayoutConstraint\n}\n\n/**\n Represents center constraints\n */\npublic struct QLCenterConstraints {\n    public let x: NSLayoutConstraint\n    public let y: NSLayoutConstraint\n}\n\n/**\n Represents axis constraints (might be .top and .bottom, .left and .right, .leading and .trailing)\n */\npublic struct QLAxisConstraints {\n    public let first: NSLayoutConstraint\n    public let second: NSLayoutConstraint\n}\n\n/**\n Represents center and size constraints\n */\npublic struct QLFillConstraints {\n    public let center: QLCenterConstraints\n    public let size: QLSizeConstraints\n}\n\n/**\n Represents pair of priorities\n */\npublic struct QLPriorityPair {\n    \n    public let horizontal: QLPriority\n    public let vertical: QLPriority\n    public static var required: QLPriorityPair {\n        return QLPriorityPair(.required, .required)\n    }\n    \n    public static var must: QLPriorityPair {\n        return QLPriorityPair(.must, .must)\n    }\n    \n    public init(_ horizontal: QLPriority, _ vertical: QLPriority) {\n        self.horizontal = horizontal\n        self.vertical = vertical\n    }\n}\n\n/**\n Represents axis description\n */\npublic enum QLAxis {\n    case horizontally\n    case vertically\n    \n    public var attributes: QLAttributePair {\n        \n        let first: QLAttribute\n        let second: QLAttribute\n        \n        switch self {\n        case .horizontally:\n            first = .left\n            second = .right\n        case .vertically:\n            first = .top\n            second = .bottom\n        }\n        return QLAttributePair(first: first, second: second)\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/QuickLayout/UIView+QLContentWrap.swift",
    "content": "//\n//  QLView+QLContentWrap.swift\n//  QuickLayout\n//\n//  Created by Daniel Huri on 11/21/17.\n//\n\nimport Foundation\nimport UIKit\n\n\n// MARK: Content Compression Resistance & Content Hugging Priority\npublic extension QLView {\n\n    /**\n     Force hugging and compression resistance for the given axes, using variadic parameter.\n     - parameter axes: The axes\n     */\n    func forceContentWrap(_ axes: QLAxis...) {\n        if axes.contains(.vertically) {\n            verticalHuggingPriority = .required\n            verticalCompressionResistancePriority = .required\n        }\n        if axes.contains(.horizontally) {\n            horizontalHuggingPriority = .required\n            horizontalCompressionResistancePriority = .required\n        }\n    }\n    \n    /**\n     Force hugging and compression resistance vertically and horizontally.\n     */\n    func forceContentWrap() {\n        contentHuggingPriority = .required\n        contentCompressionResistancePriority = .required\n    }\n    \n    /**\n     Vertical hugging priority\n     */\n    var verticalHuggingPriority: QLPriority {\n        set {\n            setContentHuggingPriority(newValue, for: .vertical)\n        }\n        get {\n            return contentHuggingPriority(for: .vertical)\n        }\n    }\n    \n    /**\n     Horizontal hugging priority\n     */\n    var horizontalHuggingPriority: QLPriority {\n        set {\n            setContentHuggingPriority(newValue, for: .horizontal)\n        }\n        get {\n            return contentHuggingPriority(for: .horizontal)\n        }\n    }\n    \n    /**\n     Content hugging priority (Vertical & Horizontal)\n     */\n    var contentHuggingPriority: QLPriorityPair {\n        set {\n            horizontalHuggingPriority = newValue.horizontal\n            verticalHuggingPriority = newValue.vertical\n        }\n        get {\n            return QLPriorityPair(horizontalHuggingPriority, verticalHuggingPriority)\n        }\n    }\n    \n    /**\n     Vertical content compression resistance priority\n     */\n    var verticalCompressionResistancePriority: QLPriority {\n        set {\n            setContentCompressionResistancePriority(newValue, for: .vertical)\n        }\n        get {\n            return contentCompressionResistancePriority(for: .vertical)\n        }\n    }\n    \n    /**\n     Horizontal content compression resistance priority\n     */\n    var horizontalCompressionResistancePriority: QLPriority {\n        set {\n            setContentCompressionResistancePriority(newValue, for: .horizontal)\n        }\n        get {\n            return contentCompressionResistancePriority(for: .horizontal)\n        }\n    }\n    \n    /**\n    Content compression resistance priority (Vertical & Horizontal)\n     */\n    var contentCompressionResistancePriority: QLPriorityPair {\n        set {\n            horizontalCompressionResistancePriority = newValue.horizontal\n            verticalCompressionResistancePriority = newValue.vertical\n        }\n        get {\n            return QLPriorityPair(horizontalCompressionResistancePriority, verticalCompressionResistancePriority)\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/QuickLayout/UIView+QuickLayout.swift",
    "content": "//\n//  QLView+QuickLayout.swift\n//  QuickLayout\n//\n//  Created by Daniel Huri on 11/19/17.\n//\n\nimport Foundation\nimport UIKit\n\npublic extension QLView {\n    \n    /**\n     Set constant value of an edge.\n     Should be used with *width* or *height*\n     - parameter edge: Edge type.\n     - parameter value: Edge size.\n     - parameter relation: Relation to the given constant value (default is *.equal*).\n     - parameter ratio: Ratio of the cconstant constraint to actual given value (default is *1*)\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: The applied constraint (discardable).\n     */\n    @discardableResult\n    func set(_ edge: QLAttribute, of value: CGFloat, relation: QLRelation = .equal,\n             ratio: CGFloat = 1.0, priority: QLPriority = .required) -> NSLayoutConstraint {\n        if translatesAutoresizingMaskIntoConstraints {\n            translatesAutoresizingMaskIntoConstraints = false\n        }\n        let constraint = NSLayoutConstraint(item: self, attribute: edge, relatedBy: relation, toItem: nil, attribute: .notAnAttribute, multiplier: ratio, constant: value)\n        constraint.priority = priority\n        addConstraint(constraint)\n        return constraint\n    }\n    \n    /**\n     Set constant value for multiple edges simultaniously, using variadic parameter.\n     Should be used with *width* or *height*\n     - parameter edges: Edge types.\n     - parameter value: Edges size.\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: The applied constraints in QLMultipleConstraints - see definition (discardable).\n     */\n    @discardableResult\n    func set(_ edges: QLAttribute..., of value: CGFloat, relation: QLRelation = .equal,\n             ratio: CGFloat = 1.0, priority: QLPriority = .required) -> QLMultipleConstraints {\n        return set(edges, to: value, relation: relation, ratio: ratio, priority: priority)\n    }\n    \n    /** **PRIVATELY USED** AS A REPLACEMENT for the variadic version for the method*/\n    @discardableResult\n    func set(_ edges: [QLAttribute], to value: CGFloat, relation: QLRelation = .equal,\n             ratio: CGFloat = 1.0, priority: QLPriority = .required) -> QLMultipleConstraints {\n        var constraints: QLMultipleConstraints = [:]\n        let uniqueEdges = Set(edges)\n        for edge in uniqueEdges {\n            let constraint = set(edge, of: value, priority: priority)\n            constraints[edge] = constraint\n        }\n        return constraints\n    }\n    \n    /**\n     Layout edge to another view's edge.\n     - You can optionally define relation, ratio, constant and priority (each gets a default value)\n     - For example - Can be used to align self *left* edge to the *right* of another view.\n     - *self* and *view* must be directly connected (siblings / child-parent) in the view hierarchy.\n     - *superview* must not be *nil*.\n     - parameter edge: The edge of the first view. If not sent or *nil* - The function automatically assumes *edge* to be *otherEdge*\n     - parameter otherEdge: The edge of the second view.\n     - parameter view: The second view that self must be aligned with.\n     - parameter relation: The relation of the first edge to the second edge (default is .equal)\n     - parameter ratio: The ratio of the edge in relative to the superview edge (default is 1).\n     - parameter offset: Additional offset which is applied to the constraint (default is 0).\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: The instance of the constraint that was applied (discardable). nil if method failed to apply the constraint.\n     */\n    @discardableResult\n    func layout(_ edge: QLAttribute? = nil, to otherEdge: QLAttribute, of view: QLView,\n                relation: QLRelation = .equal, ratio: CGFloat = 1.0, offset: CGFloat = 0,\n                priority: QLPriority = .required) -> NSLayoutConstraint? {\n        guard isValidForQuickLayout else {\n            print(\"\\(String(describing: self)) Error in func: \\(#function)\")\n            return nil\n        }\n        let constraint = NSLayoutConstraint(item: self, attribute: edge ?? otherEdge, relatedBy: relation, toItem: view, attribute: otherEdge, multiplier: ratio, constant: offset)\n        constraint.priority = priority\n        superview!.addConstraint(constraint)\n        return constraint\n    }\n    \n    /**\n     Layout multiple edges of the view to the corresonding edges of another given view.\n     - You can optionally define relation, ratio, constant and priority (each gets a default value)\n     - For example - Can be used to align self *left* and *right* edges the same edge of another given view.\n     - *self* and *view* must be directly connected (siblings / child-parent) in the view hierarchy.\n     - *superview* must not be *nil*.\n     - parameter edges: The view edges\n     - parameter view: Another view that self must be aligned with.\n     - parameter relation: The relation of the edges. Can be applied to *.width* or *height* for example. (default is *.equal*).\n     - parameter ratio: The ratio of the edges to the other view edges (default is 1).\n     - parameter offset: Additional offset which is applied to each of the constraints (default is 0).\n     - parameter priority: Constraints' priority (default is *.required*).\n     - returns: The instance of the constraint that was applied (discardable). *nil* if the method failed to apply the constraint.\n     */\n    @discardableResult\n    func layout(_ edges: QLAttribute..., to view: QLView, relation: QLRelation = .equal,\n                ratio: CGFloat = 1.0, offset: CGFloat = 0,\n                priority: QLPriority = .required) -> QLMultipleConstraints {\n        var constraints: QLMultipleConstraints = [:]\n        guard isValidForQuickLayout else {\n            print(\"\\(String(describing: self)) Error in func: \\(#function)\")\n            return constraints\n        }\n        let uniqueEdges = Set(edges)\n        for edge in uniqueEdges {\n            let constraint = NSLayoutConstraint(item: self, attribute: edge, relatedBy: relation, toItem: view, attribute: edge, multiplier: ratio, constant: offset)\n            constraint.priority = priority\n            superview!.addConstraint(constraint)\n            constraints[edge] = constraint\n        }\n        return constraints\n    }\n    \n    /**\n     Layout edge to the same edge of superview.\n     - Example of usage: *view.layoutToSuperview(.top)* makes *view* cling to the *top* of it's *superview*.\n     - You can optionally define ratio, constant and priority (each gets a default value)\n     - *superview* must not be *nil*.\n     - parameter edge: The edge (.width, .height, .left, .right, .leading, .trailing, etc...)\n     - parameter relation: The relation of the edge to the superview's corresponding edge (default is *.equal*)\n     - parameter ratio: The ratio of the edge in relative to the superview edge (default is 1).\n     - parameter offset: Additional offset from that can be applied to the constraint (default is 0).\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: The instance of the constraint that was applied (discardable). Nil if method failed to apply constraint.\n     */\n    @discardableResult\n    func layoutToSuperview(_ edge: QLAttribute, relation: QLRelation = .equal,\n                           ratio: CGFloat = 1, offset: CGFloat = 0,\n                           priority: QLPriority = .required) -> NSLayoutConstraint? {\n        guard isValidForQuickLayout else {\n            print(\"\\(String(describing: self)) Error in func: \\(#function)\")\n            return nil\n        }\n        let constraint = NSLayoutConstraint(item: self, attribute: edge, relatedBy: relation, toItem: superview, attribute: edge, multiplier: ratio, constant: offset)\n        constraint.priority = priority\n        superview!.addConstraint(constraint)\n        return constraint\n    }\n    \n    /**\n     Layout multiple edges to the same edges as superview, using variadic parameter.\n     Example for edges value:\n     - You can optionally define ratio, constant and priority (each gets a default value)\n     - *superview* must not be *nil*.\n     - parameter edges: The edges (.width, .height, .left, .right, .leading, .trailing, etc...)\n     - parameter relation: The relation of the edges to the superview's corresponding edges (default is *.equal*)\n     - parameter ratio: The ratio of the edges in relative to the superview edge (default is 1).\n     - parameter offset: Additional offset from that can be applied to the constraints (default is 0).\n     - parameter priority: Constraints' priority (default is *.required*).\n     - returns: The instance of QLMultipleConstraints - see type definition (discardable).\n     */\n    @discardableResult\n    func layoutToSuperview(_ edges: QLAttribute..., relation: QLRelation = .equal,\n                           ratio: CGFloat = 1, offset: CGFloat = 0,\n                           priority: QLPriority = .required) -> QLMultipleConstraints {\n        var constraints: QLMultipleConstraints = [:]\n        guard !edges.isEmpty && isValidForQuickLayout else {\n            return constraints\n        }\n        let uniqueEdges = Set(edges)\n        for edge in uniqueEdges {\n            let constraint = NSLayoutConstraint(item: self, attribute: edge, relatedBy: relation, toItem: superview, attribute: edge, multiplier: ratio, constant: offset)\n            constraint.priority = priority\n            superview!.addConstraint(constraint)\n            constraints[edge] = constraint\n        }\n        return constraints\n    }\n    \n    /**\n     Layout to one of the superview's axes.\n     - You can optionally define ratio, constant and priority (each gets a default value)\n     - *superview* must not be *nil*.\n     - parameter axis: The axis to which the view must be stretched (horizontally or vertically)\n     - parameter offset: Represents an additional edge offset from that can be applied to the constraints (default is 0)\n     - parameter priority: Represents constraint's priority (default is *.required*)\n     - returns: The instance of the constraint that was applied (discardable).\n     */\n    @discardableResult\n    func layoutToSuperview(axis: QLAxis, offset: CGFloat = 0,\n                           priority: QLPriority = .required) -> QLAxisConstraints? {\n        let attributes = axis.attributes\n        guard let first = layoutToSuperview(attributes.first, offset: offset, priority: priority) else {\n            return nil\n        }\n        guard let second = layoutToSuperview(attributes.second, offset: -offset, priority: priority) else {\n            return nil\n        }\n        return QLAxisConstraints(first: first, second: second)\n    }\n    \n    /**\n     Size to superview with a given ratio and constant\n     - *superview* must not be *nil*.\n     - parameter ratio: The ratio of view to the size of superview.\n     - parameter offset: Represents an additional edge offset from that can be applied to the size (default is 0)\n     - parameter priority: Represents constraint's priority (default is *.required*)\n     - returns: The instance of QLSizeConstraints - see definition (discardable).\n     */\n    @discardableResult\n    func sizeToSuperview(withRatio ratio: CGFloat = 1, offset: CGFloat = 0,\n                         priority: QLPriority = .required) -> QLSizeConstraints? {\n        let size = layoutToSuperview(.width, .height, ratio: ratio, offset: offset, priority: priority)\n        guard !size.isEmpty else {\n            return nil\n        }\n        return QLSizeConstraints(width: size[.width]!, height: size[.height]!)\n    }\n    \n    /**\n     Center in superview with an optional offset\n     - *superview* must not be *nil*.\n     - parameter offset: Represents an additional offset from the center (default is 0)\n     - parameter priority: Represents constraint's priority (default is *.required*)\n     - returns: The instance of QLCenterConstraints - see definition (discardable).\n     */\n    @discardableResult\n    func centerInSuperview(offset: CGFloat = 0, priority: QLPriority = .required) -> QLCenterConstraints? {\n        let center = layoutToSuperview(.centerX, .centerY, offset: offset)\n        guard !center.isEmpty else {\n            return nil\n        }\n        return QLCenterConstraints(x: center[.centerX]!, y: center[.centerY]!)\n    }\n    \n    /**\n     Fill superview totally (center and size to superview)\n     - *superview* must not be *nil*.\n     - parameter ratio: Ratio to the superview's size (default is 1)\n     - parameter offset: Offset from center (default is 0)\n     - parameter priority: Represents constraint's priority (default is *.required*)\n     - returns: The instance of QLFillConstraints - see definition (discardable).\n     */\n    @discardableResult\n    func fillSuperview(withSizeRatio ratio: CGFloat = 1, offset: CGFloat = 0,\n                       priority: QLPriority = .required) -> QLFillConstraints? {\n        guard let center = centerInSuperview(priority: priority) else {\n            return nil\n        }\n        guard let size = sizeToSuperview(withRatio: ratio, offset: offset, priority: priority) else {\n            return nil\n        }\n        return QLFillConstraints(center: center, size: size)\n    }\n    \n    /** **PRIVATELY USED** to test for validation*/\n    var isValidForQuickLayout: Bool {\n        guard superview != nil else {\n            print(\"\\(String(describing: self)):\\(#function) - superview is unexpectedly nullified\")\n            return false\n        }\n        if translatesAutoresizingMaskIntoConstraints {\n            translatesAutoresizingMaskIntoConstraints = false\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/QuickLayout/UIViewArray+QuickLayout.swift",
    "content": "//\n//  QLViewArray+QuickLayout.swift\n//  QuickLayout\n//\n//  Created by Daniel Huri on 11/20/17.\n//\n\nimport Foundation\nimport UIKit\n\n// MARK: Multiple Views in Array\npublic extension Array where Element: QLView {\n    \n    /**\n     All elements in the collection recieve constant value for the given edge.\n     - parameter edge: Should be used with *.width* or *.height*.\n     - parameter value: The size of the edge.\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: The instance of the constraint that was applied (discardable).\n     */\n    @discardableResult\n    func set(_ edge: QLAttribute, of value: CGFloat,\n             priority: QLPriority = .required) -> [NSLayoutConstraint] {\n        var constraints: [NSLayoutConstraint] = []\n        for view in self {\n            let constraint = view.set(edge, of: value)\n            constraints.append(constraint)\n        }\n        return constraints\n    }\n    \n    /**\n     All elements in the collection recieve constant value for the given edges, using variadic parameter.\n     - parameter edges: Should be used with *.width* or *.height*.\n     - parameter value: The size of the edge.\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: The instance of the constraint that was applied (discardable).\n     */\n    @discardableResult\n    func set(_ edges: QLAttribute..., of value: CGFloat,\n             priority: QLPriority = .required) -> [QLMultipleConstraints] {\n        var constraintsArray: [QLMultipleConstraints] = []\n        for view in self {\n            let constraints = view.set(edges, to: value, priority: priority)\n            constraintsArray.append(constraints)\n        }\n        return constraintsArray\n    }\n    \n    /**\n     Spread elements consecutively according to the given axis.\n     - parameter axis: The axis: *.vertically*, *horizontally*\n     - parameter stretchEdgesToSuperview: Decides whether the first and last items in the array must be clipped to their parent edges.\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: Array of constraints that were applied (discardable)\n     */\n    @discardableResult\n    func spread(_ axis: QLAxis, stretchEdgesToSuperview: Bool = false, offset: CGFloat = 0,\n                priority: QLPriority = .required) -> [NSLayoutConstraint] {\n        guard isValidForQuickLayout else {\n            return []\n        }\n        let attributes = axis.attributes\n        var constraints: [NSLayoutConstraint] = []\n        \n        if stretchEdgesToSuperview {\n            let constraint = first!.layoutToSuperview(attributes.first, offset: offset)!\n            constraints.append(constraint)\n        }\n        \n        for (index, view) in enumerated() {\n            guard index > 0 else {\n                continue\n            }\n            let previousView = self[index - 1]\n            let constraint = view.layout(attributes.first, to: attributes.second, of: previousView, offset: offset, priority: priority)!\n            constraints.append(constraint)\n        }\n        \n        if stretchEdgesToSuperview {\n            let constraint = last!.layoutToSuperview(attributes.second, offset: -offset)!\n            constraints.append(constraint)\n        }\n        \n        return constraints\n    }\n    \n    /**\n     Layout elements to superview's axis\n     - parameter axis: The axis: *.vertically*, *horizontally*\n     - parameter offset: Additional side offset that must be applied (identical spacing from each side)\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: Array of QLAxisConstraints - see definition (discardable)\n     */\n    @discardableResult\n    func layoutToSuperview(axis: QLAxis, offset: CGFloat = 0,\n                           priority: QLPriority = .required) -> [QLAxisConstraints] {\n        \n        let attributes = axis.attributes\n        \n        let firstConstraints = layoutToSuperview(attributes.first, offset: offset, priority: priority)\n        guard !firstConstraints.isEmpty else {\n            return []\n        }\n        \n        let secondConstraints = layoutToSuperview(attributes.second, offset: -offset, priority: priority)\n        guard !secondConstraints.isEmpty else {\n            return []\n        }\n        \n        var constraints: [QLAxisConstraints] = []\n        for (first, second) in zip(firstConstraints, secondConstraints) {\n            constraints.append(QLAxisConstraints(first: first, second: second))\n        }\n        \n        return constraints\n    }\n    \n    /**\n     Layout elements' edges to superview's edge (The same edge - top to top, bottom to bottom, etc...)\n     - parameter edge: The edge of the view / superview\n     - parameter ratio: The ratio of the edge in relation to the superview's (default is 1).\n     - parameter offset: Additional offset from that must be applied to the constraint (default is 0).\n     - parameter priority: Constraint's priority (default is *.required*).\n     - returns: Array of applied constraints - see definition (discardable)\n     */\n    @discardableResult\n    func layoutToSuperview(_ edge: QLAttribute, ratio: CGFloat = 1, offset: CGFloat = 0,\n                           priority: QLPriority = .required) -> [NSLayoutConstraint] {\n        guard isValidForQuickLayout else {\n            return []\n        }\n        return layout(to: edge, of: first!.superview!, ratio: ratio, offset: offset, priority: priority)\n    }\n    \n    /**\n     Layout elements' edges to to anchorView edge\n     - parameter firstEdge: The edge of the elements in the array\n     - parameter anchorEdge: The edge of the anchor view\n     - parameter anchorView: The anchor view\n     - parameter ratio: The ratio of the edge in relative to the superview edge (default is 1).\n     - parameter offset: Additional offset from that can be applied to the constraints (default is 0).\n     - parameter priority: Constraints' priority (default is *.required*).\n     - returns: Array of applied constraints - see definition (discardable)\n     */\n    @discardableResult\n    func layout(_ firstEdge: QLAttribute? = nil, to anchorEdge: QLAttribute,\n                of anchorView: QLView, ratio: CGFloat = 1, offset: CGFloat = 0,\n                priority: QLPriority = .required) -> [NSLayoutConstraint] {\n        guard isValidForQuickLayout else {\n            return []\n        }\n        \n        let edge: QLAttribute\n        if let firstEdge = firstEdge {\n            edge = firstEdge\n        } else {\n            edge = anchorEdge\n        }\n        \n        var result: [NSLayoutConstraint] = []\n        for view in self {\n            let constraint = view.layout(edge, to: anchorEdge, of: anchorView, ratio: ratio, offset: offset, priority: priority)!\n            result.append(constraint)\n        }\n        return result\n    }\n    \n    /**\n     Layout elements' multiple edges to to anchorView's same edges (top to top, bottom to bottom, etc...)\n     - parameter edges: The edges of the view - variadic parameter\n     - parameter anchorView: The anchor view\n     - parameter ratio: The ratio of the edge in relative to the superview edge (default is 1).\n     - parameter offset: Additional offset from that can be applied to the constraints (default is 0).\n     - parameter priority: Constraints' priority (default is *.required*).\n     - returns: Array of applied constraints, each element is of type QLMultipleConstraints - see definition (discardable)\n     */\n    @discardableResult\n    func layout(_ edges: QLAttribute..., to anchorView: QLView,\n                ratio: CGFloat = 1, offset: CGFloat = 0,\n                priority: QLPriority = .required) -> [QLMultipleConstraints] {\n        guard !edges.isEmpty && isValidForQuickLayout else {\n            return []\n        }\n        // Avoid duplicities\n        let uniqueEdges = Set(edges)\n        var result: [QLMultipleConstraints] = []\n        for view in self {\n            var multipleConstraints: QLMultipleConstraints = [:]\n            for edge in uniqueEdges {\n                let constraint = view.layout(to: edge, of: anchorView, ratio: ratio, offset: offset, priority: priority)!\n                multipleConstraints[edge] = constraint\n            }\n            result.append(multipleConstraints)\n        }\n        return result\n    }\n    \n    /** **PRIVATELY USED** to test for validation*/\n    var isValidForQuickLayout: Bool {\n        guard !isEmpty else {\n            print(\"\\(String(describing: self)) Error in func: \\(#function), Views collection is empty!\")\n            return false\n        }\n        \n        for view in self {\n            guard view.isValidForQuickLayout else {\n                print(\"\\(String(describing: self)) Error in func: \\(#function)\")\n                return false\n            }\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/UIApplication+EKAppearance.swift",
    "content": "//\n//  UIApplication+EKAppearance.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nextension UIApplication {\n    \n    func set(statusBarStyle: EKAttributes.StatusBar) {\n        let appearance = statusBarStyle.appearance\n        UIApplication.shared.isStatusBarHidden = !appearance.visible\n        UIApplication.shared.statusBarStyle = appearance.style\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/UIColor+Utils.swift",
    "content": "//\n//  UIColor+Utils.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel on 21/07/2019.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nextension UIColor {    \n    convenience init(red: Int, green: Int, blue: Int) {\n        assert(red >= 0 && red <= 255, \"Invalid red component\")\n        assert(green >= 0 && green <= 255, \"Invalid green component\")\n        assert(blue >= 0 && blue <= 255, \"Invalid blue component\")\n        \n        self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)\n    }\n    \n    convenience init(rgb: Int) {\n        self.init(\n            red: (rgb >> 16) & 0xFF,\n            green: (rgb >> 8) & 0xFF,\n            blue: rgb & 0xFF\n        )\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/UIEdgeInsets+Utils.swift",
    "content": "//\n//  UIEdgeInsets.swift\n//  FBSnapshotTestCase\n//\n//  Created by Daniel Huri on 4/21/18.\n//\n\nimport UIKit\n\nextension UIEdgeInsets {\n    var hasVerticalInsets: Bool {\n        return top > 0 || bottom > 0\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/UIRectCorner+Short.swift",
    "content": "//\n//  UIView+FrameStyle.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/24/18.\n//\n\nimport Foundation\nimport UIKit\n\nextension UIRectCorner {\n    static let top: UIRectCorner = [.topLeft, .topRight]\n    static let bottom: UIRectCorner = [.bottomLeft, .bottomRight]\n    static let none: UIRectCorner = []\n}\n"
  },
  {
    "path": "Source/Extensions/UIView+Shadow.swift",
    "content": "//\n//  UIView+Shadow.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/25/18.\n//\n\nimport UIKit\n\nextension UIView {\n    func applyDropShadow(withOffset offset: CGSize,\n                         opacity: Float,\n                         radius: CGFloat,\n                         color: UIColor) {\n        layer.applyDropShadow(withOffset: offset,\n                              opacity: opacity,\n                              radius: radius,\n                              color: color)\n    }\n    \n    func removeDropShadow() {\n        layer.removeDropShadow()\n    }\n}\n\nextension CALayer {\n    func applyDropShadow(withOffset offset: CGSize,\n                         opacity: Float,\n                         radius: CGFloat,\n                         color: UIColor) {\n        shadowOffset = offset\n        shadowOpacity = opacity\n        shadowRadius = radius\n        shadowColor = color.cgColor\n        shouldRasterize = true\n        rasterizationScale = UIScreen.main.scale\n    }\n    \n    func removeDropShadow() {\n        shadowOffset = .zero\n        shadowOpacity = 0\n        shadowRadius = 0\n        shadowColor = UIColor.clear.cgColor\n        shouldRasterize = false\n    }\n}\n"
  },
  {
    "path": "Source/Extensions/UIView+Utils.swift",
    "content": "//\n//  UILabel+Message.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 04/14/2018.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nextension UILabel {\n    var style: EKProperty.LabelStyle {\n        set {\n            font = newValue.font\n            textColor = newValue.color(for: traitCollection)\n            textAlignment = newValue.alignment\n            numberOfLines = newValue.numberOfLines\n        }\n        get {\n            return EKProperty.LabelStyle(font: font,\n                                         color: EKColor(textColor),\n                                         alignment: textAlignment,\n                                         numberOfLines: numberOfLines)\n        }\n    }\n    \n    var content: EKProperty.LabelContent {\n        set {\n            text = newValue.text\n            accessibilityIdentifier = newValue.accessibilityIdentifier\n            style = newValue.style\n        }\n        get {\n            return EKProperty.LabelContent(text: text ?? \"\", style: style)\n        }\n    }\n}\n\nextension UIButton {\n    var buttonContent: EKProperty.ButtonContent {\n        set {\n            setTitle(newValue.label.text, for: .normal)\n            setTitleColor(newValue.label.style.color(for: traitCollection), for: .normal)\n            titleLabel?.font = newValue.label.style.font\n            accessibilityIdentifier = newValue.accessibilityIdentifier\n            backgroundColor = newValue.backgroundColor.color(\n                for: traitCollection,\n                mode: newValue.displayMode\n            )\n        }\n        get {\n            fatalError(\"buttonContent doesn't have a getter\")\n        }\n    }\n}\n\nextension UIImageView {\n    var imageContent: EKProperty.ImageContent {\n        set {\n            stopAnimating()\n            if newValue.images.count == 1 {\n                image = newValue.images.first\n            } else {\n                animationImages = newValue.images.map {\n                    $0.withRenderingMode(.alwaysTemplate)\n                }\n                animationDuration = newValue.imageSequenceAnimationDuration\n            }\n            \n            contentMode = newValue.contentMode\n            tintColor = newValue.tint?.color(for: traitCollection,\n                                             mode: newValue.displayMode)\n            accessibilityIdentifier = newValue.accessibilityIdentifier\n            \n            if let size = newValue.size {\n                set(.width, of: size.width)\n                set(.height, of: size.height)\n            } else {\n                forceContentWrap()\n            }\n            \n            if newValue.makesRound {\n                clipsToBounds = true\n                if let size = newValue.size {\n                    layer.cornerRadius = min(size.width, size.height) * 0.5\n                } else {\n                    layoutIfNeeded()\n                    layer.cornerRadius = min(bounds.width, bounds.height) * 0.5\n                }\n            }\n            \n            startAnimating()\n            \n            if case .animate(duration: let duration,\n                             options: let options,\n                             transform: let transform) = newValue.animation {\n                let options: UIView.AnimationOptions = [.repeat, .autoreverse, options]\n                // A hack that forces the animation to run on the main thread,\n                // on one of the next run loops\n                DispatchQueue.main.async {\n                    UIView.animate(withDuration: duration,\n                                   delay: 0,\n                                   options: options,\n                                   animations: {\n                        self.transform = transform\n                    }, completion: nil)\n                }\n            }\n        }\n        get {\n            fatalError(\"imageContent doesn't have a getter\")\n        }\n    }\n}\n\nextension UITextField {\n    \n    var placeholder: EKProperty.LabelContent {\n        set {\n            attributedPlaceholder = NSAttributedString(\n                string: newValue.text,\n                attributes: [\n                    .font: newValue.style.font,\n                    .foregroundColor: newValue.style.color(for: traitCollection)\n                ]\n            )\n        }\n        get {\n            fatalError(\"placeholder doesn't have a getter\")\n        }\n    }\n    \n    var textFieldContent: EKProperty.TextFieldContent {\n        set {\n            placeholder = newValue.placeholder\n            keyboardType = newValue.keyboardType\n            textColor = newValue.textStyle.color(for: traitCollection)\n            font = newValue.textStyle.font\n            textAlignment = newValue.textStyle.alignment\n            isSecureTextEntry = newValue.isSecure\n            text = newValue.textContent\n            tintColor = newValue.tintColor(for: traitCollection)\n            accessibilityIdentifier = newValue.accessibilityIdentifier\n        }\n        get {\n            fatalError(\"textFieldContent doesn't have a getter\")\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKBackgroundView.swift",
    "content": "//\n//  EKBackgroundView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class EKBackgroundView: EKStyleView {\n\n    struct Style {\n        let background: EKAttributes.BackgroundStyle\n        let displayMode: EKAttributes.DisplayMode\n    }\n    \n    // MARK: Props\n    private let visualEffectView: UIVisualEffectView\n    private let imageView: UIImageView\n    private let gradientView: GradientView\n    \n    // MARK: Setup\n    init() {\n        imageView = UIImageView()\n        visualEffectView = UIVisualEffectView(effect: nil)\n        gradientView = GradientView()\n        super.init(frame: UIScreen.main.bounds)\n        \n        addSubview(imageView)\n        imageView.contentMode = .scaleAspectFill\n        imageView.fillSuperview()\n        \n        addSubview(visualEffectView)\n        visualEffectView.fillSuperview()\n        \n        addSubview(gradientView)\n        gradientView.fillSuperview()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    // Background setter\n    var style: Style! {\n        didSet {\n            guard let style = style else {\n                return\n            }\n            var gradient: EKAttributes.BackgroundStyle.Gradient?\n            var backgroundEffect: UIBlurEffect?\n            var backgroundColor: UIColor = .clear\n            var backgroundImage: UIImage?\n            \n            switch style.background {\n            case .color(color: let color):\n                backgroundColor = color.color(for: traitCollection,\n                                              mode: style.displayMode)\n            case .gradient(gradient: let value):\n                gradient = value\n            case .image(image: let image):\n                backgroundImage = image\n            case .visualEffect(style: let value):\n                backgroundEffect = value.blurEffect(for: traitCollection,\n                                                    mode: style.displayMode)\n            case .clear:\n                break\n            }\n        \n            gradientView.style = GradientView.Style(gradient: gradient,\n                                                    displayMode: style.displayMode)\n            visualEffectView.effect = backgroundEffect\n            layer.backgroundColor = backgroundColor.cgColor\n            imageView.image = backgroundImage\n        }\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        guard let style = style else { return }\n        switch style.background {\n        case .color(color: let color):\n            layer.backgroundColor = color.color(for: traitCollection,\n                                                mode: style.displayMode).cgColor\n        case .visualEffect(style: let value):\n            visualEffectView.effect = value.blurEffect(for: traitCollection,\n                                                       mode: style.displayMode)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKContentView.swift",
    "content": "//\n//  EKScrollView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nprotocol EntryContentViewDelegate: AnyObject {\n    func changeToActive(withAttributes attributes: EKAttributes)\n    func changeToInactive(withAttributes attributes: EKAttributes, pushOut: Bool)\n    func didFinishDisplaying(entry: EKEntryView, keepWindowActive: Bool, dismissCompletionHandler: SwiftEntryKit.DismissCompletionHandler?)\n}\n\nclass EKContentView: UIView {\n    \n    enum OutTranslation {\n        case exit\n        case pop\n        case swipeDown\n        case swipeUp\n    }\n    \n    struct OutTranslationAnchor {\n        var messageOut: QLAttribute\n        var screenOut: QLAttribute\n        \n        init(_ messageOut: QLAttribute, to screenOut: QLAttribute) {\n            self.messageOut = messageOut\n            self.screenOut = screenOut\n        }\n    }\n    \n    // MARK: Props\n    \n    // Entry delegate\n    private weak var entryDelegate: EntryContentViewDelegate!\n    \n    // Constraints and Offsets\n    private var entranceOutConstraint: NSLayoutConstraint!\n    private var exitOutConstraint: NSLayoutConstraint!\n    private var swipeDownOutConstraint: NSLayoutConstraint!\n    private var swipeUpOutConstraint: NSLayoutConstraint!\n    private var popOutConstraint: NSLayoutConstraint!\n    private var inConstraint: NSLayoutConstraint!\n    private var resistanceConstraint: NSLayoutConstraint!\n    private var inKeyboardConstraint: NSLayoutConstraint!\n    \n    private var inOffset: CGFloat = 0\n    private var totalTranslation: CGFloat = 0\n    private var verticalLimit: CGFloat = 0\n    private let swipeMinVelocity: CGFloat = 60\n    \n    private var outDispatchWorkItem: DispatchWorkItem!\n\n    private var keyboardState = KeyboardState.hidden\n    \n    // Dismissal handler\n    var dismissHandler: SwiftEntryKit.DismissCompletionHandler?\n    \n    // Data source\n    private var attributes: EKAttributes {\n        return contentView.attributes\n    }\n    \n    // Content\n    private var contentView: EKEntryView!\n    \n    // MARK: Setup\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    init(withEntryDelegate entryDelegate: EntryContentViewDelegate) {\n        self.entryDelegate = entryDelegate\n        super.init(frame: .zero)\n    }\n    \n    // Called from outer scope with a presentable view and attributes\n    func setup(with contentView: EKEntryView) {\n        \n        self.contentView = contentView\n        \n        // Execute willAppear lifecycle action if needed\n        contentView.attributes.lifecycleEvents.willAppear?()\n        \n        // Setup attributes\n        setupAttributes()\n\n        // Setup initial position\n        setupInitialPosition()\n        \n        // Setup width, height and maximum width\n        setupLayoutConstraints()\n        \n        // Animate in\n        animateIn()\n        \n        // Setup tap gesture\n        setupTapGestureRecognizer()\n        \n        // Generate haptic feedback\n        generateHapticFeedback()\n        \n        setupKeyboardChangeIfNeeded()\n    }\n    \n    // Setup the scrollView initial position\n    private func setupInitialPosition() {\n        \n        // Determine the layout entrance type according to the entry type\n        let messageInAnchor: NSLayoutConstraint.Attribute\n        \n        inOffset = 0\n        \n        var totalEntryHeight: CGFloat = 0\n        \n        // Define a spacer to catch top / bottom offsets\n        var spacerView: UIView!\n        let safeAreaInsets = EKWindowProvider.safeAreaInsets\n        let overrideSafeArea = attributes.positionConstraints.safeArea.isOverridden\n        \n        if !overrideSafeArea && safeAreaInsets.hasVerticalInsets && !attributes.position.isCenter {\n            spacerView = UIView()\n            addSubview(spacerView)\n            spacerView.set(.height, of: safeAreaInsets.top)\n            spacerView.layoutToSuperview(.width, .centerX)\n            \n            totalEntryHeight += safeAreaInsets.top\n        }\n        \n        switch attributes.position {\n        case .top:\n            messageInAnchor = .top\n            inOffset = overrideSafeArea ? 0 : safeAreaInsets.top\n            inOffset += attributes.positionConstraints.verticalOffset\n            spacerView?.layout(.bottom, to: .top, of: self)\n        case .bottom:\n            messageInAnchor = .bottom\n            inOffset = overrideSafeArea ? 0 : -safeAreaInsets.bottom\n            inOffset -= attributes.positionConstraints.verticalOffset\n            spacerView?.layout(.top, to: .bottom, of: self)\n        case .center:\n            messageInAnchor = .centerY\n        }\n        \n        // Layout the content view inside the scroll view\n        addSubview(contentView)\n        contentView.layoutToSuperview(.left, .right, .top, .bottom)\n        contentView.layoutToSuperview(.width, .height)\n        \n        inConstraint = layout(to: messageInAnchor, of: superview!, offset: inOffset, priority: .defaultLow)\n        \n        // Set position constraints\n        setupOutConstraints(messageInAnchor: messageInAnchor)\n        \n        totalTranslation = inOffset\n        switch attributes.position {\n        case .top:\n            verticalLimit = inOffset\n        case .bottom, .center:\n            verticalLimit = UIScreen.main.bounds.height + inOffset\n        }\n        \n        // Setup keyboard constraints\n        switch attributes.positionConstraints.keyboardRelation {\n        case .bind(offset: let offset):\n            if let screenEdgeResistance = offset.screenEdgeResistance {\n                resistanceConstraint = layoutToSuperview(.top, relation: .greaterThanOrEqual, offset: screenEdgeResistance, priority: .defaultLow)\n            }\n            inKeyboardConstraint = layoutToSuperview(.bottom, priority: .defaultLow)\n        default:\n            break\n        }\n    }\n    \n    private func setupOutConstraint(animation: EKAttributes.Animation?, messageInAnchor: QLAttribute, priority: QLPriority) -> NSLayoutConstraint {\n        let constraint: NSLayoutConstraint\n        if let translation = animation?.translate {\n            var anchor: OutTranslationAnchor\n            switch translation.anchorPosition {\n            case .top:\n                anchor = OutTranslationAnchor(.bottom, to: .top)\n            case .bottom:\n                anchor = OutTranslationAnchor(.top, to: .bottom)\n            case .automatic where attributes.position.isTop:\n                anchor = OutTranslationAnchor(.bottom, to: .top)\n            case .automatic: // attributes.position.isBottom:\n                anchor = OutTranslationAnchor(.top, to: .bottom)\n            }\n            constraint = layout(anchor.messageOut, to: anchor.screenOut, of: superview!, priority: priority)!\n        } else {\n            constraint = layout(to: messageInAnchor, of: superview!, offset: inOffset, priority: priority)!\n        }\n        return constraint\n    }\n    \n    // Setup out constraints - taking into account the full picture and all the possible use-cases\n    private func setupOutConstraints(messageInAnchor: QLAttribute) {\n        \n        // Setup entrance and exit out constraints\n        entranceOutConstraint = setupOutConstraint(animation: attributes.entranceAnimation, messageInAnchor: messageInAnchor, priority: .must)\n        exitOutConstraint = setupOutConstraint(animation: attributes.exitAnimation, messageInAnchor: messageInAnchor, priority: .defaultLow)\n        swipeDownOutConstraint = layout(.top, to: .bottom, of: superview!, priority: .defaultLow)!\n        swipeUpOutConstraint = layout(.bottom, to: .top, of: superview!, priority: .defaultLow)!\n        \n        // Setup pop out constraint\n        var popAnimation: EKAttributes.Animation?\n        if case .animated(animation: let animation) = attributes.popBehavior {\n            popAnimation = animation\n        }\n        popOutConstraint = setupOutConstraint(animation: popAnimation, messageInAnchor: messageInAnchor, priority: .defaultLow)\n    }\n    \n    \n    private func setupSize() {\n        \n        // Layout the scroll view horizontally inside the screen\n        switch attributes.positionConstraints.size.width {\n        case .offset(value: let offset):\n            layoutToSuperview(axis: .horizontally, offset: offset, priority: .must)\n        case .ratio(value: let ratio):\n            layoutToSuperview(.width, ratio: ratio, priority: .must)\n        case .constant(value: let constant):\n            set(.width, of: constant, priority: .must)\n        case .intrinsic:\n            break\n        }\n        \n        // Layout the scroll view vertically inside the screen\n        switch attributes.positionConstraints.size.height {\n        case .offset(value: let offset):\n            layoutToSuperview(.height, offset: -offset * 2, priority: .must)\n        case .ratio(value: let ratio):\n            layoutToSuperview(.height, ratio: ratio, priority: .must)\n        case .constant(value: let constant):\n            set(.height, of: constant, priority: .must)\n        case .intrinsic:\n            break\n        }\n    }\n    \n    private func setupMaxSize() {\n        \n        // Layout the scroll view according to the maximum width (if given any)\n        switch attributes.positionConstraints.maxSize.width {\n        case .offset(value: let offset):\n            layout(to: .left, of: superview!, relation: .greaterThanOrEqual, offset: offset)\n            layout(to: .right, of: superview!, relation: .lessThanOrEqual, offset: -offset)\n        case .ratio(value: let ratio):\n            layoutToSuperview(.centerX)\n            layout(to: .width, of: superview!, relation: .lessThanOrEqual, ratio: ratio)\n        case .constant(value: let constant):\n            set(.width, of: constant, relation: .lessThanOrEqual)\n            break\n        case .intrinsic:\n            break\n        }\n        \n        // Layout the scroll view according to the maximum width (if given any)\n        switch attributes.positionConstraints.maxSize.height {\n        case .offset(value: let offset):\n            layout(to: .height, of: superview!, relation: .lessThanOrEqual, offset: -offset * 2)\n        case .ratio(value: let ratio):\n            layout(to: .height, of: superview!, relation: .lessThanOrEqual, ratio: ratio)\n        case .constant(value: let constant):\n            set(.height, of: constant, relation: .lessThanOrEqual)\n            break\n        case .intrinsic:\n            break\n        }\n    }\n    \n    // Setup layout constraints according to EKAttributes.PositionConstraints\n    private func setupLayoutConstraints() {\n        layoutToSuperview(.centerX)\n        setupSize()\n        setupMaxSize()\n    }\n\n    // Setup general attributes\n    private func setupAttributes() {\n        clipsToBounds = false\n        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureRecognized(gr:)))\n        panGestureRecognizer.isEnabled = attributes.scroll.isEnabled\n        addGestureRecognizer(panGestureRecognizer)\n    }\n    \n    // Setup tap gesture\n    private func setupTapGestureRecognizer() {\n        switch attributes.entryInteraction.defaultAction {\n        case .forward:\n            return\n        default:\n            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapGestureRecognized))\n            tapGestureRecognizer.numberOfTapsRequired = 1\n            tapGestureRecognizer.cancelsTouchesInView = false\n            addGestureRecognizer(tapGestureRecognizer)\n        }\n    }\n    \n    // Generate a haptic feedback if needed\n    private func generateHapticFeedback() {\n        guard #available(iOS 10.0, *) else {\n            return\n        }\n        HapticFeedbackGenerator.notification(type: attributes.hapticFeedbackType)\n    }\n    \n    // MARK: Animations\n    \n    // Schedule out animation\n    private func scheduleAnimateOut(withDelay delay: TimeInterval? = nil) {\n        outDispatchWorkItem?.cancel()\n        outDispatchWorkItem = DispatchWorkItem { [weak self] in\n            self?.animateOut(pushOut: false)\n        }\n        let delay = attributes.entranceAnimation.totalDuration + (delay ?? attributes.displayDuration)\n        DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: outDispatchWorkItem)\n    }\n    \n    // Animate out\n    func animateOut(pushOut: Bool) {\n        \n        // Execute willDisappear action if needed\n        contentView.attributes.lifecycleEvents.willDisappear?()\n        \n        if attributes.positionConstraints.keyboardRelation.isBound {\n            endEditing(true)\n        }\n        \n        outDispatchWorkItem?.cancel()\n        entryDelegate?.changeToInactive(withAttributes: attributes, pushOut: pushOut)\n        \n        if case .animated(animation: let animation) = attributes.popBehavior, pushOut {\n            animateOut(with: animation, outTranslationType: .pop)\n        } else {\n            animateOut(with: attributes.exitAnimation, outTranslationType: .exit)\n        }\n    }\n    \n    // Animate out\n    private func animateOut(with animation: EKAttributes.Animation, outTranslationType: OutTranslation) {\n        \n        superview?.layoutIfNeeded()\n        \n        if let translation = animation.translate {\n            performAnimation(out: true, with: translation) { [weak self] in\n                self?.translateOut(withType: outTranslationType)\n            }\n        }\n        \n        if let fade = animation.fade {\n            performAnimation(out: true, with: fade, preAction: { self.alpha = fade.start }) {\n                self.alpha = fade.end\n            }\n        }\n        \n        if let scale = animation.scale {\n            performAnimation(out: true, with: scale, preAction: { self.transform = CGAffineTransform(scaleX: scale.start, y: scale.start) }) {\n                self.transform = CGAffineTransform(scaleX: scale.end, y: scale.end)\n            }\n        }\n\n        if animation.containsAnimation {\n            DispatchQueue.main.asyncAfter(deadline: .now() + animation.maxDuration) {\n                self.removeFromSuperview(keepWindow: false)\n            }\n        } else {\n            translateOut(withType: outTranslationType)\n            removeFromSuperview(keepWindow: false)\n        }\n    }\n    \n    // Animate in\n    private func animateIn() {\n                \n        let animation = attributes.entranceAnimation\n        \n        superview?.layoutIfNeeded()\n        \n        if let translation = animation.translate {\n            performAnimation(out: false, with: translation, action: translateIn)\n        } else {\n            translateIn()\n        }\n        \n        if let fade = animation.fade {\n            performAnimation(out: false, with: fade, preAction: { self.alpha = fade.start }) {\n                self.alpha = fade.end\n            }\n        }\n        \n        if let scale = animation.scale {\n            performAnimation(out: false, with: scale, preAction: { self.transform = CGAffineTransform(scaleX: scale.start, y: scale.start) }) {\n                self.transform = CGAffineTransform(scaleX: scale.end, y: scale.end)\n            }\n        }\n        \n        entryDelegate?.changeToActive(withAttributes: attributes)\n        \n        // Execute didAppear action if needed\n        if animation.containsAnimation {\n            DispatchQueue.main.asyncAfter(deadline: .now() + animation.maxDuration) {\n                self.contentView.attributes.lifecycleEvents.didAppear?()\n            }\n        } else {\n            contentView.attributes.lifecycleEvents.didAppear?()\n        }\n        \n        scheduleAnimateOut()\n    }\n    \n    // Translate in\n    private func translateIn() {\n        entranceOutConstraint.priority = .defaultLow\n        exitOutConstraint.priority = .defaultLow\n        popOutConstraint.priority = .defaultLow\n        inConstraint.priority = .must\n        superview?.layoutIfNeeded()\n    }\n    \n    // Translate out\n    private func translateOut(withType type: OutTranslation) {\n        inConstraint.priority = .defaultLow\n        entranceOutConstraint.priority = .defaultLow\n        switch type {\n        case .exit:\n            exitOutConstraint.priority = .must\n        case .pop:\n            popOutConstraint.priority = .must\n        case .swipeUp:\n            swipeUpOutConstraint.priority = .must\n        case .swipeDown:\n            swipeDownOutConstraint.priority = .must\n        }\n        superview?.layoutIfNeeded()\n    }\n    \n    // Perform animation - translate / scale / fade\n    private func performAnimation(out: Bool, with animation: EKAnimation, preAction: @escaping () -> () = {}, action: @escaping () -> ()) {\n        let curve: UIView.AnimationOptions = out ? .curveEaseIn : .curveEaseOut\n        let options: UIView.AnimationOptions = [curve, .beginFromCurrentState]\n        preAction()\n        if let spring = animation.spring {\n            UIView.animate(withDuration: animation.duration, delay: animation.delay, usingSpringWithDamping: spring.damping, initialSpringVelocity: spring.initialVelocity, options: options, animations: {\n                action()\n            }, completion: nil)\n        } else {\n            UIView.animate(withDuration: animation.duration, delay: animation.delay, options: options, animations: {\n                action()\n            }, completion: nil)\n        }\n    }\n\n    // MARK: Remvoe entry\n    \n    // Removes the view promptly - DOES NOT animate out\n    func removePromptly(keepWindow: Bool = true) {\n        outDispatchWorkItem?.cancel()\n        entryDelegate?.changeToInactive(withAttributes: attributes, pushOut: false)\n        contentView.content.attributes.lifecycleEvents.willDisappear?()\n        removeFromSuperview(keepWindow: keepWindow)\n    }\n    \n    // Remove self from superview\n    func removeFromSuperview(keepWindow: Bool) {\n        guard superview != nil else {\n            return\n        }\n        \n        // Execute didDisappear action if needed\n        let didDisappear = contentView.content.attributes.lifecycleEvents.didDisappear\n\n        // Remove the view from its superview and in a case of a view controller, from its parent controller.\n        super.removeFromSuperview()\n        contentView.content.viewController?.removeFromParent()\n        \n        entryDelegate.didFinishDisplaying(entry: contentView, keepWindowActive: keepWindow, dismissCompletionHandler: dismissHandler)\n        \n        // Lastly, perform the Dismiss Completion Handler as the entry is no longer displayed\n        didDisappear?()\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n}\n\n\n// MARK: Keyboard Logic\nextension EKContentView {\n    \n    private enum KeyboardState {\n        case visible\n        case hidden\n        \n        var isVisible: Bool {\n            return self == .visible\n        }\n        \n        var isHidden: Bool {\n            return self == .hidden\n        }\n    }\n    \n    private struct KeyboardAttributes {\n        let duration: TimeInterval\n        let curve: UIView.AnimationOptions\n        let begin: CGRect\n        let end: CGRect\n        \n        init?(withRawValue rawValue: [AnyHashable: Any]?) {\n            guard let rawValue = rawValue else {\n                return nil\n            }\n            duration = rawValue[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval\n            curve = .init(rawValue: rawValue[UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt)\n            begin = (rawValue[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue\n            end = (rawValue[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue\n        }\n        \n        var height: CGFloat {\n            return end.maxY - end.minY\n        }\n    }\n    \n    private func setupKeyboardChangeIfNeeded() {\n        guard attributes.positionConstraints.keyboardRelation.isBound else {\n            return\n        }\n        \n        let notificationCenter = NotificationCenter.default\n        notificationCenter.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)\n        notificationCenter.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)\n        notificationCenter.addObserver(self, selector: #selector(keyboardDidHide(_:)), name: UIResponder.keyboardDidHideNotification, object: nil)\n        notificationCenter.addObserver(self, selector: #selector(keyboardWillChangeFrame(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)\n    }\n\n    private func animate(by userInfo: [AnyHashable: Any]?, entrance: Bool) {\n        \n        // Guard that the entry is bound to the keyboard\n        guard case .bind(offset: let offset) = attributes.positionConstraints.keyboardRelation else {\n            return\n        }\n        \n        // Convert the user info into keyboard attributes\n        guard let keyboardAtts = KeyboardAttributes(withRawValue: userInfo) else {\n            return\n        }\n        \n        if entrance {\n            inKeyboardConstraint.constant = -(keyboardAtts.height + offset.bottom)\n            inKeyboardConstraint.priority = .must\n            resistanceConstraint?.priority = .must\n            inConstraint.priority = .defaultLow\n        } else {\n            inKeyboardConstraint.priority = .defaultLow\n            resistanceConstraint?.priority = .defaultLow\n            inConstraint.priority = .must\n        }\n        \n        UIView.animate(withDuration: keyboardAtts.duration, delay: 0, options: keyboardAtts.curve, animations: {\n            self.superview?.layoutIfNeeded()\n        }, completion: nil)\n    }\n    \n    @objc func keyboardWillShow(_ notification: Notification) {\n        guard containsFirstResponder else {\n            return\n        }\n        keyboardState = .visible\n        animate(by: notification.userInfo, entrance: true)\n    }\n    \n    @objc func keyboardWillHide(_ notification: Notification) {\n        animate(by: notification.userInfo, entrance: false)\n    }\n    \n    @objc func keyboardDidHide(_ notification: Notification) {\n        keyboardState = .hidden\n    }\n    \n    @objc func keyboardWillChangeFrame(_ notification: Notification) {\n        guard containsFirstResponder else {\n            return\n        }\n        animate(by: notification.userInfo, entrance: true)\n    }\n}\n\n// MARK: Responds to user interactions (tap / pan / swipe / touches)\nextension EKContentView {\n    \n    // Tap gesture handler\n    @objc func tapGestureRecognized() {\n        switch attributes.entryInteraction.defaultAction {\n        case .delayExit(by: _) where attributes.displayDuration.isFinite:\n            scheduleAnimateOut()\n        case .dismissEntry:\n            animateOut(pushOut: false)\n        default:\n            break\n        }\n        attributes.entryInteraction.customTapActions.forEach { $0() }\n    }\n    \n    // Pan gesture handler\n    @objc func panGestureRecognized(gr: UIPanGestureRecognizer) {\n        guard keyboardState.isHidden else {\n            return\n        }\n                \n        // Delay the exit of the entry if needed\n        handleExitDelayIfNeeded(byPanState: gr.state)\n        \n        let translation = gr.translation(in: superview!).y\n        \n        if shouldStretch(with: translation) {\n            if attributes.scroll.isEdgeCrossingEnabled {\n                totalTranslation += translation\n                calculateLogarithmicOffset(forOffset: totalTranslation, currentTranslation: translation)\n                \n                switch gr.state {\n                case .ended, .failed, .cancelled:\n                    animateRubberBandPullback()\n                default:\n                    break\n                }\n            }\n        } else {\n            switch gr.state {\n            case .ended, .failed, .cancelled:\n                let velocity = gr.velocity(in: superview!).y\n                swipeEnded(withVelocity: velocity)\n            case .changed:\n                inConstraint.constant += translation\n            default:\n                break\n            }\n        }\n        gr.setTranslation(.zero, in: superview!)\n    }\n\n    private func swipeEnded(withVelocity velocity: CGFloat) {\n        let distance = Swift.abs(inOffset - inConstraint.constant)\n        var duration = max(0.3, TimeInterval(distance / Swift.abs(velocity)))\n        duration = min(0.7, duration)\n        \n        if attributes.scroll.isSwipeable && testSwipeVelocity(with: velocity) && testSwipeInConstraint() {\n            stretchOut(usingSwipe: velocity > 0 ? .swipeDown : .swipeUp, duration: duration)\n        } else {\n            animateRubberBandPullback()\n        }\n    }\n    \n    private func stretchOut(usingSwipe type: OutTranslation, duration: TimeInterval) {\n        outDispatchWorkItem?.cancel()\n        entryDelegate?.changeToInactive(withAttributes: attributes, pushOut: false)\n        contentView.content.attributes.lifecycleEvents.willDisappear?()\n        UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 4, options: [.allowUserInteraction, .beginFromCurrentState], animations: {\n            self.translateOut(withType: type)\n        }, completion: { finished in\n            self.removeFromSuperview(keepWindow: false)\n        })\n    }\n    \n    private func calculateLogarithmicOffset(forOffset offset: CGFloat, currentTranslation: CGFloat) {\n        guard verticalLimit != 0 else { return }\n        if attributes.position.isTop {\n            inConstraint.constant = verticalLimit * (1 + log10(offset / verticalLimit))\n        } else {\n            let offset = Swift.abs(offset) + verticalLimit\n            let addition: CGFloat = abs(currentTranslation) < 2 ? 0 : 1\n            inConstraint.constant -= (addition + log10(offset / verticalLimit))\n        }\n    }\n    \n    private func shouldStretch(with translation: CGFloat) -> Bool {\n        if attributes.position.isTop {\n            return translation > 0 && inConstraint.constant >= inOffset\n        } else {\n            return translation < 0 && inConstraint.constant <= inOffset\n        }\n    }\n    \n    private func animateRubberBandPullback() {\n        totalTranslation = verticalLimit\n    \n        let animation: EKAttributes.Scroll.PullbackAnimation\n        if case .enabled(swipeable: _, pullbackAnimation: let pullbackAnimation) = attributes.scroll {\n            animation = pullbackAnimation\n        } else {\n            animation = .easeOut\n        }\n\n        UIView.animate(withDuration: animation.duration, delay: 0, usingSpringWithDamping: animation.damping, initialSpringVelocity: animation.initialSpringVelocity, options: [.allowUserInteraction, .beginFromCurrentState], animations: {\n            self.inConstraint?.constant = self.inOffset\n            self.superview?.layoutIfNeeded()\n        }, completion: nil)\n    }\n    \n    private func testSwipeInConstraint() -> Bool {\n        if attributes.position.isTop {\n            return inConstraint.constant < inOffset\n        } else {\n            return inConstraint.constant > inOffset\n        }\n    }\n    \n    private func testSwipeVelocity(with velocity: CGFloat) -> Bool {\n        if attributes.position.isTop {\n            return velocity < -swipeMinVelocity\n        } else {\n            return velocity > swipeMinVelocity\n        }\n    }\n    \n    private func handleExitDelayIfNeeded(byPanState state: UIGestureRecognizer.State) {\n        guard attributes.entryInteraction.isDelayExit && attributes.displayDuration.isFinite else {\n            return\n        }\n        switch state {\n        case .began:\n            outDispatchWorkItem?.cancel()\n        case .ended, .failed, .cancelled:\n            scheduleAnimateOut()\n        default:\n            break\n        }\n    }\n    \n    // MARK: UIResponder\n    \n    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        if attributes.entryInteraction.isDelayExit && attributes.displayDuration.isFinite {\n            outDispatchWorkItem?.cancel()\n        }\n    }\n    \n    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {\n        if attributes.entryInteraction.isDelayExit && attributes.displayDuration.isFinite {\n            scheduleAnimateOut()\n        }\n    }\n    \n    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {\n        touchesEnded(touches, with: event)\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKEntryView.swift",
    "content": "//\n//  EKEntryView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/15/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nclass EKEntryView: EKStyleView {\n    \n    struct Content {\n        var viewController: UIViewController!\n        var view: UIView!\n        var attributes: EKAttributes\n        \n        init(viewController: UIViewController, attributes: EKAttributes) {\n            self.viewController = viewController\n            self.view = viewController.view\n            self.attributes = attributes\n        }\n        \n        init(view: UIView, attributes: EKAttributes) {\n            self.view = view\n            self.attributes = attributes\n        }\n    }\n    \n    // MARK: Props\n    \n    /** Background view */\n    private var backgroundView: EKBackgroundView!\n    \n    /** The content - contains the view, view controller, attributes */\n    var content: Content\n    \n    private lazy var contentView: UIView = {\n        return UIView()\n    }()\n    \n    var attributes: EKAttributes {\n        return content.attributes\n    }\n    \n    private lazy var contentContainerView: EKStyleView = {\n        let contentContainerView = EKStyleView()\n        self.addSubview(contentContainerView)\n        contentContainerView.layoutToSuperview(axis: .vertically)\n        contentContainerView.layoutToSuperview(axis: .horizontally)\n        contentContainerView.clipsToBounds = true\n        return contentContainerView\n    }()\n\n    // MARK: Setup\n    init(newEntry content: Content) {\n        self.content = content\n        super.init(frame: UIScreen.main.bounds)\n        setupContentView()\n        applyDropShadow()\n        applyBackgroundToContentView()\n        applyFrameStyle()\n        adjustInnerContentAppearanceIfNeeded()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        applyFrameStyle()\n    }\n    \n    func transform(to view: UIView) {\n        \n        let previousView = content.view\n        content.view = view\n        view.layoutIfNeeded()\n        \n        let previousHeight = set(.height, of: frame.height, priority: .must)\n        let nextHeight = set(.height, of: view.frame.height, priority: .defaultLow)\n\n        SwiftEntryKit.layoutIfNeeded()\n        \n        UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: [.beginFromCurrentState, .layoutSubviews], animations: {\n            \n            previousHeight.priority = .defaultLow\n            nextHeight.priority = .must\n            \n            previousView!.alpha = 0\n\n            SwiftEntryKit.layoutIfNeeded()\n            \n        }, completion: { (finished) in\n            \n            view.alpha = 0\n            \n            previousView!.removeFromSuperview()\n            self.removeConstraints([previousHeight, nextHeight])\n\n            self.setupContentView()\n            \n            UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: [.curveEaseOut], animations: {\n                view.alpha = 1\n            }, completion: nil)\n        })\n    }\n    \n    private func setupContentView() {\n        contentView.addSubview(content.view)\n        content.view.layoutToSuperview(axis: .horizontally)\n        content.view.layoutToSuperview(axis: .vertically)\n        \n        contentContainerView.addSubview(contentView)\n        contentView.fillSuperview()\n        contentView.layoutToSuperview(axis: .vertically)\n        contentView.layoutToSuperview(axis: .horizontally)\n    }\n\n    // Complementary logic for issue #117\n    private func adjustInnerContentAppearanceIfNeeded() {\n        guard let view = content.view as? EntryAppearanceDescriptor else {\n            return\n        }\n        view.bottomCornerRadius = attributes.roundCorners.cornerValues?.radius ?? 0\n    }\n    \n    // Apply round corners\n    private func applyFrameStyle() {\n        backgroundView.applyFrameStyle(roundCorners: attributes.roundCorners, border: attributes.border)\n    }\n    \n    // Apply drop shadow\n    private func applyDropShadow() {\n        switch attributes.shadow {\n        case .active(with: let value):\n            applyDropShadow(withOffset: value.offset,\n                            opacity: value.opacity,\n                            radius: value.radius,\n                            color: value.color.color(for: traitCollection, mode: attributes.displayMode))\n        case .none:\n            removeDropShadow()\n        }\n    }\n    \n    // Apply background\n    private func applyBackgroundToContentView() {\n        let attributes = content.attributes\n        \n        let backgroundView = EKBackgroundView()\n        backgroundView.style = .init(background: attributes.entryBackground,\n                                     displayMode: attributes.displayMode)\n        \n        switch attributes.positionConstraints.safeArea {\n        case .empty(fillSafeArea: let fillSafeArea) where fillSafeArea: // Safe area filled with color\n            insertSubview(backgroundView, at: 0)\n            backgroundView.layoutToSuperview(axis: .horizontally)\n            \n            var topInset: CGFloat = 0\n            var bottomInset: CGFloat = 0\n            switch attributes.position {\n            case .top:\n                topInset = -EKWindowProvider.safeAreaInsets.top\n            case .bottom, .center:\n                bottomInset = EKWindowProvider.safeAreaInsets.bottom\n            }\n            \n            backgroundView.layoutToSuperview(.top, offset: topInset)\n            backgroundView.layoutToSuperview(.bottom, offset: bottomInset)\n        default: // Float case or a Toast with unfilled safe area\n            contentView.insertSubview(backgroundView, at: 0)\n            backgroundView.fillSuperview()\n        }\n        \n        self.backgroundView = backgroundView\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        applyDropShadow()\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKRootViewController.swift",
    "content": "//\n//  EntryViewController.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nprotocol EntryPresenterDelegate: AnyObject {\n    var isResponsiveToTouches: Bool { set get }\n    func displayPendingEntryOrRollbackWindow(dismissCompletionHandler: SwiftEntryKit.DismissCompletionHandler?)\n}\n\nclass EKRootViewController: UIViewController {\n    \n    // MARK: - Props\n    \n    private unowned let delegate: EntryPresenterDelegate\n    \n    private var lastAttributes: EKAttributes!\n    \n    private let backgroundView = EKBackgroundView()\n\n    private lazy var wrapperView: EKWrapperView = {\n        return EKWrapperView()\n    }()\n    \n    /*\n     Count the total amount of currently displaying entries,\n     meaning, total subviews less one - the backgorund of the entry\n     */\n    fileprivate var displayingEntryCount: Int {\n        return view.subviews.count - 1\n    }\n    \n    fileprivate var isDisplaying: Bool {\n        return lastEntry != nil\n    }\n    \n    private var lastEntry: EKContentView? {\n        return view.subviews.last as? EKContentView\n    }\n        \n    private var isResponsive = false {\n        didSet {\n            wrapperView.isAbleToReceiveTouches = isResponsive\n            delegate.isResponsiveToTouches = isResponsive\n        }\n    }\n\n    override var shouldAutorotate: Bool {\n        if lastAttributes == nil {\n            return true\n        }\n        return lastAttributes.positionConstraints.rotation.isEnabled\n    }\n    \n    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {\n        guard let lastAttributes = lastAttributes else {\n            return super.supportedInterfaceOrientations\n        }\n        switch lastAttributes.positionConstraints.rotation.supportedInterfaceOrientations {\n        case .standard:\n            return super.supportedInterfaceOrientations\n        case .all:\n            return .all\n        }\n    }\n    \n    // Previous status bar style\n    private let previousStatusBar: EKAttributes.StatusBar\n    \n    private var statusBar: EKAttributes.StatusBar? = nil {\n        didSet {\n            if let statusBar = statusBar, ![statusBar, oldValue].contains(.ignored) {\n                UIApplication.shared.set(statusBarStyle: statusBar)\n            }\n        }\n    }\n    \n    override var preferredStatusBarStyle: UIStatusBarStyle {\n        if [previousStatusBar, statusBar].contains(.ignored) {\n            return super.preferredStatusBarStyle\n        }\n        return statusBar?.appearance.style ?? previousStatusBar.appearance.style\n    }\n\n    override var prefersStatusBarHidden: Bool {\n        if [previousStatusBar, statusBar].contains(.ignored) {\n            return super.prefersStatusBarHidden\n        }\n        return !(statusBar?.appearance.visible ?? previousStatusBar.appearance.visible)\n    }\n    \n    // MARK: - Lifecycle\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    public init(with delegate: EntryPresenterDelegate) {\n        self.delegate = delegate\n        previousStatusBar = .currentStatusBar\n        super.init(nibName: nil, bundle: nil)\n    }\n    \n    override public func loadView() {\n        view = wrapperView\n        view.insertSubview(backgroundView, at: 0)\n        backgroundView.isUserInteractionEnabled = false\n        backgroundView.fillSuperview()\n    }\n    \n    override public func viewWillDisappear(_ animated: Bool) {\n        super.viewWillDisappear(animated)\n        statusBar = previousStatusBar\n    }\n    \n    // Set status bar\n    func setStatusBarStyle(for attributes: EKAttributes) {\n        statusBar = attributes.statusBar\n    }\n    \n    // MARK: - Setup\n    \n    func configure(entryView: EKEntryView) {\n\n        // In case the entry is a view controller, add the entry as child of root\n        if let viewController = entryView.content.viewController {\n            addChild(viewController)\n        }\n        \n        // Extract the attributes struct\n        let attributes = entryView.attributes\n        \n        // Assign attributes\n        let previousAttributes = lastAttributes\n        \n        // Remove the last entry\n        removeLastEntry(lastAttributes: previousAttributes, keepWindow: true)\n        \n        lastAttributes = attributes\n        \n        let entryContentView = EKContentView(withEntryDelegate: self)\n        view.addSubview(entryContentView)\n        entryContentView.setup(with: entryView)\n        \n        switch attributes.screenInteraction.defaultAction {\n        case .forward:\n            isResponsive = false\n        default:\n            isResponsive = true\n        }\n\n        if previousAttributes?.statusBar != attributes.statusBar {\n            setNeedsStatusBarAppearanceUpdate()\n        }\n        \n        if shouldAutorotate {\n            UIViewController.attemptRotationToDeviceOrientation()\n        }\n    }\n        \n    // Check priority precedence for a given entry\n    func canDisplay(attributes: EKAttributes) -> Bool {\n        guard let lastAttributes = lastAttributes else {\n            return true\n        }\n        return attributes.precedence.priority >= lastAttributes.precedence.priority\n    }\n\n    // Removes last entry - can keep the window 'ON' if necessary\n    private func removeLastEntry(lastAttributes: EKAttributes?, keepWindow: Bool) {\n        guard let attributes = lastAttributes else {\n            return\n        }\n        if attributes.popBehavior.isOverriden {\n            lastEntry?.removePromptly()\n        } else {\n            popLastEntry()\n        }\n    }\n    \n    // Make last entry exit using exitAnimation - animatedly\n    func animateOutLastEntry(completionHandler: SwiftEntryKit.DismissCompletionHandler? = nil) {\n        lastEntry?.dismissHandler = completionHandler\n        lastEntry?.animateOut(pushOut: false)\n    }\n    \n    // Pops last entry (using pop animation) - animatedly\n    func popLastEntry() {\n        lastEntry?.animateOut(pushOut: true)\n    }\n}\n\n// MARK: - UIResponder\n\nextension EKRootViewController {\n    \n    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {\n        switch lastAttributes.screenInteraction.defaultAction {\n        case .dismissEntry:\n            lastEntry?.animateOut(pushOut: false)\n            fallthrough\n        default:\n            lastAttributes.screenInteraction.customTapActions.forEach { $0() }\n        }\n    }\n}\n\n// MARK: - EntryScrollViewDelegate\n\nextension EKRootViewController: EntryContentViewDelegate {\n    \n    func didFinishDisplaying(entry: EKEntryView, keepWindowActive: Bool, dismissCompletionHandler: SwiftEntryKit.DismissCompletionHandler?) {\n        guard !isDisplaying else {\n            return\n        }\n        \n        guard !keepWindowActive else {\n            return\n        }\n        \n        delegate.displayPendingEntryOrRollbackWindow(dismissCompletionHandler: dismissCompletionHandler)\n    }\n    \n    func changeToInactive(withAttributes attributes: EKAttributes, pushOut: Bool) {\n        guard displayingEntryCount <= 1 else {\n            return\n        }\n        \n        let clear = {\n            let style = EKBackgroundView.Style(background: .clear, displayMode: attributes.displayMode)\n            self.changeBackground(to: style, duration: attributes.exitAnimation.totalDuration)\n        }\n        \n        guard pushOut else {\n            clear()\n            return\n        }\n        \n        guard let lastBackroundStyle = lastAttributes?.screenBackground else {\n            clear()\n            return\n        }\n        \n        if lastBackroundStyle != attributes.screenBackground {\n            clear()\n        }\n    }\n    \n    func changeToActive(withAttributes attributes: EKAttributes) {\n        let style = EKBackgroundView.Style(background: attributes.screenBackground,\n                                           displayMode: attributes.displayMode)\n        changeBackground(to: style, duration: attributes.entranceAnimation.totalDuration)\n    }\n    \n    private func changeBackground(to style: EKBackgroundView.Style, duration: TimeInterval) {\n        DispatchQueue.main.async {\n            UIView.animate(withDuration: duration, delay: 0, options: [], animations: {\n                self.backgroundView.style = style\n            }, completion: nil)\n        }\n    }\n}\n\n"
  },
  {
    "path": "Source/Infra/EKStyleView.swift",
    "content": "//\n//  EKStyleView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/28/18.\n//\n\nimport UIKit\n\nclass EKStyleView: UIView {\n    \n    private lazy var borderLayer: CAShapeLayer = {\n        return CAShapeLayer()\n    }()\n    \n    private var roundCorners: EKAttributes.RoundCorners!\n    private var border: EKAttributes.Border!\n    \n    var appliedStyle = false\n    \n    func applyFrameStyle(roundCorners: EKAttributes.RoundCorners, border: EKAttributes.Border) {\n        self.roundCorners = roundCorners\n        self.border = border\n        \n        var cornerRadius: CGFloat = 0\n        var corners: UIRectCorner = []\n        (corners, cornerRadius) = roundCorners.cornerValues ?? ([], 0)\n        \n        let size = CGSize(width: cornerRadius, height: cornerRadius)\n        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: size)\n        \n        if !corners.isEmpty && cornerRadius > 0 {\n            let maskLayer = CAShapeLayer()\n            maskLayer.path = path.cgPath\n            layer.mask = maskLayer\n        }\n        \n        if let borderValues = border.borderValues {\n            borderLayer.path = path.cgPath\n            borderLayer.fillColor = UIColor.clear.cgColor\n            borderLayer.strokeColor = borderValues.color.cgColor\n            borderLayer.lineWidth = borderValues.width\n            borderLayer.frame = bounds\n            layer.addSublayer(borderLayer)\n        }\n        \n        appliedStyle = true\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        guard let roundCorners = roundCorners, let border = border else {\n            return\n        }\n        applyFrameStyle(roundCorners: roundCorners, border: border)\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKWindow.swift",
    "content": "//\n//  EKWindow.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nclass EKWindow: UIWindow {\n    \n    var isAbleToReceiveTouches = false\n    \n    init(with rootVC: UIViewController) {\n        if #available(iOS 13.0, *) {\n            // TODO: Patched to support SwiftUI out of the box but should require attendance\n            if let scene = UIApplication.shared.connectedScenes.filter({$0.activationState == .foregroundActive}).first as? UIWindowScene {\n                super.init(windowScene: scene)\n            } else {\n                super.init(frame: UIScreen.main.bounds)\n            }\n        } else {\n            super.init(frame: UIScreen.main.bounds)\n        }\n        backgroundColor = .clear\n        rootViewController = rootVC\n        accessibilityViewIsModal = true\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {\n        if isAbleToReceiveTouches {\n            return super.hitTest(point, with: event)\n        }\n        \n        guard let rootVC = EKWindowProvider.shared.rootVC else {\n            return nil\n        }\n        \n        if let view = rootVC.view.hitTest(point, with: event) {\n            return view\n        }\n        \n        return nil\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKWindowProvider.swift",
    "content": "//\n//  EKWindowProvider.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal class EKWindowProvider: EntryPresenterDelegate {\n    \n    /** The artificial safe area insets */\n    static var safeAreaInsets: UIEdgeInsets {\n        if #available(iOS 11.0, *) {\n            return EKWindowProvider.shared.entryWindow?.rootViewController?.view?.safeAreaInsets ?? UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets ?? .zero\n        } else {\n            let statusBarMaxY = UIApplication.shared.statusBarFrame.maxY\n            return UIEdgeInsets(top: statusBarMaxY, left: 0, bottom: 10, right: 0)\n        }\n    }\n    \n    /** Single access point */\n    static let shared = EKWindowProvider()\n    \n    /** Current entry window */\n    var entryWindow: EKWindow!\n    \n    /** Returns the root view controller if it is instantiated */\n    var rootVC: EKRootViewController? {\n        return entryWindow?.rootViewController as? EKRootViewController\n    }\n    \n    /** A window to go back to when the last entry has been dismissed */\n    private var rollbackWindow: SwiftEntryKit.RollbackWindow!\n    \n    /** The main rollback window to be used internally in case `rollbackWindow`'s value is `.main` */\n    private weak var mainRollbackWindow: UIWindow?\n\n    /** Entry queueing heuristic  */\n    private let entryQueue = EKAttributes.Precedence.QueueingHeuristic.value.heuristic\n    \n    private weak var entryView: EKEntryView!\n\n    /** Cannot be instantiated, customized, inherited */\n    private init() {}\n    \n    var isResponsiveToTouches: Bool {\n        set {\n            entryWindow.isAbleToReceiveTouches = newValue\n        }\n        get {\n            return entryWindow.isAbleToReceiveTouches\n        }\n    }\n    \n    // MARK: - Setup and Teardown methods\n    \n    // Prepare the window and the host view controller\n    private func prepare(for attributes: EKAttributes, presentInsideKeyWindow: Bool) -> EKRootViewController? {\n        let entryVC = setupWindowAndRootVC()\n        guard entryVC.canDisplay(attributes: attributes) || attributes.precedence.isEnqueue else {\n            return nil\n        }\n        entryVC.setStatusBarStyle(for: attributes)\n\n        entryWindow.windowLevel = attributes.windowLevel.value\n        if presentInsideKeyWindow {\n            entryWindow.makeKeyAndVisible()\n        } else {\n            entryWindow.isHidden = false\n        }\n\n        return entryVC\n    }\n    \n    /** Boilerplate generic setup for entry-window and root-view-controller  */\n    private func setupWindowAndRootVC() -> EKRootViewController {\n        let entryVC: EKRootViewController\n        if entryWindow == nil {\n            entryVC = EKRootViewController(with: self)\n            entryWindow = EKWindow(with: entryVC)\n            mainRollbackWindow = UIApplication.shared.keyWindow\n        } else {\n            entryVC = rootVC!\n        }\n        return entryVC\n    }\n    \n    /**\n     Privately used to display an entry\n     */\n    private func display(entryView: EKEntryView, using attributes: EKAttributes, presentInsideKeyWindow: Bool, rollbackWindow: SwiftEntryKit.RollbackWindow) {\n        switch entryView.attributes.precedence {\n        case .override(priority: _, dropEnqueuedEntries: let dropEnqueuedEntries):\n            if dropEnqueuedEntries {\n                entryQueue.removeAll()\n            }\n            show(entryView: entryView, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow)\n        case .enqueue where isCurrentlyDisplaying():\n            entryQueue.enqueue(entry: .init(view: entryView, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow))\n        case .enqueue:\n            show(entryView: entryView, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow)\n        }\n    }\n    \n    // MARK: - Exposed Actions\n    \n    func queueContains(entryNamed name: String? = nil) -> Bool {\n        if name == nil && !entryQueue.isEmpty {\n            return true\n        }\n        if let name = name {\n            return entryQueue.contains(entryNamed: name)\n        } else {\n            return false\n        }\n    }\n    \n    /**\n     Returns *true* if the currently displayed entry has the given name.\n     In case *name* has the value of *nil*, the result is *true* if any entry is currently displayed.\n     */\n    func isCurrentlyDisplaying(entryNamed name: String? = nil) -> Bool {\n        guard let entryView = entryView else {\n            return false\n        }\n        if let name = name { // Test for names equality\n            return entryView.content.attributes.name == name\n        } else { // Return true by default if the name is *nil*\n            return true\n        }\n    }\n    \n    /** Transform current entry to view */\n    func transform(to view: UIView) {\n        entryView?.transform(to: view)\n    }\n    \n    /** Display a view using attributes */\n    func display(view: UIView, using attributes: EKAttributes, presentInsideKeyWindow: Bool, rollbackWindow: SwiftEntryKit.RollbackWindow) {\n        let entryView = EKEntryView(newEntry: .init(view: view, attributes: attributes))\n        display(entryView: entryView, using: attributes, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow)\n    }\n\n    /** Display a view controller using attributes */\n    func display(viewController: UIViewController, using attributes: EKAttributes, presentInsideKeyWindow: Bool, rollbackWindow: SwiftEntryKit.RollbackWindow) {\n        let entryView = EKEntryView(newEntry: .init(viewController: viewController, attributes: attributes))\n        display(entryView: entryView, using: attributes, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow)\n    }\n    \n    /** Clear all entries immediately and display to the rollback window */\n    func displayRollbackWindow() {\n        if #available(iOS 13.0, *) {\n            entryWindow.windowScene = nil\n        }\n        entryWindow = nil\n        entryView = nil\n        switch rollbackWindow! {\n        case .main:\n            if let mainRollbackWindow = mainRollbackWindow {\n                mainRollbackWindow.makeKeyAndVisible()\n            } else {\n                UIApplication.shared.keyWindow?.makeKeyAndVisible()\n            }\n        case .custom(window: let window):\n            window.makeKeyAndVisible()\n        }\n    }\n    \n    /** Display a pending entry if there is any inside the queue */\n    func displayPendingEntryOrRollbackWindow(dismissCompletionHandler: SwiftEntryKit.DismissCompletionHandler?) {\n        if let next = entryQueue.dequeue() {\n            \n            // Execute dismiss handler if needed before dequeuing (potentially) another entry\n            dismissCompletionHandler?()\n            \n            // Show the next entry in queue\n            show(entryView: next.view, presentInsideKeyWindow: next.presentInsideKeyWindow, rollbackWindow: next.rollbackWindow)\n        } else {\n            \n            // Display the rollback window\n            displayRollbackWindow()\n            \n            // As a last step, invoke the dismissal method\n            dismissCompletionHandler?()\n        }\n    }\n    \n    /** Dismiss entries according to a given descriptor */\n    func dismiss(_ descriptor: SwiftEntryKit.EntryDismissalDescriptor, with completion: SwiftEntryKit.DismissCompletionHandler? = nil) {\n        guard let rootVC = rootVC else {\n            return\n        }\n        \n        switch descriptor {\n        case .displayed:\n            rootVC.animateOutLastEntry(completionHandler: completion)\n        case .specific(entryName: let name):\n            entryQueue.removeEntries(by: name)\n            if entryView?.attributes.name == name {\n                rootVC.animateOutLastEntry(completionHandler: completion)\n            }\n        case .prioritizedLowerOrEqualTo(priority: let priorityThreshold):\n            entryQueue.removeEntries(withPriorityLowerOrEqualTo: priorityThreshold)\n            if let currentPriority = entryView?.attributes.precedence.priority, currentPriority <= priorityThreshold {\n                rootVC.animateOutLastEntry(completionHandler: completion)\n            }\n        case .enqueued:\n            entryQueue.removeAll()\n        case .all:\n            entryQueue.removeAll()\n            rootVC.animateOutLastEntry(completionHandler: completion)\n        }\n    }\n    \n    /** Layout the view-hierarchy rooted in the window */\n    func layoutIfNeeded() {\n        entryWindow?.layoutIfNeeded()\n    }\n    \n    /** Privately used to prepare the root view controller and show the entry immediately */\n    private func show(entryView: EKEntryView, presentInsideKeyWindow: Bool, rollbackWindow: SwiftEntryKit.RollbackWindow) {\n        guard let entryVC = prepare(for: entryView.attributes, presentInsideKeyWindow: presentInsideKeyWindow) else {\n            return\n        }\n        entryVC.configure(entryView: entryView)\n        self.entryView = entryView\n        self.rollbackWindow = rollbackWindow\n    }\n}\n"
  },
  {
    "path": "Source/Infra/EKWrapperView.swift",
    "content": "//\n//  EKWrapperView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nclass EKWrapperView: UIView {\n    var isAbleToReceiveTouches = false\n    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {\n        if isAbleToReceiveTouches {\n            return super.hitTest(point, with: event)\n        }\n        if let view = super.hitTest(point, with: event), view != self {\n            return view\n        }\n        return nil\n    }\n}\n\n"
  },
  {
    "path": "Source/Infra/EntryCachingHeuristic.swift",
    "content": "//\n//  EKEntryCacher.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 9/1/18.\n//  Copyright © 2018 CocoaPods. All rights reserved.\n//\n\nimport Foundation\n\nstruct CachedEntry {\n    let view: EKEntryView\n    let presentInsideKeyWindow: Bool\n    let rollbackWindow: SwiftEntryKit.RollbackWindow\n}\n\nprotocol EntryCachingHeuristic: AnyObject {\n    var entries: [CachedEntry] { set get }\n    var isEmpty: Bool { get }\n    \n    func dequeue() -> CachedEntry?\n    func enqueue(entry: CachedEntry)\n    \n    func removeEntries(by name: String)\n    func removeEntries(withPriorityLowerOrEqualTo priority: EKAttributes.Precedence.Priority)\n    func remove(entry: CachedEntry)\n    func removeAll()\n    \n    func contains(entryNamed name: String) -> Bool\n}\n\nextension EntryCachingHeuristic {\n    \n    var isEmpty: Bool {\n        return entries.isEmpty\n    }\n    \n    func contains(entryNamed name: String) -> Bool {\n        return entries.contains { $0.view.attributes.name == name }\n    }\n    \n    func dequeue() -> CachedEntry? {\n        guard let first = entries.first else {\n            return nil\n        }\n        entries.removeFirst()\n        return first\n    }\n    \n    func removeEntries(withPriorityLowerOrEqualTo priority: EKAttributes.Precedence.Priority) {\n        while let index = (entries.firstIndex { $0.view.attributes.precedence.priority <= priority }) {\n            entries.remove(at: index)\n        }\n    }\n    \n    func removeEntries(by name: String) {\n        while let index = (entries.firstIndex { $0.view.attributes.name == name }) {\n            entries.remove(at: index)\n        }\n    }\n    \n    func remove(entry: CachedEntry) {\n        guard let index = (entries.firstIndex { $0.view == entry.view }) else {\n            return\n        }\n        entries.remove(at: index)\n    }\n    \n    func removeAll() {\n        entries.removeAll()\n    }\n}\n\nclass EKEntryChronologicalQueue: EntryCachingHeuristic {\n    \n    var entries: [CachedEntry] = []\n    \n    func enqueue(entry: CachedEntry) {\n        entries.append(entry)\n    }\n}\n\nclass EKEntryPriorityQueue: EntryCachingHeuristic {\n    \n    var entries: [CachedEntry] = []\n    \n    func enqueue(entry: CachedEntry) {\n        let entryPriority = entry.view.attributes.precedence.priority\n        let index = entries.firstIndex {\n            return entryPriority > $0.view.attributes.precedence.priority\n        }\n        if let index = index {\n            entries.insert(entry, at: index)\n        } else {\n            entries.append(entry)\n        }\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKAlertMessageView.swift",
    "content": "//\n//  EKAlertMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/5/18.\n//\n\nimport UIKit\n\nfinal public class EKAlertMessageView: EKSimpleMessageView, EntryAppearanceDescriptor {\n    \n    // MARK: Props\n    var buttonBarView: EKButtonBarView!\n    private var buttonsBarCompressedConstraint: NSLayoutConstraint!\n    private var buttonsBarExpandedConstraint: NSLayoutConstraint!\n    \n    // MARK: EntryAppearenceDescriptor\n    \n    var bottomCornerRadius: CGFloat = 0 {\n        didSet {\n            buttonBarView.bottomCornerRadius = bottomCornerRadius\n        }\n    }\n    \n    // MARK: Setup\n    public init(with message: EKAlertMessage) {\n        super.init(with: message.simpleMessage)\n        setupButtonBarView(with: message.buttonBarContent)\n        layoutContent(with: message)\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupButtonBarView(with content: EKProperty.ButtonBarContent) {\n        buttonBarView = EKButtonBarView(with: content)\n        buttonBarView.clipsToBounds = true\n        addSubview(buttonBarView)\n    }\n    \n    func layoutContent(with message: EKAlertMessage) {\n        switch message.imagePosition {\n        case .top:\n            messageContentView.verticalMargins = 16\n            messageContentView.horizontalMargins = 16\n            messageContentView.labelsOffset = 5\n            \n            if let thumbImageView = thumbImageView {\n                thumbImageView.layoutToSuperview(.top, offset: 20)\n                thumbImageView.layoutToSuperview(.centerX)\n                messageContentView.layout(.top, to: .bottom, of: thumbImageView)\n            } else {\n                messageContentView.layoutToSuperview(.top)\n            }\n\n            messageContentView.layoutToSuperview(axis: .horizontally)\n            buttonBarView.layout(.top, to: .bottom, of: messageContentView)\n        case .left:\n            messageContentView.verticalMargins = 0\n            messageContentView.horizontalMargins = 0\n            messageContentView.labelsOffset = 5\n            \n            if let thumbImageView = thumbImageView {\n                thumbImageView.layoutToSuperview(.top, .left, offset: 16)\n                messageContentView.layout(.left, to: .right, of: thumbImageView, offset: 12)\n                messageContentView.layout(to: .top, of: thumbImageView, offset: 2)\n            } else {\n                messageContentView.layoutToSuperview(.left, .top, offset: 16)\n            }\n\n            messageContentView.layoutToSuperview(.right, offset: -16)\n            buttonBarView.layout(.top, to: .bottom, of: messageContentView, offset: 10)\n        }\n        \n        buttonBarView.layoutToSuperview(axis: .horizontally)\n        buttonBarView.layoutToSuperview(.bottom)\n        buttonBarView.alpha = 0\n\n        if !message.buttonBarContent.content.isEmpty {\n            if message.buttonBarContent.expandAnimatedly {\n                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n                    self.buttonBarView.expand()\n                }\n            } else {\n                buttonBarView.expand()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKFormMessageView.swift",
    "content": "//\n//  EKFormMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/15/18.\n//\n\nimport UIKit\n\nfinal public class EKFormMessageView: UIView {\n    \n    private let scrollViewVerticalOffset: CGFloat = 20\n    \n    // MARK: Props\n    \n    private let titleLabel = UILabel()\n    private let scrollView = UIScrollView()\n    private let textFieldsContent: [EKProperty.TextFieldContent]\n    private var textFieldViews: [EKTextField] = []\n    private var buttonBarView: EKButtonBarView!\n    \n    private let titleContent: EKProperty.LabelContent\n    \n    // MARK: Setup\n    \n    public init(with title: EKProperty.LabelContent,\n                textFieldsContent: [EKProperty.TextFieldContent],\n                buttonContent: EKProperty.ButtonContent) {\n        self.titleContent = title\n        self.textFieldsContent = textFieldsContent\n        super.init(frame: UIScreen.main.bounds)\n        setupScrollView()\n        setupTitleLabel()\n        setupTextFields(with: textFieldsContent)\n        setupButton(with: buttonContent)\n        setupTapGestureRecognizer()\n        scrollView.layoutIfNeeded()\n        set(.height,\n            of: scrollView.contentSize.height + scrollViewVerticalOffset * 2,\n            priority: .defaultHigh)\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupTextFields(with textFieldsContent: [EKProperty.TextFieldContent]) {\n        var textFieldIndex = 0\n        textFieldViews = textFieldsContent.map { content -> EKTextField in\n            let textField = EKTextField(with: content)\n            scrollView.addSubview(textField)\n            textField.tag = textFieldIndex\n            textFieldIndex += 1\n            return textField\n        }\n        textFieldViews.first!.layout(.top, to: .bottom, of: titleLabel, offset: 20)\n        textFieldViews.spread(.vertically, offset: 5)\n        textFieldViews.layoutToSuperview(axis: .horizontally)\n    }\n    \n    // Setup tap gesture\n    private func setupTapGestureRecognizer() {\n        let tapGestureRecognizer = UITapGestureRecognizer(\n            target: self,\n            action: #selector(tapGestureRecognized)\n        )\n        tapGestureRecognizer.numberOfTapsRequired = 1\n        addGestureRecognizer(tapGestureRecognizer)\n    }\n    \n    private func setupScrollView() {\n        addSubview(scrollView)\n        scrollView.layoutToSuperview(axis: .horizontally, offset: 20)\n        scrollView.layoutToSuperview(axis: .vertically, offset: scrollViewVerticalOffset)\n        scrollView.layoutToSuperview(.width, .height, offset: -scrollViewVerticalOffset * 2)\n    }\n    \n    private func setupTitleLabel() {\n        scrollView.addSubview(titleLabel)\n        titleLabel.layoutToSuperview(.top, .width)\n        titleLabel.layoutToSuperview(axis: .horizontally)\n        titleLabel.forceContentWrap(.vertically)\n        titleLabel.content = titleContent\n    }\n    \n    private func setupButton(with buttonContent: EKProperty.ButtonContent) {\n        var buttonContent = buttonContent\n        let action = buttonContent.action\n        buttonContent.action = { [weak self] in\n            self?.extractTextFieldsContent()\n            action?()\n        }\n        let buttonsBarContent = EKProperty.ButtonBarContent(\n            with: buttonContent,\n            separatorColor: .clear,\n            expandAnimatedly: true\n        )\n        buttonBarView = EKButtonBarView(with: buttonsBarContent)\n        buttonBarView.clipsToBounds = true\n        scrollView.addSubview(buttonBarView)\n        buttonBarView.expand()\n        buttonBarView.layout(.top, to: .bottom, of: textFieldViews.last!, offset: 20)\n        buttonBarView.layoutToSuperview(.centerX)\n        buttonBarView.layoutToSuperview(.width, offset: -40)\n        buttonBarView.layoutToSuperview(.bottom)\n        buttonBarView.layer.cornerRadius = 5\n    }\n    \n    private func extractTextFieldsContent() {\n        for (content, textField) in zip(textFieldsContent, textFieldViews) {\n            content.contentWrapper.text = textField.text\n        }\n    }\n    \n    /** Makes a specific text field the first responder */\n    public func becomeFirstResponder(with textFieldIndex: Int) {\n        textFieldViews[textFieldIndex].makeFirstResponder()\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        titleLabel.textColor = titleContent.style.color(for: traitCollection)\n    }\n    \n    // MARK: User Intractions\n    \n    // Tap Gesture\n    @objc func tapGestureRecognized() {\n        endEditing(true)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKMessageContentView.swift",
    "content": "//\n//  EKMessageContentView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic class EKMessageContentView: UIView {\n    \n    // MARK: Properties\n    \n    private let titleLabel = UILabel()\n    private let subtitleLabel = UILabel()\n    \n    private var horizontalConstraints: QLAxisConstraints!\n    private var topConstraint: NSLayoutConstraint!\n    private var bottomConstraint: NSLayoutConstraint!\n    private var labelsOffsetConstraint: NSLayoutConstraint!\n        \n    public var titleContent: EKProperty.LabelContent! {\n        didSet {\n            titleLabel.content = titleContent\n        }\n    }\n    \n    public var subtitleContent: EKProperty.LabelContent! {\n        didSet {\n            subtitleLabel.content = subtitleContent\n        }\n    }\n    \n    public var titleAttributes: EKProperty.LabelStyle! {\n        didSet {\n            titleLabel.style = titleAttributes\n        }\n    }\n    \n    public var subtitleAttributes: EKProperty.LabelStyle! {\n        didSet {\n            subtitleLabel.style = subtitleAttributes\n        }\n    }\n    \n    public var title: String! {\n        didSet {\n            titleLabel.text = title\n        }\n    }\n    \n    public var subtitle: String! {\n        didSet {\n            subtitleLabel.text = subtitle\n        }\n    }\n    \n    public var verticalMargins: CGFloat = 20 {\n        didSet {\n            topConstraint.constant = verticalMargins\n            bottomConstraint.constant = -verticalMargins\n            layoutIfNeeded()\n        }\n    }\n    \n    public var horizontalMargins: CGFloat = 20 {\n        didSet {\n            horizontalConstraints.first.constant = horizontalMargins\n            horizontalConstraints.second.constant = -horizontalMargins\n            layoutIfNeeded()\n        }\n    }\n    \n    public var labelsOffset: CGFloat = 8 {\n        didSet {\n            labelsOffsetConstraint.constant = labelsOffset\n            layoutIfNeeded()\n        }\n    }\n    \n    // MARK: Setup\n    \n    public init() {\n        super.init(frame: UIScreen.main.bounds)\n        clipsToBounds = true\n        setupTitleLabel()\n        setupSubtitleLabel()\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupTitleLabel() {\n        addSubview(titleLabel)\n        topConstraint = titleLabel.layoutToSuperview(.top, offset: verticalMargins)\n        horizontalConstraints = titleLabel.layoutToSuperview(axis: .horizontally, offset: horizontalMargins)\n        titleLabel.forceContentWrap(.vertically)\n    }\n    \n    private func setupSubtitleLabel() {\n        addSubview(subtitleLabel)\n        labelsOffsetConstraint = subtitleLabel.layout(.top, to: .bottom, of: titleLabel, offset: labelsOffset)\n        subtitleLabel.layout(to: .left, of: titleLabel)\n        subtitleLabel.layout(to: .right, of: titleLabel)\n        bottomConstraint = subtitleLabel.layoutToSuperview(.bottom, offset: -verticalMargins, priority: .must)\n        subtitleLabel.forceContentWrap(.vertically)\n    }\n    \n    private func setupInterfaceStyle() {\n        titleLabel.textColor = titleContent?.style.color(for: traitCollection)\n        subtitleLabel.textColor = subtitleContent?.style.color(for: traitCollection)\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKNotificationMessageView.swift",
    "content": "//\n//  EKNotificationMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal public class EKNotificationMessageView: EKSimpleMessageView {\n    \n    // MARK: Props\n    private var auxLabel: UILabel!\n    private var auxiliaryContent: EKProperty.LabelContent!\n    \n    private let message: EKNotificationMessage\n    \n    // MARK: Setup\n    public init(with message: EKNotificationMessage) {\n        self.message = message\n        super.init(with: message.simpleMessage)\n        setupAuxLabel(with: message.auxiliary)\n        layoutContent(with: message.insets)\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupAuxLabel(with content: EKProperty.LabelContent?) {\n        auxiliaryContent = content\n        guard let content = content else {\n            return\n        }\n        auxLabel = UILabel()\n        auxLabel.content = content\n        addSubview(auxLabel)\n    }\n    \n    private func layoutContent(with insets: EKNotificationMessage.Insets) {\n        messageContentView.verticalMargins = 0\n        messageContentView.horizontalMargins = 0\n        messageContentView.labelsOffset = insets.titleToDescription\n        \n        if let thumbImageView = thumbImageView {\n            thumbImageView.layoutToSuperview(.left, offset: insets.contentInsets.left)\n            thumbImageView.layoutToSuperview(.top, offset: insets.contentInsets.top)\n            messageContentView.layout(.left, to: .right, of: thumbImageView, offset: 12)\n            messageContentView.layout(to: .top, of: thumbImageView, offset: 4)\n        } else {\n            messageContentView.layoutToSuperview(.left, offset: insets.contentInsets.left)\n            messageContentView.layoutToSuperview(.top, offset: insets.contentInsets.top)\n        }\n\n        if let auxLabel = auxLabel {\n            auxLabel.layoutToSuperview(.right, offset: -insets.contentInsets.right)\n            auxLabel.layoutToSuperview(.top, offset: insets.contentInsets.top + 2)\n            auxLabel.forceContentWrap()\n            messageContentView.layout(.right, to: .left, of: auxLabel)\n        } else {\n            messageContentView.layoutToSuperview(.right, offset: -insets.contentInsets.right)\n        }\n        messageContentView.layoutToSuperview(.bottom, offset: -insets.contentInsets.bottom)\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        super.traitCollectionDidChange(previousTraitCollection)\n        auxLabel?.textColor = auxiliaryContent?.style.color(for: traitCollection)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKPopUpMessageView.swift",
    "content": "//\n//  EKPopUpMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal public class EKPopUpMessageView: UIView {\n\n    // MARK: - Properties\n    \n    private var imageView: UIImageView!\n    private let titleLabel = UILabel()\n    private let descriptionLabel = UILabel()\n    private let actionButton = UIButton()\n    \n    private let message: EKPopUpMessage\n    \n    // MARK: - Setup\n    \n    public init(with message: EKPopUpMessage) {\n        self.message = message\n        super.init(frame: UIScreen.main.bounds)\n        setupImageView()\n        setupTitleLabel()\n        setupDescriptionLabel()\n        setupActionButton()\n        setupInterfaceStyle()\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupImageView() {\n        guard let themeImage = message.themeImage else {\n            return\n        }\n        imageView = UIImageView()\n        addSubview(imageView)\n        imageView.layoutToSuperview(.centerX)\n        switch themeImage.position {\n        case .centerToTop(offset: let value):\n            imageView.layout(.centerY, to: .top, of: self, offset: value)\n        case .topToTop(offset: let value):\n            imageView.layoutToSuperview(.top, offset: value)\n        }\n        imageView.imageContent = themeImage.image\n    }\n    \n    private func setupTitleLabel() {\n        addSubview(titleLabel)\n        titleLabel.content = message.title\n        titleLabel.layoutToSuperview(axis: .horizontally, offset: 30)\n        if let imageView = imageView {\n            titleLabel.layout(.top, to: .bottom, of: imageView, offset: 20)\n        } else {\n            titleLabel.layoutToSuperview(.top, offset: 20)\n        }\n        titleLabel.forceContentWrap(.vertically)\n    }\n    \n    private func setupDescriptionLabel() {\n        addSubview(descriptionLabel)\n        descriptionLabel.content = message.description\n        descriptionLabel.layoutToSuperview(axis: .horizontally, offset: 30)\n        descriptionLabel.layout(.top, to: .bottom, of: titleLabel, offset: 16)\n        descriptionLabel.forceContentWrap(.vertically)\n    }\n    \n    private func setupActionButton() {\n        addSubview(actionButton)\n        let height: CGFloat = 45\n        actionButton.set(.height, of: height)\n        actionButton.layout(.top, to: .bottom, of: descriptionLabel, offset: 30)\n        actionButton.layoutToSuperview(.bottom, offset: -30)\n        actionButton.layoutToSuperview(.centerX)\n        \n        let buttonAttributes = message.button\n        actionButton.buttonContent = buttonAttributes\n        actionButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 30)\n        actionButton.layer.cornerRadius = height * 0.5\n        actionButton.addTarget(self, action: #selector(actionButtonPressed), for: .touchUpInside)\n    }\n    \n    private func setupInterfaceStyle() {\n        titleLabel.textColor = message.title.style.color(for: traitCollection)\n        imageView?.tintColor = message.themeImage?.image.tintColor(for: traitCollection)\n        let tapColor = message.button.highlighedLabelColor(for: traitCollection)\n        actionButton.setTitleColor(tapColor, for: .highlighted)\n        actionButton.setTitleColor(tapColor, for: .selected)\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n    \n    // MARK: - User Interaction\n    \n    @objc func actionButtonPressed() {\n        message.action()\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKRatingMessageView.swift",
    "content": "//\n//  EKRatingMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/1/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal public class EKRatingMessageView: UIView, EntryAppearanceDescriptor {\n\n    // MARK: Properties\n    \n    private var message: EKRatingMessage\n\n    // MARK: EntryAppearenceDescriptor\n\n    var bottomCornerRadius: CGFloat = 0 {\n        didSet {\n            buttonBarView.bottomCornerRadius = bottomCornerRadius\n        }\n    }\n    \n    private var selectedIndex: Int! {\n        didSet {\n            message.selectedIndex = selectedIndex\n            let item = message.ratingItems[selectedIndex]\n            set(title: item.title,\n                description: item.description)\n        }\n    }\n    \n    private let messageContentView = EKMessageContentView()\n    private let symbolsView = EKRatingSymbolsContainerView()\n    private var buttonBarView: EKButtonBarView!\n\n    public init(with message: EKRatingMessage) {\n        self.message = message\n        super.init(frame: UIScreen.main.bounds)\n        setupMessageContentView()\n        setupSymbolsView()\n        setupButtonBarView()\n        set(title: message.initialTitle,\n            description: message.initialDescription)\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func set(title: EKProperty.LabelContent,\n                     description: EKProperty.LabelContent) {\n        messageContentView.titleContent = title\n        messageContentView.subtitleContent = description\n        UIView.animate(withDuration: 0.4,\n                       delay: 0,\n                       usingSpringWithDamping: 1,\n                       initialSpringVelocity: 0,\n                       options: [.transitionCrossDissolve],\n                       animations: {\n            SwiftEntryKit.layoutIfNeeded()\n        }, completion: nil)\n    }\n    \n    private func setupMessageContentView() {\n        addSubview(messageContentView)\n        messageContentView.verticalMargins = 20\n        messageContentView.horizontalMargins = 30\n        messageContentView.layoutToSuperview(axis: .horizontally,\n                                             priority: .must)\n        messageContentView.layoutToSuperview(.top, offset: 10)\n    }\n    \n    private func setupSymbolsView() {\n        addSubview(symbolsView)\n        symbolsView.setup(with: message) { [unowned self] (index: Int) in\n            self.message.selectedIndex = index\n            self.message.selection?(index)\n            self.selectedIndex = index\n            self.animateIn()\n        }\n        symbolsView.layoutToSuperview(.centerX)\n        symbolsView.layout(.top,\n                           to: .bottom,\n                           of: messageContentView,\n                           offset: 10,\n                           priority: .must)\n    }\n\n    private func setupButtonBarView() {\n        buttonBarView = EKButtonBarView(with: message.buttonBarContent)\n        buttonBarView.clipsToBounds = true\n        buttonBarView.alpha = 0\n        addSubview(buttonBarView)\n        buttonBarView.layout(.top,\n                             to: .bottom,\n                             of: symbolsView,\n                             offset: 30)\n        buttonBarView.layoutToSuperview(.bottom)\n        buttonBarView.layoutToSuperview(axis: .horizontally)\n    }\n    \n    // MARK: - Internal Animation\n    \n    private func animateIn() {\n        layoutIfNeeded()\n        buttonBarView.expand()\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/EKSimpleMessageView.swift",
    "content": "//\n//  EKMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/5/18.\n//\n\nimport UIKit\n\npublic class EKSimpleMessageView: UIView {\n\n    // MARK: Props\n    var thumbImageView: UIImageView!\n    let messageContentView = EKMessageContentView()\n    private let message: EKSimpleMessage\n    \n    // MARK: Setup\n    init(with message: EKSimpleMessage) {\n        self.message = message\n        super.init(frame: UIScreen.main.bounds)\n        setupThumbImageView(with: message.image)\n        setupMessageContentView(with: message.title,\n                                description: message.description)\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupThumbImageView(with content: EKProperty.ImageContent?) {\n        guard let content = content else {\n            return\n        }\n        thumbImageView = UIImageView()\n        addSubview(thumbImageView)\n        thumbImageView.imageContent = content\n    }\n    \n    private func setupMessageContentView(with title: EKProperty.LabelContent,\n                                         description: EKProperty.LabelContent) {\n        messageContentView.titleContent = title\n        messageContentView.subtitleContent = description\n        addSubview(messageContentView)\n    }\n    \n    private func setupInterfaceStyle() {\n        if let image = message.image {\n            thumbImageView?.tintColor = image.tint?.color(\n                for: traitCollection,\n                mode: image.displayMode\n            )\n        }\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/MessagesUtils/EKButtonBarView.swift",
    "content": "//\n//  ButtonsBarView.swift\n//  SwiftEntryKit_Example\n//\n//  Created by Daniel Huri on 4/28/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\n/**\n Dynamic button bar view\n Buttons are set according to the received content.\n 1-2 buttons spread horizontally\n 3 or more buttons spread vertically\n */\nfinal public class EKButtonBarView: UIView {\n    \n    // MARK: - Properties\n    \n    private var buttonViews: [EKButtonView] = []\n    private var separatorViews: [UIView] = []\n    \n    private let buttonBarContent: EKProperty.ButtonBarContent\n    private let spreadAxis: QLAxis\n    private let oppositeAxis: QLAxis\n    private let relativeEdge: NSLayoutConstraint.Attribute\n    \n    var bottomCornerRadius: CGFloat = 0 {\n        didSet {\n            adjustRoundCornersIfNecessary()\n        }\n    }\n    \n    private lazy var buttonEdgeRatio: CGFloat = {\n        return 1.0 / CGFloat(self.buttonBarContent.content.count)\n    }()\n    \n    private(set) lazy var intrinsicHeight: CGFloat = {\n        var height: CGFloat = 0\n        switch buttonBarContent.content.count {\n        case 0:\n            height += 1\n        case 1...buttonBarContent.horizontalDistributionThreshold:\n            height += buttonBarContent.buttonHeight\n        default:\n            for _ in 1...buttonBarContent.content.count {\n                height += buttonBarContent.buttonHeight\n            }\n        }\n        return height\n    }()\n    \n    private var compressedConstraint: NSLayoutConstraint!\n    private lazy var expandedConstraint: NSLayoutConstraint = {\n        return set(.height, of: intrinsicHeight, priority: .defaultLow)\n    }()\n\n    // MARK: Setup\n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    public init(with buttonBarContent: EKProperty.ButtonBarContent) {\n        self.buttonBarContent = buttonBarContent\n        if buttonBarContent.content.count <= buttonBarContent.horizontalDistributionThreshold {\n            spreadAxis = .horizontally\n            oppositeAxis = .vertically\n            relativeEdge = .width\n        } else {\n            spreadAxis = .vertically\n            oppositeAxis = .horizontally\n            relativeEdge = .height\n        }\n        super.init(frame: .zero)\n        setupButtonBarContent()\n        setupSeparatorViews()\n        \n        compressedConstraint = set(.height, of: 1, priority: .must)\n    }\n    \n    public override func layoutSubviews() {\n        super.layoutSubviews()\n        adjustRoundCornersIfNecessary()\n    }\n\n    private func setupButtonBarContent() {\n        for content in buttonBarContent.content {\n            let buttonView = EKButtonView(content: content)\n            addSubview(buttonView)\n            buttonViews.append(buttonView)\n        }\n        layoutButtons()\n    }\n    \n    private func layoutButtons() {\n        guard !buttonViews.isEmpty else {\n            return\n        }\n        let suffix = Array(buttonViews.dropFirst())\n        if !suffix.isEmpty {\n            suffix.layout(.height, to: buttonViews.first!)\n        }\n        buttonViews.layoutToSuperview(axis: oppositeAxis)\n        buttonViews.spread(spreadAxis, stretchEdgesToSuperview: true)\n        buttonViews.layout(relativeEdge, to: self, ratio: buttonEdgeRatio, priority: .must)\n    }\n    \n    private func setupTopSeperatorView() {\n        let topSeparatorView = UIView()\n        addSubview(topSeparatorView)\n        topSeparatorView.set(.height, of: 1)\n        topSeparatorView.layoutToSuperview(.left, .right, .top)\n        separatorViews.append(topSeparatorView)\n    }\n    \n    private func setupSeperatorView(after view: UIView) {\n        let midSepView = UIView()\n        addSubview(midSepView)\n        let sepAttribute: NSLayoutConstraint.Attribute\n        let buttonAttribute: NSLayoutConstraint.Attribute\n        switch oppositeAxis {\n        case .vertically:\n            sepAttribute = .centerX\n            buttonAttribute = .right\n        case .horizontally:\n            sepAttribute = .centerY\n            buttonAttribute = .bottom\n        }\n        midSepView.layout(sepAttribute, to: buttonAttribute, of: view)\n        midSepView.set(relativeEdge, of: 1)\n        midSepView.layoutToSuperview(axis: oppositeAxis)\n        separatorViews.append(midSepView)\n    }\n    \n    private func setupSeparatorViews() {\n        setupTopSeperatorView()\n        for button in buttonViews.dropLast() {\n            setupSeperatorView(after: button)\n        }\n        setupInterfaceStyle()\n    }\n    \n    // Amination\n    public func expand() {\n        let expansion = {\n            self.compressedConstraint.priority = .defaultLow\n            self.expandedConstraint.priority = .must\n            \n            /* NOTE: Calling layoutIfNeeded for the whole view hierarchy.\n             Sometimes it's easier to just use frames instead of AutoLayout for\n             hierarch complexity considerations. Here the animation influences almost the\n             entire view hierarchy. */\n            SwiftEntryKit.layoutIfNeeded()\n        }\n        \n        alpha = 1\n        if buttonBarContent.expandAnimatedly {\n            let damping: CGFloat = buttonBarContent.content.count <= 2 ? 0.4 : 0.8\n            SwiftEntryKit.layoutIfNeeded()\n            UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: damping, initialSpringVelocity: 0, options: [.beginFromCurrentState, .allowUserInteraction, .layoutSubviews, .allowAnimatedContent], animations: {\n                expansion()\n            }, completion: nil)\n        } else {\n            expansion()\n        }\n    }\n    \n    public func compress() {\n        compressedConstraint.priority = .must\n        expandedConstraint.priority = .defaultLow\n    }\n    \n    private func adjustRoundCornersIfNecessary() {\n        let size = CGSize(width: bottomCornerRadius, height: bottomCornerRadius)\n        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: .bottom, cornerRadii: size)\n        let maskLayer = CAShapeLayer()\n        maskLayer.path = path.cgPath\n        layer.mask = maskLayer\n    }\n    \n    private func setupInterfaceStyle() {\n        for view in separatorViews {\n            view.backgroundColor = buttonBarContent.separatorColor(for: traitCollection)\n        }\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/MessagesUtils/EKButtonView.swift",
    "content": "//\n//  EKButtonView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 12/8/18.\n//  Copyright © 2018 CocoaPods. All rights reserved.\n//\n\nimport UIKit\n\nfinal class EKButtonView: UIView {\n\n    // MARK: - Properties\n    \n    private let button = UIButton()\n    private let titleLabel = UILabel()\n    \n    private let content: EKProperty.ButtonContent\n    \n    // MARK: - Setup\n    \n    init(content: EKProperty.ButtonContent) {\n        self.content = content\n        super.init(frame: .zero)\n        setupTitleLabel()\n        setupButton()\n        setupAcceessibility()\n        setupInterfaceStyle()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupAcceessibility() {\n        isAccessibilityElement = false\n        button.isAccessibilityElement = true\n        button.accessibilityIdentifier = content.accessibilityIdentifier\n        button.accessibilityLabel = content.label.text\n    }\n    \n    private func setupButton() {\n        addSubview(button)\n        button.fillSuperview()\n        button.addTarget(self, action: #selector(buttonTouchUp),\n                         for: [.touchUpInside, .touchUpOutside, .touchCancel])\n        button.addTarget(self, action: #selector(buttonTouchDown),\n                         for: .touchDown)\n        button.addTarget(self, action: #selector(buttonTouchUpInside),\n                         for: .touchUpInside)\n    }\n    \n    private func setupTitleLabel() {\n        titleLabel.numberOfLines = content.label.style.numberOfLines\n        titleLabel.font = content.label.style.font\n        titleLabel.text = content.label.text\n        titleLabel.textAlignment = .center\n        titleLabel.lineBreakMode = .byWordWrapping\n        addSubview(titleLabel)\n        titleLabel.layoutToSuperview(axis: .horizontally,\n                                     offset: content.contentEdgeInset)\n        titleLabel.layoutToSuperview(axis: .vertically,\n                                     offset: content.contentEdgeInset)\n    }\n    \n    private func setBackground(by content: EKProperty.ButtonContent,\n                               isHighlighted: Bool) {\n        if isHighlighted {\n            backgroundColor = content.highlightedBackgroundColor(for: traitCollection)\n        } else {\n            backgroundColor = content.backgroundColor(for: traitCollection)\n        }\n    }\n    \n    private func setupInterfaceStyle() {\n        backgroundColor = content.backgroundColor(for: traitCollection)\n        titleLabel.textColor = content.label.style.color(for: traitCollection)\n    }\n    \n    // MARK: - Selectors\n    \n    @objc func buttonTouchUpInside() {\n        content.action?()\n    }\n    \n    @objc func buttonTouchDown() {\n        setBackground(by: content, isHighlighted: true)\n    }\n    \n    @objc func buttonTouchUp() {\n        setBackground(by: content, isHighlighted: false)\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupInterfaceStyle()\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/MessagesUtils/EKRatingSymbolView.swift",
    "content": "//\n//  EKRatingSymbolView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/1/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal public class EKRatingSymbolView: UIView {\n    \n    private let button = UIButton()\n    private let imageView = UIImageView()\n    \n    private let unselectedImage: EKProperty.ImageContent\n    private let selectedImage: EKProperty.ImageContent\n    \n    var selection: EKRatingMessage.Selection\n    \n    public var isSelected: Bool {\n        set {\n            imageView.imageContent = newValue ? selectedImage : unselectedImage\n        }\n        get {\n            return imageView.image == selectedImage.images.first\n        }\n    }\n    \n    public init(unselectedImage: EKProperty.ImageContent, selectedImage: EKProperty.ImageContent, selection: @escaping EKRatingMessage.Selection) {\n        self.unselectedImage = unselectedImage\n        self.selectedImage = selectedImage\n        self.selection = selection\n        super.init(frame: .zero)\n        setupImageView()\n        setupButton()\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupButton() {\n        addSubview(button)\n        button.fillSuperview()\n        button.addTarget(self, action: #selector(touchUpInside), for: .touchUpInside)\n        button.addTarget(self, action: #selector(touchDown), for: [.touchDown])\n        button.addTarget(self, action: #selector(touchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])\n    }\n    \n    private func setupImageView() {\n        addSubview(imageView)\n        imageView.imageContent = unselectedImage\n        imageView.centerInSuperview()\n        imageView.sizeToSuperview(withRatio: 0.7)\n    }\n    \n    @objc func touchUpInside() {\n        selection(tag)\n    }\n    \n    @objc func touchDown() {\n        transform = CGAffineTransform(scaleX: 1.15, y: 1.15)\n    }\n    \n    @objc func touchUp() {\n        transform = CGAffineTransform(scaleX: 1, y: 1)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/MessagesUtils/EKRatingSymbolsContainerView.swift",
    "content": "//\n//  EKRatingSymbolsContainerView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/1/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nfinal public class EKRatingSymbolsContainerView: UIView {\n    \n    private var message: EKRatingMessage!\n    private var symbolsArray: [EKRatingSymbolView] = []\n    \n    public func setup(with message: EKRatingMessage,\n                      externalSelection: @escaping EKRatingMessage.Selection) {\n        self.message = message\n        let internalSelection = { [unowned self] (index: Int) in\n            self.select(index: index)\n            externalSelection(index)\n        }\n        \n        for (index, item) in message.ratingItems.enumerated() {\n            let itemView = EKRatingSymbolView(unselectedImage: item.unselectedImage,\n                                              selectedImage: item.selectedImage,\n                                              selection: internalSelection)\n            itemView.tag = index\n            addSubview(itemView)\n            itemView.set(.height, of: item.size.height)\n            itemView.set(.width, of: item.size.width)\n            symbolsArray.append(itemView)\n        }\n        symbolsArray.layoutToSuperview(axis: .vertically, priority: .must)\n        symbolsArray.spread(.horizontally, stretchEdgesToSuperview: true)\n        \n        select(index: message.selectedIndex)\n    }\n    \n    private func select(index: Int? = nil) {\n        var delay: TimeInterval = 0\n        for (i, view) in symbolsArray.enumerated() {\n            DispatchQueue.main.asyncAfter(deadline: .now() + delay) {\n                if let index = index, i <= index {\n                    view.isSelected = true\n                    view.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)\n                } else if view.isSelected || index == nil {\n                    view.isSelected = false\n                    view.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)\n                }\n                UIView.animate(withDuration: 0.6,\n                               delay: 0,\n                               usingSpringWithDamping: 0.5,\n                               initialSpringVelocity: 0,\n                               options: [.allowUserInteraction], animations: {\n                    view.transform = .identity\n                }, completion: nil)\n            }\n            delay += 0.05\n        }\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/MessagesUtils/EKTextField.swift",
    "content": "//\n//  EKTextField.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/16/18.\n//\n\nimport Foundation\nimport UIKit\n\nfinal public class EKTextField: UIView {\n    \n    // MARK: - Properties\n    \n    static let totalHeight: CGFloat = 45\n    \n    private let content: EKProperty.TextFieldContent\n    \n    private let imageView = UIImageView()\n    private let textField = UITextField()\n    private let separatorView = UIView()\n    \n    public var text: String {\n        set {\n            textField.text = newValue\n        }\n        get {\n            return textField.text ?? \"\"\n        }\n    }\n    \n    // MARK: - Setup\n    \n    public init(with content: EKProperty.TextFieldContent) {\n        self.content = content\n        super.init(frame: UIScreen.main.bounds)\n        setupImageView()\n        setupTextField()\n        setupSeparatorView()\n        textField.accessibilityIdentifier = content.accessibilityIdentifier\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupImageView() {\n        addSubview(imageView)\n        imageView.contentMode = .center\n        imageView.set(.width, .height, of: EKTextField.totalHeight)\n        imageView.layoutToSuperview(.leading)\n        imageView.image = content.leadingImage\n        imageView.tintColor = content.tintColor(for: traitCollection)\n    }\n    \n    private func setupTextField() {\n        addSubview(textField)\n        textField.textFieldContent = content\n        textField.delegate = content.delegate\n        textField.set(.height, of: EKTextField.totalHeight)\n        textField.layout(.leading, to: .trailing, of: imageView)\n        textField.layoutToSuperview(.top, .trailing)\n        imageView.layout(to: .centerY, of: textField)\n    }\n    \n    private func setupSeparatorView() {\n        addSubview(separatorView)\n        separatorView.layout(.top, to: .bottom, of: textField)\n        separatorView.set(.height, of: 1)\n        separatorView.layoutToSuperview(.bottom)\n        separatorView.layoutToSuperview(axis: .horizontally, offset: 10)\n        separatorView.backgroundColor = content.bottomBorderColor.color(\n            for: traitCollection,\n            mode: content.displayMode\n        )\n    }\n    \n    public func makeFirstResponder() {\n        textField.becomeFirstResponder()\n    }\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        separatorView.backgroundColor = content.bottomBorderColor(for: traitCollection)\n        imageView.tintColor = content.tintColor(for: traitCollection)\n        textField.textColor = content.textStyle.color(for: traitCollection)\n        textField.placeholder = content.placeholder\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/MessagesUtils/EntryAppearanceDescriptor.swift",
    "content": "//\n//  EntryAppearanceDescriptor.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 1/5/19.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport UIKit\n\n/**\n An anti-pattern for SwiftEntryKit views to know more about their appearence,\n if necessary, since views don't have access to EKAttributes.\n This is a solution to bug #117 (round buttons in alert)\n */\nprotocol EntryAppearanceDescriptor: AnyObject {\n    var bottomCornerRadius: CGFloat { get set }\n}\n"
  },
  {
    "path": "Source/MessageViews/Notes/EKAccessoryNoteMessageView.swift",
    "content": "//\n//  EKAccessoryNoteMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/4/18.\n//\n\nimport UIKit\n\npublic class EKAccessoryNoteMessageView: UIView {\n\n    // MARK: Props\n    private let contentView = UIView()\n    private var noteMessageView: EKNoteMessageView!\n    var accessoryView: UIView!\n\n    func setup(with content: EKProperty.LabelContent) {\n        clipsToBounds = true\n        \n        addSubview(contentView)\n        contentView.layoutToSuperview(.centerX, .top, .bottom)\n        contentView.layoutToSuperview(.left, relation: .greaterThanOrEqual, offset: 16)\n        contentView.layoutToSuperview(.right, relation: .lessThanOrEqual, offset: -16)\n        \n        noteMessageView = EKNoteMessageView(with: content)\n        noteMessageView.horizontalOffset = 8\n        noteMessageView.verticalOffset = 7\n        contentView.addSubview(noteMessageView)\n        noteMessageView.layoutToSuperview(.top, .bottom, .trailing)\n        \n        contentView.addSubview(accessoryView)\n        accessoryView.layoutToSuperview(.leading, .centerY)\n        accessoryView.layout(.trailing, to: .leading, of: noteMessageView)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/Notes/EKImageNoteMessageView.swift",
    "content": "//\n//  EKImageNoteMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/4/18.\n//\n\nimport UIKit\n\npublic class EKImageNoteMessageView: EKAccessoryNoteMessageView {\n    \n    // MARK: Setup\n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    public init(with content: EKProperty.LabelContent, imageContent: EKProperty.ImageContent) {\n        super.init(frame: UIScreen.main.bounds)\n        setup(with: content, imageContent: imageContent)\n    }\n    \n    private func setup(with content: EKProperty.LabelContent, imageContent: EKProperty.ImageContent) {\n        let imageView = UIImageView()\n        imageView.imageContent = imageContent\n        accessoryView = imageView\n        super.setup(with: content)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/Notes/EKNoteMessageView.swift",
    "content": "//\n//  EKNoteMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic class EKNoteMessageView: UIView {\n    \n    // MARK: Props\n    private let label = UILabel()\n    \n    private var horizontalConstrainsts: QLAxisConstraints!\n    private var verticalConstrainsts: QLAxisConstraints!\n    \n    public var horizontalOffset: CGFloat = 10 {\n        didSet {\n            horizontalConstrainsts.first.constant = horizontalOffset\n            horizontalConstrainsts.second.constant = -horizontalOffset\n            layoutIfNeeded()\n        }\n    }\n    \n    public var verticalOffset: CGFloat = 5 {\n        didSet {\n            verticalConstrainsts.first.constant = verticalOffset\n            verticalConstrainsts.second.constant = -verticalOffset\n            layoutIfNeeded()\n        }\n    }\n    \n    // MARK: Setup\n    public init(with content: EKProperty.LabelContent) {\n        super.init(frame: UIScreen.main.bounds)\n        setup(with: content)\n    }\n\n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setup(with content: EKProperty.LabelContent) {\n        clipsToBounds = true\n        addSubview(label)\n        label.content = content\n        horizontalConstrainsts = label.layoutToSuperview(axis: .horizontally, offset: horizontalOffset, priority: .must)\n        verticalConstrainsts = label.layoutToSuperview(axis: .vertically, offset: verticalOffset, priority: .must)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/Notes/EKProcessingNoteMessageView.swift",
    "content": "//\n//  EKProcessingNoteMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic class EKProcessingNoteMessageView: EKAccessoryNoteMessageView {\n    \n    // MARK: Props\n    private var activityIndicatorView: UIActivityIndicatorView!\n    private var noteMessageView: EKNoteMessageView!\n    \n    /** Activity indication can be turned off / on */\n    public var isProcessing: Bool = true {\n        didSet {\n            if isProcessing {\n                activityIndicatorView.startAnimating()\n            } else {\n                activityIndicatorView.stopAnimating()\n            }\n        }\n    }\n    \n    // MARK: Setup\n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    public init(with content: EKProperty.LabelContent, activityIndicator: UIActivityIndicatorView.Style) {\n        super.init(frame: UIScreen.main.bounds)\n        setup(with: content, activityIndicator: activityIndicator)\n    }\n    \n    private func setup(with content: EKProperty.LabelContent, activityIndicator: UIActivityIndicatorView.Style, setProcessing: Bool = true) {\n        activityIndicatorView = UIActivityIndicatorView()\n        activityIndicatorView.style = activityIndicator\n        isProcessing = setProcessing\n        accessoryView = activityIndicatorView\n        super.setup(with: content)\n    }\n}\n"
  },
  {
    "path": "Source/MessageViews/Notes/EKXStatusBarMessageView.swift",
    "content": "//\n//  EKXStatusBarMessageView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic class EKXStatusBarMessageView: UIView {\n    \n    // MARK: Props\n    private let leadingLabel = UILabel()\n    private let trailingLabel = UILabel()\n    \n    // MARK: Setup\n    public init(leading: EKProperty.LabelContent, trailing: EKProperty.LabelContent) {\n        super.init(frame: UIScreen.main.bounds)\n        setup(leading: leading, trailing: trailing)\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setup(leading: EKProperty.LabelContent, trailing: EKProperty.LabelContent) {\n        clipsToBounds = true\n        \n        set(.height, of: UIApplication.shared.statusBarFrame.maxY)\n        \n        addSubview(leadingLabel)\n        leadingLabel.content = leading\n        \n        leadingLabel.layoutToSuperview(axis: .vertically)\n        leadingLabel.layoutToSuperview(.leading)\n        leadingLabel.layoutToSuperview(.width, ratio: 0.26)\n        \n        addSubview(trailingLabel)\n        trailingLabel.content = trailing\n        \n        trailingLabel.layoutToSuperview(axis: .vertically)\n        trailingLabel.layoutToSuperview(.trailing)\n        trailingLabel.layoutToSuperview(.width, ratio: 0.26)\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKAlertMessage.swift",
    "content": "//\n//  EKAlertMessage.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/1/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\npublic struct EKAlertMessage {\n    \n    public enum ImagePosition {\n        case top\n        case left\n    }\n    \n    /** The position of the image inside the alert */\n    public let imagePosition: ImagePosition\n    \n    /** Image, Title, Description */\n    public let simpleMessage: EKSimpleMessage\n    \n    /** Contents of button bar */\n    public let buttonBarContent: EKProperty.ButtonBarContent\n    \n    public init(simpleMessage: EKSimpleMessage,\n                imagePosition: ImagePosition = .top,\n                buttonBarContent: EKProperty.ButtonBarContent) {\n        self.simpleMessage = simpleMessage\n        self.imagePosition = imagePosition\n        self.buttonBarContent = buttonBarContent\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKColor.swift",
    "content": "//\n//  EKColor.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel on 21/07/2019.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport UIKit\n\n/** A color representation attribute as per user interface style */\npublic struct EKColor: Equatable {\n    \n    // MARK: - Properties\n    \n    public private(set) var dark: UIColor\n    public private(set) var light: UIColor\n    \n    // MARK: - Setup\n    \n    public init(light: UIColor, dark: UIColor) {\n        self.light = light\n        self.dark = dark\n    }\n    \n    public init(_ unified: UIColor) {\n        self.light = unified\n        self.dark = unified\n    }\n    \n    public init(rgb: Int) {\n        dark = UIColor(rgb: rgb)\n        light = UIColor(rgb: rgb)\n    }\n    \n    public init(red: Int, green: Int, blue: Int) {\n        assert(red >= 0 && red <= 255, \"Invalid red component\")\n        assert(green >= 0 && green <= 255, \"Invalid green component\")\n        assert(blue >= 0 && blue <= 255, \"Invalid blue component\")\n        let color = UIColor(red: CGFloat(red) / 255.0,\n                            green: CGFloat(green) / 255.0,\n                            blue: CGFloat(blue) / 255.0,\n                            alpha: 1.0)\n        light = color\n        dark = color\n    }\n    \n    /** Computes the proper UIColor */\n    public func color(for traits: UITraitCollection,\n                      mode: EKAttributes.DisplayMode) -> UIColor {\n        switch mode {\n        case .inferred:\n            if #available(iOS 13, *) {\n                switch traits.userInterfaceStyle {\n                case .light, .unspecified:\n                    return light\n                case .dark:\n                    return dark\n                @unknown default:\n                    return light\n                }\n            } else {\n                return light\n            }\n        case .light:\n            return light\n        case .dark:\n            return dark\n        }\n    }\n}\n\npublic extension EKColor {\n    \n    /// Returns the inverse of `self` (light and dark swapped)\n    var inverted: EKColor {\n        return EKColor(light: dark, dark: light)\n    }\n    \n    /** Returns an `EKColor` with the specified alpha component */\n    func with(alpha: CGFloat) -> EKColor {\n        return EKColor(light: light.withAlphaComponent(alpha),\n                       dark: dark.withAlphaComponent(alpha))\n    }\n    \n    /** White color for all user interface styles */\n    static var white: EKColor {\n        return EKColor(.white)\n    }\n    \n    /** Black color for all user interface styles */\n    static var black: EKColor {\n        return EKColor(.black)\n    }\n    \n    /** Clear color for all user interface styles */\n    static var clear: EKColor {\n        return EKColor(.clear)\n    }\n    \n    /** Color that represents standard background. White for light mode, black for dark mode */\n    static var standardBackground: EKColor {\n        return EKColor(light: .white, dark: .black)\n    }\n    \n    /** Color that represents standard content. black for light mode, white for dark mode */\n    static var standardContent: EKColor {\n        return EKColor(light: .black, dark: .white)\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKNotificationMessage.swift",
    "content": "//\n//  EKNotificationMessage.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic struct EKNotificationMessage {\n    \n    /** Insets of the content of the message */\n    public struct Insets {\n        \n        /** The insets of the content of the message, from the top, bottom, left, right */\n        public var contentInsets = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)\n        \n        /** The distance between the title and the description */\n        public var titleToDescription: CGFloat = 5\n        \n        public static var `default` = Insets()\n    }\n    \n    /** Image, Title, Description */\n    public let simpleMessage: EKSimpleMessage\n    \n    /** Optional auxiliary label descriptor (For instance, it be used to display time of message) */\n    public let auxiliary: EKProperty.LabelContent?\n    \n    /** Defines the vertical and horizontal margins */\n    public let insets: Insets\n        \n    public init(simpleMessage: EKSimpleMessage,\n                auxiliary: EKProperty.LabelContent? = nil,\n                insets: Insets = .default) {\n        self.simpleMessage = simpleMessage\n        self.auxiliary = auxiliary\n        self.insets = insets\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKPopUpMessage.swift",
    "content": "//\n//  EKPopUpMessage.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic struct EKPopUpMessage {\n    \n    /** Code block that is executed as the user taps the popup button */\n    public typealias EKPopUpMessageAction = () -> ()\n    \n    /** Popup theme image */\n    public struct ThemeImage {\n        \n        /** Position of the theme image */\n        public enum Position {\n            case topToTop(offset: CGFloat)\n            case centerToTop(offset: CGFloat)\n        }\n        \n        /** The content of the image */\n        public var image: EKProperty.ImageContent\n        \n        /** The psotion of the image */\n        public var position: Position\n        \n        /** Initializer */\n        public init(image: EKProperty.ImageContent,\n                    position: Position = .topToTop(offset: 40)) {\n            self.image = image\n            self.position = position\n        }\n    }\n    \n    public var themeImage: ThemeImage?\n    public var title: EKProperty.LabelContent\n    public var description: EKProperty.LabelContent\n    public var button: EKProperty.ButtonContent\n    public var action: EKPopUpMessageAction\n    \n    var containsImage: Bool {\n        return themeImage != nil\n    }\n    \n    public init(themeImage: ThemeImage? = nil,\n                title: EKProperty.LabelContent,\n                description: EKProperty.LabelContent,\n                button: EKProperty.ButtonContent,\n                action: @escaping EKPopUpMessageAction) {\n        self.themeImage = themeImage\n        self.title = title\n        self.description = description\n        self.button = button\n        self.action = action\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKProperty.swift",
    "content": "//\n//  EKProperty.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic struct EKProperty {\n    \n    /** Button content descriptor */\n    public struct ButtonContent {\n        \n        public typealias Action = () -> ()\n        \n        /** Button title label content descriptor */\n        public var label: LabelContent\n        \n        /** Button background color */\n        public var backgroundColor: EKColor\n        public var highlightedBackgroundColor: EKColor\n\n        /** Content edge inset */\n        public var contentEdgeInset: CGFloat\n        \n        /** The display mode of the button */\n        public var displayMode: EKAttributes.DisplayMode\n        \n        /** Accessibility identifier that identifies the button */\n        public var accessibilityIdentifier: String?\n        \n        /** Action */\n        public var action: Action?\n        \n        public init(label: LabelContent,\n                    backgroundColor: EKColor,\n                    highlightedBackgroundColor: EKColor,\n                    contentEdgeInset: CGFloat = 5,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    accessibilityIdentifier: String? = nil,\n                    action: @escaping Action = {}) {\n            self.label = label\n            self.backgroundColor = backgroundColor\n            self.highlightedBackgroundColor = highlightedBackgroundColor\n            self.contentEdgeInset = contentEdgeInset\n            self.displayMode = displayMode\n            self.accessibilityIdentifier = accessibilityIdentifier\n            self.action = action\n        }\n        \n        public func backgroundColor(for traitCollection: UITraitCollection) -> UIColor {\n            return backgroundColor.color(for: traitCollection, mode: displayMode)\n        }\n        \n        public func highlightedBackgroundColor(for traitCollection: UITraitCollection) -> UIColor {\n            return highlightedBackgroundColor.color(for: traitCollection, mode: displayMode)\n        }\n        \n        public func highlighedLabelColor(for traitCollection: UITraitCollection) -> UIColor {\n            return label.style.color.with(alpha: 0.8).color(\n                for: traitCollection,\n                mode: label.style.displayMode\n            )\n        }\n    }\n    \n    /** Label content descriptor */\n    public struct LabelContent {\n        \n        /** The text */\n        public var text: String\n        \n        /** The label's style */\n        public var style: LabelStyle\n        \n        /** The label's accessibility ideentifier */\n        public var accessibilityIdentifier: String?\n        \n        public init(text: String,\n                    style: LabelStyle,\n                    accessibilityIdentifier: String? = nil) {\n            self.text = text\n            self.style = style\n            self.accessibilityIdentifier = accessibilityIdentifier\n        }\n    }\n    \n    /** Label style descriptor */\n    public struct LabelStyle {\n        \n        /** Font of the text */\n        public var font: UIFont\n        \n        /** Color of the text */\n        public var color: EKColor\n        \n        /** Text Alignment */\n        public var alignment: NSTextAlignment\n        \n        /** Number of lines */\n        public var numberOfLines: Int\n        \n        /** Display mode for the label */\n        public var displayMode: EKAttributes.DisplayMode\n        \n        public init(font: UIFont,\n                    color: EKColor,\n                    alignment: NSTextAlignment = .left,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    numberOfLines: Int = 0) {\n            self.font = font\n            self.color = color\n            self.alignment = alignment\n            self.displayMode = displayMode\n            self.numberOfLines = numberOfLines\n        }\n        \n        public func color(for traitCollection: UITraitCollection) -> UIColor {\n            return color.color(for: traitCollection, mode: displayMode)\n        }\n    }\n    \n    /** Image View style descriptor */\n    public struct ImageContent {\n        \n        /** Repeated-reversed animation throughout the presentation of an image */\n        public enum TransformAnimation {\n            case animate(duration: TimeInterval, options: UIView.AnimationOptions, transform: CGAffineTransform)\n            case none\n        }\n        \n        /** Tint color for the image/s */\n        public var tint: EKColor?\n        \n        /** The images */\n        public var images: [UIImage]\n        \n        /** Image sequence duration, if any */\n        public var imageSequenceAnimationDuration: TimeInterval\n        \n        /** Image View size - can be forced.\n         If nil, then the image view hugs content and resists compression */\n        public var size: CGSize?\n    \n        /** Content mode */\n        public var contentMode: UIView.ContentMode\n        \n        /** Should the image be rounded */\n        public var makesRound: Bool\n        \n        /** Repeated-Reversed animation */\n        public var animation: TransformAnimation\n        \n        /** The display mode of the image */\n        public var displayMode: EKAttributes.DisplayMode\n        \n        /** Image accessibility identifier */\n        public var accessibilityIdentifier: String?\n        \n        public init(imageName: String,\n                    animation: TransformAnimation = .none,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    size: CGSize? = nil,\n                    contentMode: UIView.ContentMode = .scaleToFill,\n                    tint: EKColor? = nil,\n                    makesRound: Bool = false,\n                    accessibilityIdentifier: String? = nil) {\n            let image = UIImage(named: imageName)!\n            self.init(image: image,\n                      displayMode: displayMode,\n                      size: size,\n                      tint: tint,\n                      contentMode: contentMode,\n                      makesRound: makesRound,\n                      accessibilityIdentifier: accessibilityIdentifier)\n        }\n        \n        public init(image: UIImage,\n                    animation: TransformAnimation = .none,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    size: CGSize? = nil,\n                    tint: EKColor? = nil,\n                    contentMode: UIView.ContentMode = .scaleToFill,\n                    makesRound: Bool = false,\n                    accessibilityIdentifier: String? = nil) {\n            self.images = [image]\n            self.size = size\n            self.tint = tint\n            self.displayMode = displayMode\n            self.contentMode = contentMode\n            self.makesRound = makesRound\n            self.animation = animation\n            self.imageSequenceAnimationDuration = 0\n            self.accessibilityIdentifier = accessibilityIdentifier\n        }\n        \n        public init(images: [UIImage],\n                    imageSequenceAnimationDuration: TimeInterval = 1,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    animation: TransformAnimation = .none,\n                    size: CGSize? = nil,\n                    tint: EKColor? = nil,\n                    contentMode: UIView.ContentMode = .scaleToFill,\n                    makesRound: Bool = false,\n                    accessibilityIdentifier: String? = nil) {\n            self.images = images\n            self.size = size\n            self.displayMode = displayMode\n            self.tint = tint\n            self.contentMode = contentMode\n            self.makesRound = makesRound\n            self.animation = animation\n            self.imageSequenceAnimationDuration = imageSequenceAnimationDuration\n            self.accessibilityIdentifier = accessibilityIdentifier\n        }\n        \n        public init(imagesNames: [String],\n                    imageSequenceAnimationDuration: TimeInterval = 1,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    animation: TransformAnimation = .none,\n                    size: CGSize? = nil,\n                    tint: EKColor? = nil,\n                    contentMode: UIView.ContentMode = .scaleToFill,\n                    makesRound: Bool = false,\n                    accessibilityIdentifier: String? = nil) {\n            let images = imagesNames.map { return UIImage(named: $0)! }\n            self.init(images: images,\n                      imageSequenceAnimationDuration: imageSequenceAnimationDuration,\n                      displayMode: displayMode,\n                      animation: animation,\n                      size: size,\n                      tint: tint,\n                      contentMode: contentMode,\n                      makesRound: makesRound,\n                      accessibilityIdentifier: accessibilityIdentifier)\n        }\n        \n        /** Quick thumbail property generator */\n        public static func thumb(with image: UIImage,\n                                 edgeSize: CGFloat) -> ImageContent {\n            return ImageContent(images: [image],\n                                size: CGSize(width: edgeSize, height: edgeSize),\n                                contentMode: .scaleAspectFill,\n                                makesRound: true)\n        }\n        \n        /** Quick thumbail property generator */\n        public static func thumb(with imageName: String,\n                                 edgeSize: CGFloat) -> ImageContent {\n            return ImageContent(imagesNames: [imageName],\n                                size: CGSize(width: edgeSize, height: edgeSize),\n                                contentMode: .scaleAspectFill,\n                                makesRound: true)\n        }\n        \n        public func tintColor(for traitCollection: UITraitCollection) -> UIColor? {\n            return tint?.color(for: traitCollection, mode: displayMode)\n        }\n    }\n    \n    /** Text field content **/\n    public struct TextFieldContent {\n        \n        // NOTE: Intentionally a reference type\n        class ContentWrapper {\n            var text = \"\"\n        }\n        \n        public weak var delegate: UITextFieldDelegate?\n        public var keyboardType: UIKeyboardType\n        public var isSecure: Bool\n        public var leadingImage: UIImage!\n        public var placeholder: LabelContent\n        public var textStyle: LabelStyle\n        public var tintColor: EKColor!\n        public var displayMode: EKAttributes.DisplayMode\n        public var bottomBorderColor: EKColor\n        public var accessibilityIdentifier: String?\n        let contentWrapper = ContentWrapper()\n        public var textContent: String {\n            set {\n                contentWrapper.text = newValue\n            }\n            get {\n                return contentWrapper.text\n            }\n        }\n        \n        public init(delegate: UITextFieldDelegate? = nil,\n                    keyboardType: UIKeyboardType = .default,\n                    placeholder: LabelContent,\n                    tintColor: EKColor? = nil,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    textStyle: LabelStyle,\n                    isSecure: Bool = false,\n                    leadingImage: UIImage? = nil,\n                    bottomBorderColor: EKColor = .clear,\n                    accessibilityIdentifier: String? = nil) {\n            self.delegate = delegate\n            self.keyboardType = keyboardType\n            self.placeholder = placeholder\n            self.textStyle = textStyle\n            self.tintColor = tintColor\n            self.displayMode = displayMode\n            self.isSecure = isSecure\n            self.leadingImage = leadingImage\n            self.bottomBorderColor = bottomBorderColor\n            self.accessibilityIdentifier = accessibilityIdentifier\n        }\n        \n        public func tintColor(for traitCollection: UITraitCollection) -> UIColor? {\n            return tintColor?.color(for: traitCollection, mode: displayMode)\n        }\n        \n        public func bottomBorderColor(for traitCollection: UITraitCollection) -> UIColor? {\n            return bottomBorderColor.color(for: traitCollection, mode: displayMode)\n        }\n    }\n    \n    /** Button bar content */\n    public struct ButtonBarContent {\n        \n        /** Button content array */\n        public var content: [ButtonContent] = []\n        \n        /** The color of the separator */\n        public var separatorColor: EKColor\n        \n        /** Upper threshold for the number of buttons (*ButtonContent*) for horizontal distribution. Must be a positive value */\n        public var horizontalDistributionThreshold: Int\n        \n        /** Determines whether the buttons expands animately */\n        public var expandAnimatedly: Bool\n        \n        /** The height of each button. All are equally distributed in their axis */\n        public var buttonHeight: CGFloat\n        \n        /** The display mode of the button bar */\n        public var displayMode: EKAttributes.DisplayMode\n        \n        public init(with buttonContents: ButtonContent...,\n                    separatorColor: EKColor,\n                    horizontalDistributionThreshold: Int = 2,\n                    buttonHeight: CGFloat = 50,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    expandAnimatedly: Bool) {\n            self.init(with: buttonContents,\n                      separatorColor: separatorColor,\n                      horizontalDistributionThreshold: horizontalDistributionThreshold,\n                      buttonHeight: buttonHeight,\n                      displayMode: displayMode,\n                      expandAnimatedly: expandAnimatedly)\n        }\n        \n        public init(with buttonContents: [ButtonContent],\n                    separatorColor: EKColor,\n                    horizontalDistributionThreshold: Int = 2,\n                    buttonHeight: CGFloat = 50,\n                    displayMode: EKAttributes.DisplayMode = .inferred,\n                    expandAnimatedly: Bool) {\n            guard horizontalDistributionThreshold > 0 else {\n                fatalError(\"horizontalDistributionThreshold Must have a positive value!\")\n            }\n            self.separatorColor = separatorColor\n            self.horizontalDistributionThreshold = horizontalDistributionThreshold\n            self.buttonHeight = buttonHeight\n            self.displayMode = displayMode\n            self.expandAnimatedly = expandAnimatedly\n            content.append(contentsOf: buttonContents)\n        }\n        \n        public func separatorColor(for traitCollection: UITraitCollection) -> UIColor {\n            return separatorColor.color(for: traitCollection, mode: displayMode)\n        }\n    }\n    \n    /** Rating item content */\n    public struct EKRatingItemContent {\n        public var title: EKProperty.LabelContent\n        public var description: EKProperty.LabelContent\n        public var unselectedImage: EKProperty.ImageContent\n        public var selectedImage: EKProperty.ImageContent\n        public var size: CGSize\n        \n        public init(title: EKProperty.LabelContent,\n                    description: EKProperty.LabelContent,\n                    unselectedImage: EKProperty.ImageContent,\n                    selectedImage: EKProperty.ImageContent,\n                    size: CGSize = CGSize(width: 50, height: 50)) {\n            self.title = title\n            self.description = description\n            self.unselectedImage = unselectedImage\n            self.selectedImage = selectedImage\n            self.size = size\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKRatingMessage.swift",
    "content": "//\n//  EKRatingMessage.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/1/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\npublic struct EKRatingMessage {\n    \n    // NOTE: Intentionally a reference type\n    class SelectedIndex {\n        var selectedIndex: Int!\n    }\n    \n    /** Selection */\n    public typealias Selection = (Int) -> Void\n\n    /** Initial title */\n    public var initialTitle: EKProperty.LabelContent\n    \n    /** Initial description */\n    public var initialDescription: EKProperty.LabelContent\n    \n    /** Rating items */\n    public var ratingItems: [EKProperty.EKRatingItemContent]\n    \n    /** Button bar content appears after selection */\n    public var buttonBarContent: EKProperty.ButtonBarContent\n    \n    /** Selection event - Each time the user interacts a rating star */\n    public var selection: Selection!\n\n    let selectedIndexRef = SelectedIndex()\n    \n    /** Selected index (if there is one) */\n    public var selectedIndex: Int? {\n        get {\n            return selectedIndexRef.selectedIndex\n        }\n        set {\n            selectedIndexRef.selectedIndex = newValue\n        }\n    }\n    \n    /** Initializer */\n    public init(initialTitle: EKProperty.LabelContent,\n                initialDescription: EKProperty.LabelContent,\n                ratingItems: [EKProperty.EKRatingItemContent],\n                buttonBarContent: EKProperty.ButtonBarContent,\n                selection: Selection? = nil) {\n        self.initialTitle = initialTitle\n        self.initialDescription = initialDescription\n        self.ratingItems = ratingItems\n        self.buttonBarContent = buttonBarContent\n        self.selection = selection\n    }\n}\n"
  },
  {
    "path": "Source/Model/EKSimpleMessage.swift",
    "content": "//\n//  EKSimpleMessage.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/1/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\npublic struct EKSimpleMessage {\n    \n    /** The image view descriptor */\n    public let image: EKProperty.ImageContent?\n    \n    /** The title label descriptor */\n    public let title: EKProperty.LabelContent\n    \n    /** The description label descriptor */\n    public let description: EKProperty.LabelContent\n        \n    public init(image: EKProperty.ImageContent? = nil,\n                title: EKProperty.LabelContent,\n                description: EKProperty.LabelContent) {\n        self.image = image\n        self.title = title\n        self.description = description\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Animation.swift",
    "content": "//\n//  EKAttributes+Animation.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\n// A protocol that describes an animation\nprotocol EKAnimation {\n    var delay: TimeInterval { get set }\n    var duration: TimeInterval { get set }\n    var spring: EKAttributes.Animation.Spring? { get set }\n}\n\n// A protocol that describes a range animation\nprotocol EKRangeAnimation: EKAnimation {\n    var start: CGFloat { get set }\n    var end: CGFloat { get set }\n}\n\npublic extension EKAttributes {\n    \n    /** Describes an animation that can be performed on the entry */\n    struct Animation: Equatable {\n    \n        /** Describes properties for a spring animation that can be performed on the entry */\n        public struct Spring: Equatable {\n            \n            /** The dampic of the spring animation */\n            public var damping: CGFloat\n            \n            /** The initial velocity of the spring animation */\n            public var initialVelocity: CGFloat\n            \n            /** Initializer */\n            public init(damping: CGFloat, initialVelocity: CGFloat) {\n                self.damping = damping\n                self.initialVelocity = initialVelocity\n            }\n        }\n\n        /** Describes an animation with range */\n        public struct RangeAnimation: EKRangeAnimation, Equatable {\n            \n            /** The duration of the range animation */\n            public var duration: TimeInterval\n            \n            /** The delay of the range animation */\n            public var delay: TimeInterval\n            \n            /** The start value of the range animation (e.g. alpha, scale) */\n            public var start: CGFloat\n            \n            /** The end value of the range animation (e.g. alpha, scale) */\n            public var end: CGFloat\n            \n            /** The spring of the animation */\n            public var spring: Spring?\n            \n            /** Initializer */\n            public init(from start: CGFloat, to end: CGFloat, duration: TimeInterval, delay: TimeInterval = 0, spring: Spring? = nil) {\n                self.start = start\n                self.end = end\n                self.delay = delay\n                self.duration = duration\n                self.spring = spring\n            }\n        }\n        \n        /** Describes translation animation */\n        public struct Translate: EKAnimation, Equatable {\n            \n            /** Describes the anchor position */\n            public enum AnchorPosition: Equatable {\n                \n                /** Top position - the entry shows from top or exits towards the top */\n                case top\n                \n                /** Bottom position - the entry shows from bottom or exits towards the bottom */\n                case bottom\n                \n                /** Automatic position - the entry shows and exits according to EKAttributes.Position value. If the position of the entry is top, bottom, the entry's translation anchor is top, bottom - respectively.*/\n                case automatic\n            }\n            \n            /** Animation duration */\n            public var duration: TimeInterval\n            \n            /** Animation delay */\n            public var delay: TimeInterval\n            \n            /** To where OR from the entry is animated */\n            public var anchorPosition: AnchorPosition\n            \n            /** Optional translation spring */\n            public var spring: Spring?\n\n            /** Initializer */\n            public init(duration: TimeInterval, anchorPosition: AnchorPosition = .automatic, delay: TimeInterval = 0, spring: Spring? = nil) {\n                self.anchorPosition = anchorPosition\n                self.duration = duration\n                self.delay = delay\n                self.spring = spring\n            }\n        }\n        \n        /** Translation animation prop */\n        public var translate: Translate?\n        \n        /** Scale animation prop */\n        public var scale: RangeAnimation?\n        \n        /** Fade animation prop */\n        public var fade: RangeAnimation?\n        \n        /** Does the animation contains translation */\n        public var containsTranslation: Bool {\n            return translate != nil\n        }\n        \n        /** Does the animation contains scale */\n        public var containsScale: Bool {\n            return scale != nil\n        }\n        \n        /** Does the animation contains fade */\n        public var containsFade: Bool {\n            return fade != nil\n        }\n        \n        /** Does the animation contains any animation whatsoever */\n        public var containsAnimation: Bool {\n            return containsTranslation || containsScale || containsFade\n        }\n        \n        /** Returns the maximum delay amongst all animations */\n        public var maxDelay: TimeInterval {\n            return max(translate?.delay ?? 0, max(scale?.delay ?? 0, fade?.delay ?? 0))\n        }\n        \n        /** Returns the maximum duration amongst all animations */\n        public var maxDuration: TimeInterval {\n            return max(translate?.duration ?? 0, max(scale?.duration ?? 0, fade?.duration ?? 0))\n        }\n        \n        /** Returns the maximum (duration+delay) amongst all animations */\n        public var totalDuration: TimeInterval {\n            return maxDelay + maxDuration\n        }\n        \n        /** Returns the maximum (duration+delay) amongst all animations */\n        public static var translation: Animation {\n            return Animation(translate: .init(duration: 0.3))\n        }\n        \n        /** No animation at all */\n        public static var none: Animation {\n            return Animation()\n        }\n        \n        /** Initializer */\n        public init(translate: Translate? = nil, scale: RangeAnimation? = nil, fade: RangeAnimation? = nil) {\n            self.translate = translate\n            self.scale = scale\n            self.fade = fade\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+BackgroundStyle.swift",
    "content": "//\n//  EKAttributes+BackgroundStyle.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic extension EKAttributes {\n    \n    /** The background style property */\n    enum BackgroundStyle: Equatable {\n        \n        /** Blur style for light and dark modes */\n        public struct BlurStyle: Equatable {\n            \n            public static var extra: BlurStyle {\n                return BlurStyle(light: .extraLight, dark: .dark)\n            }\n            \n            public static var standard: BlurStyle {\n                return BlurStyle(light: .light, dark: .dark)\n            }\n            \n            @available(iOS 10.0, *)\n            public static var prominent: BlurStyle {\n                return BlurStyle(light: .prominent, dark: .prominent)\n            }\n            \n            public static var dark: BlurStyle {\n                return BlurStyle(light: .dark, dark: .dark)\n            }\n            \n            let light: UIBlurEffect.Style\n            let dark: UIBlurEffect.Style\n            \n            public init(style: UIBlurEffect.Style) {\n                self.light = style\n                self.dark = style\n            }\n            \n            public init(light: UIBlurEffect.Style, dark: UIBlurEffect.Style) {\n                self.light = light\n                self.dark = dark\n            }\n            \n            /** Computes a proper `UIBlurEffect.Style` instance */\n            public func blurStyle(for traits: UITraitCollection,\n                                  mode: EKAttributes.DisplayMode) -> UIBlurEffect.Style {\n                switch mode {\n                case .inferred:\n                    if #available(iOS 13, *) {\n                        switch traits.userInterfaceStyle {\n                        case .light, .unspecified:\n                            return light\n                        case .dark:\n                            return dark\n                        @unknown default:\n                            return light\n                        }\n                    } else {\n                        return light\n                    }\n                case .light:\n                    return light\n                case .dark:\n                    return dark\n                }\n            }\n            \n            public func blurEffect(for traits: UITraitCollection,\n                                   mode: EKAttributes.DisplayMode) -> UIBlurEffect {\n                return UIBlurEffect(style: blurStyle(for: traits, mode: mode))\n            }\n        }\n        \n        /** Gradient background style */\n        public struct Gradient {\n            public var colors: [EKColor]\n            public var startPoint: CGPoint\n            public var endPoint: CGPoint\n            \n            public init(colors: [EKColor],\n                        startPoint: CGPoint,\n                        endPoint: CGPoint) {\n                self.colors = colors\n                self.startPoint = startPoint\n                self.endPoint = endPoint\n            }\n        }\n        \n        /** Visual Effect (Blurred) background style */\n        case visualEffect(style: BlurStyle)\n        \n        /** Color background style */\n        case color(color: EKColor)\n        \n        /** Gradient background style */\n        case gradient(gradient: Gradient)\n        \n        /** Image background style */\n        case image(image: UIImage)\n        \n        /** Clear background style */\n        case clear\n        \n        /** == operator overload */\n        public static func == (lhs: EKAttributes.BackgroundStyle,\n                               rhs: EKAttributes.BackgroundStyle) -> Bool {\n            switch (lhs, rhs) {\n            case (visualEffect(style: let leftStyle),\n                  visualEffect(style: let rightStyle)):\n                return leftStyle == rightStyle\n            case (color(color: let leftColor),\n                  color(color: let rightColor)):\n                return leftColor == rightColor\n            case (image(image: let leftImage),\n                  image(image: let rightImage)):\n                return leftImage == rightImage\n            case (gradient(gradient: let leftGradient),\n                  gradient(gradient: let rightGradient)):\n                for (leftColor, rightColor) in zip(leftGradient.colors, rightGradient.colors) {\n                    guard leftColor == rightColor else {\n                        return false\n                    }\n                }\n                return leftGradient.startPoint == rightGradient.startPoint &&\n                       leftGradient.endPoint == rightGradient.endPoint\n            case (clear, clear):\n                return true\n            default:\n                return false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+DisplayMode.swift",
    "content": "//\n//  EKAttributes+DisplayMode.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel on 26/07/2019.\n//  Copyright © 2019 CocoaPods. All rights reserved.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n    \n    /** Display mode for the entry */\n    enum DisplayMode {\n        \n        /** The display mode is inferred from the current user interface style */\n        case inferred\n        \n        /** The display mode is light */\n        case light\n        \n        /** The display mode is dark */\n        case dark\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Duration.swift",
    "content": "//\n//  EKAttributes+Duration.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/4/18.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n    typealias DisplayDuration = TimeInterval\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+FrameStyle.swift",
    "content": "//\n//  EKAttributes+FrameStyle.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/28/18.\n//\n\nimport Foundation\nimport CoreGraphics\nimport UIKit\n\npublic extension EKAttributes {\n    \n    /** Corner radius of the entry - Specifies the corners */\n    enum RoundCorners {\n        \n        /** *None* of the corners will be round */\n        case none\n        \n        /** *All* of the corners will be round */\n        case all(radius: CGFloat)\n        \n        /** Only the *top* left and right corners will be round */\n        case top(radius: CGFloat)\n        \n        /** Only the *bottom* left and right corners will be round */\n        case bottom(radius: CGFloat)\n        \n        var hasRoundCorners: Bool {\n            switch self {\n            case .none:\n                return false\n            default:\n                return true\n            }\n        }\n        \n        var cornerValues: (value: UIRectCorner, radius: CGFloat)? {\n            switch self {\n            case .all(radius: let radius):\n                return (value: .allCorners, radius: radius)\n            case .top(radius: let radius):\n                return (value: .top, radius: radius)\n            case .bottom(radius: let radius):\n                return (value: .bottom, radius: radius)\n            case .none:\n                return nil\n            }\n        }\n    }\n    \n    /** The border around the entry */\n    enum Border {\n        \n        /** No border */\n        case none\n        \n        /** Border wirh color and width */\n        case value(color: UIColor, width: CGFloat)\n        \n        var hasBorder: Bool {\n            switch self {\n            case .none:\n                return false\n            default:\n                return true\n            }\n        }\n        \n        var borderValues: (color: UIColor, width: CGFloat)? {\n            switch self {\n            case .value(color: let color, width: let width):\n                return(color: color, width: width)\n            case .none:\n                return nil\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+HapticFeedback.swift",
    "content": "//\n//  EKAttributes+HapticFeedback.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/1/18.\n//\n\nimport UIKit\n\npublic extension EKAttributes {\n    \n    /** Notification haptic feedback type. Adds an additional sensuous layer. Read more at UINotificationFeedbackType. Available from iOS 10, but you are not required to check the iOS version before using it. It's automatically handled by the kit.\n     */\n    enum NotificationHapticFeedback {\n        case success\n        case warning\n        case error\n        case none\n        \n        @available(iOS 10.0, *)\n        var value: UINotificationFeedbackGenerator.FeedbackType? {\n            switch self {\n            case .success:\n                return .success\n            case .warning:\n                return .warning\n            case .error:\n                return .error\n            case .none:\n                return nil\n            }\n        }\n        \n        var isValid: Bool {\n            return self != .none\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+LifecycleActions.swift",
    "content": "//\n//  EKAttributes+LifecycleActions.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 6/16/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n\n    /** Contains optionally injected events that take place during the entry lifecycle */\n    struct LifecycleEvents {\n        \n        public typealias Event = () -> Void\n\n        /** Executed before the entry appears - before the animation starts.\n         Might not get called in case another entry with a higher display priority is displayed.\n         */\n        public var willAppear: Event?\n        \n        /** Executed after the animation ends.\n         Might not get called in case another entry with a higher display priority is displayed.\n         */\n        public var didAppear: Event?\n\n        /** Executed before the entry disappears (Before the animation starts) */\n        public var willDisappear: Event?\n        \n        /** Executed after the entry disappears (After the animation ends) */\n        public var didDisappear: Event?\n        \n        public init(willAppear: Event? = nil, didAppear: Event? = nil, willDisappear: Event? = nil, didDisappear: Event? = nil) {\n            self.willAppear = willAppear\n            self.didAppear = didAppear\n            self.willDisappear = willDisappear\n            self.didDisappear = didDisappear\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+PopBehavior.swift",
    "content": "//\n//  EKAttributes+PopBehavior.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/26/18.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n    \n    /** Describes the entry behavior when a new entry shows (with equal or higher display-priority) */\n    enum PopBehavior {\n                \n        /** The entry disappears promptly (Does not animates out) when a new one shows */\n        case overridden\n        \n        /** Animate the entry out - The entry rolls out when a new one shows */\n        case animated(animation: Animation)\n        \n        public var isOverriden: Bool {\n            switch self {\n            case .overridden:\n                return true\n            case .animated:\n                return false\n            }\n        }\n        \n        var animation: Animation? {\n            switch self {\n            case .animated(animation: let animation):\n                return animation\n            case .overridden:\n                return nil\n            }\n        }\n        \n        func validate() {\n            #if DEBUG\n            guard let animation = animation else { return }\n            guard animation == .none else { return }\n            print(\"\"\"\n            SwiftEntryKit warning: cannot associate value `EKAttributes.Animation()`\n            with `EKAttributes.PopBehavior.animated`. This may result in undefined behavior.\n            Please use `PopBehavior.overridden` instead.\n            \"\"\")\n            #endif\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Position.swift",
    "content": "//\n//  EKAttributes+Position.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n\n    /** The position of the entry. */\n    enum Position {\n        \n        /** The entry appears at the top of the screen. */\n        case top\n        \n        /** The entry appears at the bottom of the screen. */\n        case bottom\n        \n        /** The entry appears at the center of the screen. */\n        case center\n        \n        public var isTop: Bool {\n            return self == .top\n        }\n        \n        public var isCenter: Bool {\n            return self == .center\n        }\n        \n        public var isBottom: Bool {\n            return self == .bottom\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+PositionConstraints.swift",
    "content": "//\n//  EKAttributes+Frame.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic extension EKAttributes {\n    \n    /** Describes the frame of the entry. It's limitations, width and offset from the anchor (top / bottom of the screen) */\n    struct PositionConstraints {\n\n        /** Describes safe area relation */\n        public enum SafeArea {\n            \n            /** Entry overrides safe area */\n            case overridden\n            \n            /** The entry shows outs. But can optionally be colored */\n            case empty(fillSafeArea: Bool)\n            \n            public var isOverridden: Bool {\n                switch self {\n                case .overridden:\n                    return true\n                default:\n                    return false\n                }\n            }\n        }\n        \n        /** Describes an edge constraint of the entry */\n        public enum Edge {\n            \n            /** Ratio constraint to screen edge */\n            case ratio(value: CGFloat)\n            \n            /** Offset from each edge of the screen */\n            case offset(value: CGFloat)\n            \n            /** Constant edge length */\n            case constant(value: CGFloat)\n            \n            /** Unspecified edge length */\n            case intrinsic\n            \n            /** Edge totally filled */\n            public static var fill: Edge {\n                return .offset(value: 0)\n            }\n        }\n        \n        /** Describes the size of the entry */\n        public struct Size {\n            \n            /** Describes a width constraint */\n            public var width: Edge\n            \n            /** Describes a height constraint */\n            public var height: Edge\n            \n            /** Initializer */\n            public init(width: Edge, height: Edge) {\n                self.width = width\n                self.height = height\n            }\n            \n            /** The content's size. Entry's content view must have tight constraints */\n            public static var intrinsic: Size {\n                return Size(width: .intrinsic, height: .intrinsic)\n            }\n            \n            /** The content's size. Entry's content view must have tight constraints */\n            public static var sizeToWidth: Size {\n                return Size(width: .offset(value: 0), height: .intrinsic)\n            }\n            \n            /** Screen size, without horizontal or vertical offset */\n            public static var screen: Size {\n                return Size(width: .fill, height: .fill)\n            }\n        }\n        \n        /** The relation to the keyboard's top and the screen's top while it is opened */\n        public enum KeyboardRelation {\n            \n            /** Describes the offset when the keyboard is opened */\n            public struct Offset {\n                \n                /** Describes top keyboard offset to the entry's bottom */\n                public var bottom: CGFloat\n                \n                /** Describes top screen offset to the entry's top, useful to prevent the entry from exceeding the screen top bounds */\n                public var screenEdgeResistance: CGFloat?\n                \n                public init(bottom: CGFloat = 0, screenEdgeResistance: CGFloat? = nil) {\n                    self.bottom = bottom\n                    self.screenEdgeResistance = screenEdgeResistance\n                }\n                \n                /** None offset */\n                public static var none: Offset {\n                    return Offset()\n                }\n            }\n            \n            /** Bind the entry's bottom to the keyboard's top with an offset.\n             Additionally, the top edge of the screen can have a resistance offset which the entry isn't able to cross.\n             The resistance is mostly used when the device orientation changes and the entry's frame crosses the screen bounds.\n             Current isn't supported with center entry position.*/\n            case bind(offset: Offset)\n            \n            /** Entry is unbound to the keyboard. It's location doesn't change. */\n            case unbind\n            \n            /** Returns true if the entry is bound to the keyboard */\n            public var isBound: Bool {\n                switch self {\n                case .bind(offset: _):\n                    return true\n                case .unbind:\n                    return false\n                }\n            }\n        }\n        \n        /** Rotation related position constraints */\n        public struct Rotation {\n            \n            /** Attributes of supported interface orientations */\n            public enum SupportedInterfaceOrientation {\n                \n                /** Uses standard supported interface orientation (target specification in general settings) */\n                case standard\n                \n                /** Supports all orinetations */\n                case all\n            }\n            \n            /** Autorotate the entry along with the device orientation */\n            public var isEnabled = true\n            \n            /** The screen autorotates with accordance to this option */\n            public var supportedInterfaceOrientations = SupportedInterfaceOrientation.standard\n            \n            public init() {}\n        }\n        \n        /** The rotation attributes of the entry */\n        public var rotation = Rotation()\n        \n        /** The entry can be bound to keyboard in case of appearance */\n        public var keyboardRelation = KeyboardRelation.unbind\n        \n        /** The size of the entry */\n        public var size: Size\n        \n        /** The maximum size of the entry */\n        public var maxSize: Size\n\n        /** The vertical offset from the top or bottom anchor */\n        public var verticalOffset: CGFloat\n        \n        /** Can be used to display the content outside the safe area margins such as on the notch of the iPhone X or the status bar itself. */\n        public var safeArea = SafeArea.empty(fillSafeArea: false)\n        \n        public var hasVerticalOffset: Bool {\n            return verticalOffset > 0\n        }\n        \n        /** Returns a floating entry (float-like) */\n        public static var float: PositionConstraints {\n            return PositionConstraints(verticalOffset: 10, size: .init(width: .offset(value: 20), height: .intrinsic))\n        }\n        \n        /** A full width entry (toast-like) */\n        public static var fullWidth: PositionConstraints {\n            return PositionConstraints(verticalOffset: 0, size: .sizeToWidth)\n        }\n        \n        /** A full screen entry - fills the entire screen, modal-like */\n        public static var fullScreen: PositionConstraints {\n            return PositionConstraints(verticalOffset: 0, size: .screen)\n        }\n        \n        /** Initialize with default parameters */\n        public init(verticalOffset: CGFloat = 0, size: Size = .sizeToWidth, maxSize: Size = .intrinsic) {\n            self.verticalOffset = verticalOffset\n            self.size = size\n            self.maxSize = maxSize\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Precedence.swift",
    "content": "//\n//  EKAttributes+Precedence.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/29/18.\n//\n\nimport Foundation\n\nfileprivate extension Int {\n    var isValidDisplayPriority: Bool {\n        return self >= EKAttributes.Precedence.Priority.minRawValue && self <= EKAttributes.Precedence.Priority.maxRawValue\n    }\n}\n\npublic extension EKAttributes {\n    \n    /**\n     Describes the manner on which the entry is pushed and displayed.\n     See the various values of more explanation.\n     */\n    enum Precedence {\n        \n        /**\n         The display priority of the entry - Determines whether is can be overriden by other entries.\n         Must be in range [0...1000]\n         */\n        public struct Priority: Hashable, Equatable, RawRepresentable, Comparable {\n            public var rawValue: Int\n            \n            public var hashValue: Int {\n                return rawValue\n            }\n            \n            public init(_ rawValue: Int) {\n                assert(rawValue.isValidDisplayPriority, \"Display Priority must be in range [\\(Priority.minRawValue)...\\(Priority.maxRawValue)]\")\n                self.rawValue = rawValue\n            }\n            \n            public init(rawValue: Int) {\n                assert(rawValue.isValidDisplayPriority, \"Display Priority must be in range [\\(Priority.minRawValue)...\\(Priority.maxRawValue)]\")\n                self.rawValue = rawValue\n            }\n            \n            public static func == (lhs: Priority, rhs: Priority) -> Bool {\n                return lhs.rawValue == rhs.rawValue\n            }\n            \n            public static func < (lhs: Priority, rhs: Priority) -> Bool {\n                return lhs.rawValue < rhs.rawValue\n            }\n        }\n        \n        /**\n         Describes the queueing heoristic of entries.\n         */\n        public enum QueueingHeuristic {\n            \n            /** Determines the heuristic which the entry-queue is based on */\n            public static var value = QueueingHeuristic.priority\n            \n            /** Chronological - FIFO */\n            case chronological\n            \n            /** Ordered by priority */\n            case priority\n            \n            /** Returns the caching heuristics mechanism that determines the priority in queue */\n            var heuristic: EntryCachingHeuristic {\n                switch self {\n                case .chronological:\n                    return EKEntryChronologicalQueue()\n                case .priority:\n                    return EKEntryPriorityQueue()\n                }\n            }\n        }\n        \n        /**\n         Describes an *overriding* behavior for a new entry.\n         - In case no previous entry is currently presented, display the new entry.\n         - In case there is an entry that is currently presented - override it using the new entry. Also optionally drop all previously enqueued entries.\n         */\n        case override(priority: Priority, dropEnqueuedEntries: Bool)\n        \n        /**\n         Describes a FIFO behavior for an entry presentation.\n         - In case no previous entry is currently presented, display the new entry.\n         - In case there is an entry that is currently presented - enqueue the new entry, an present it just after the previous one is dismissed.\n         */\n        case enqueue(priority: Priority)\n        \n        var isEnqueue: Bool {\n            switch self {\n            case .enqueue:\n                return true\n            default:\n                return false\n            }\n        }\n        \n        /** Setter / Getter for the display priority */\n        public var priority: Priority {\n            set {\n                switch self {\n                case .enqueue(priority: _):\n                    self = .enqueue(priority: newValue)\n                case .override(priority: _, dropEnqueuedEntries: let dropEnqueuedEntries):\n                    self = .override(priority: newValue, dropEnqueuedEntries: dropEnqueuedEntries)\n                }\n            }\n            get {\n                switch self {\n                case .enqueue(priority: let priority):\n                    return priority\n                case .override(priority: let priority, dropEnqueuedEntries: _):\n                    return priority\n                }\n            }\n        }\n    }\n}\n\n/** High priority entries can be overriden by other equal or higher priority entries only.\n Entries are ignored as a higher priority entry is being displayed.\n High priority entry overrides any other entry including another equal priority one.\n You can you on of the values (.max, high, normal, low, min) and also set your own values. */\npublic extension EKAttributes.Precedence.Priority {\n    static let maxRawValue = 1000\n    static let highRawValue = 750\n    static let normalRawValue = 500\n    static let lowRawValue = 250\n    static let minRawValue = 0\n\n    /** Max - the highest possible priority of an entry. Can override only entries with *max* priority */\n    static let max = EKAttributes.Precedence.Priority(rawValue: maxRawValue)\n    static let high = EKAttributes.Precedence.Priority(rawValue: highRawValue)\n    static let normal = EKAttributes.Precedence.Priority(rawValue: normalRawValue)\n    static let low = EKAttributes.Precedence.Priority(rawValue: lowRawValue)\n    static let min = EKAttributes.Precedence.Priority(rawValue: minRawValue)\n}\n\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Presets.swift",
    "content": "//\n//  EKAttributes+Presets.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/23/18.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n    \n    /** Default attributes - Can be mutated according to the hosting application theme */\n    static var `default` = EKAttributes()\n    \n    /** Toast preset - The frame fills margins and safe area is filled with background view */\n    static var toast: EKAttributes {\n        var attributes = EKAttributes()\n        attributes.positionConstraints = .fullWidth\n        attributes.positionConstraints.safeArea = .empty(fillSafeArea: true)\n        attributes.windowLevel = .statusBar\n        attributes.scroll = .edgeCrossingDisabled(swipeable: true)\n        attributes.popBehavior = .animated(animation: .translation)\n        return attributes\n    }\n    \n    /** Float preset - The frame is margined and the safe area is left cleared */\n    static var float: EKAttributes {\n        var attributes = EKAttributes()\n        attributes.positionConstraints = .float\n        attributes.roundCorners = .all(radius: 10)\n        attributes.positionConstraints.safeArea = .empty(fillSafeArea: false)\n        attributes.windowLevel = .statusBar\n        return attributes\n    }\n    \n    /** Preset for top float entry */\n    static var topFloat: EKAttributes {\n        var attributes = float\n        attributes.position = .top\n        return attributes\n    }\n    \n    /** Preset for a bottom float entry */\n    static var bottomFloat: EKAttributes {\n        var attributes = float\n        attributes.position = .bottom\n        return attributes\n    }\n    \n    /** Preset for a center float entry */\n    static var centerFloat: EKAttributes {\n        var attributes = float\n        attributes.position = .center\n        return attributes\n    }\n    \n    /** Preset for a bottom toast entry */\n    static var bottomToast: EKAttributes {\n        var attributes = toast\n        attributes.position = .bottom\n        return attributes\n    }\n    \n    /** Preset for a top toast entry */\n    static var topToast: EKAttributes {\n        var attributes = toast\n        attributes.position = .top\n        return attributes\n    }\n    \n    /** Preset for a top note entry */\n    static var topNote: EKAttributes {\n        var attributes = topToast\n        attributes.scroll = .disabled\n        attributes.windowLevel = .normal\n        attributes.entryInteraction = .absorbTouches\n        return attributes\n    }\n    \n    /** Preset for a bottom note entry */\n    static var bottomNote: EKAttributes {\n        var attributes = bottomToast\n        attributes.scroll = .disabled\n        attributes.windowLevel = .normal\n        attributes.entryInteraction = .absorbTouches\n        return attributes\n    }\n    \n    /** Preset for a status bar entry - appears on top of the status bar */\n    static var statusBar: EKAttributes {\n        var attributes = topToast\n        attributes.windowLevel = .statusBar\n        attributes.entryInteraction = .absorbTouches\n        attributes.positionConstraints.safeArea = .overridden\n        return attributes\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Scroll.swift",
    "content": "//\n//  EKAttributes+Scroll.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/30/18.\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic extension EKAttributes {\n    \n    /** Describes the event of scroll user interaction */\n    enum Scroll {\n    \n        /** Describes the event when the user leaves the entry after rubber-banding it - How the entry behaves */\n        public struct PullbackAnimation {\n            public var duration: TimeInterval\n            public var damping: CGFloat\n            public var initialSpringVelocity: CGFloat\n            \n            public init(duration: TimeInterval, damping: CGFloat, initialSpringVelocity: CGFloat) {\n                self.duration = duration\n                self.damping = damping\n                self.initialSpringVelocity = initialSpringVelocity\n            }\n            \n            /** The entry is jolted when it's pulled back into the original position */\n            public static var jolt: PullbackAnimation {\n                return PullbackAnimation(duration: 0.5, damping: 0.3, initialSpringVelocity: 10)\n            }\n            \n            /** The view eases out when it's pulled back into the original position */\n            public static var easeOut: PullbackAnimation {\n                return PullbackAnimation(duration: 0.3, damping: 1, initialSpringVelocity: 10)\n            }\n        }\n        \n        /** The scroll ability is totally disabled */\n        case disabled\n        \n        /** The scroll in the opposite direction to the edge is disabled */\n        case edgeCrossingDisabled(swipeable: Bool)\n        \n        /** The scroll abiliby is enabled */\n        case enabled(swipeable: Bool, pullbackAnimation: PullbackAnimation)\n        \n        var isEnabled: Bool {\n            switch self {\n            case .disabled:\n                return false\n            default:\n                return true\n            }\n        }\n        \n        var isSwipeable: Bool {\n            switch self {\n            case .edgeCrossingDisabled(swipeable: let swipeable), .enabled(swipeable: let swipeable, pullbackAnimation: _):\n                return swipeable\n            default:\n                return false\n            }\n        }\n        \n        var isEdgeCrossingEnabled: Bool {\n            switch self {\n            case .edgeCrossingDisabled:\n                return false\n            default:\n                return true\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Shadow.swift",
    "content": "//\n//  EKAttributes+Shadow.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\npublic extension EKAttributes {\n\n    /** The shadow around the entry */\n    enum Shadow {\n        \n        /** No shadow */\n        case none\n        \n        /** Shadow with value */\n        case active(with: Value)\n        \n        /** The shadow properties */\n        public struct Value {\n            public let radius: CGFloat\n            public let opacity: Float\n            public let color: EKColor\n            public let offset: CGSize\n            \n            public init(color: EKColor = .black,\n                        opacity: Float,\n                        radius: CGFloat,\n                        offset: CGSize = .zero) {\n                self.color = color\n                self.radius = radius\n                self.offset = offset\n                self.opacity = opacity\n            }\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+StatusBar.swift",
    "content": "//\n//  EKAttributes+StatusBar.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/25/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic extension EKAttributes {\n    \n    /** Status bar appearance */\n    enum StatusBar {\n        \n        /** The appearance of the status bar */\n        public typealias Appearance = (visible: Bool, style: UIStatusBarStyle)\n        \n        /** Ignored. Status bar is ignored by entries with this apperance value*/\n        case ignored\n        \n        /** Hidden. Doesn't apply to iPhone X */\n        case hidden\n        \n        /** Visible with explicit dark style */\n        case dark\n        \n        /** Visible with explicit light style */\n        case light\n        \n        /** Keep previous state of status bar.\n         In case there is an already displayed entry, keep its status bar appearance.\n         In case the app is already displaying a status bar, keep its appearance */\n        case inferred\n        \n        /** Returns the status bar appearance.\n         Note: See *Appearance* */\n        public var appearance: Appearance {\n            switch self {\n            case .dark:\n                if #available(iOS 13, *) {\n                    return (true, .darkContent)\n                } else {\n                    return (true, .default)\n                }\n            case .light:\n                return (true, .lightContent)\n            case .inferred:\n                return StatusBar.currentAppearance\n            case .hidden:\n                return (false, StatusBar.currentStyle)\n            case .ignored:\n                fatalError(\"There is no defined appearance for an ignored status bar\")\n            }\n        }\n        \n        /** Returns the status bar according to a given appearance */\n        public static func statusBar(by appearance: Appearance) -> StatusBar {\n            guard appearance.visible else {\n                return .hidden\n            }\n            switch appearance.style {\n            case .lightContent:\n                return .light\n            default:\n                return .dark\n            }\n        }\n        \n        /** Returns the current appearance */\n        public static var currentAppearance: Appearance {\n            return (StatusBar.isCurrentVisible, StatusBar.currentStyle)\n        }\n        \n        /** Returns the current status bar */\n        public static var currentStatusBar: StatusBar {\n            return statusBar(by: currentAppearance)\n        }\n        \n        // Accessors\n        // TODO: Use `statusBarManager` of the window scene on iOS 13\n        private static var currentStyle: UIStatusBarStyle {\n            return UIApplication.shared.statusBarStyle\n        }\n        \n        // TODO: Use `statusBarManager` of the window scene on iOS 13\n        private static var isCurrentVisible: Bool {\n            return !UIApplication.shared.isStatusBarHidden\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+UserInteraction.swift",
    "content": "//\n//  EKAttributes+UserInteraction.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\n\npublic extension EKAttributes {\n    \n    /** Describes the user interaction events that are triggered as the user taps the entry / screen */\n    struct UserInteraction {\n        \n        /** Code that is executed when the user taps the entry / screen */\n        public typealias Action = () -> ()\n        \n        /** The default event that happens as the user interacts */\n        public enum Default {\n            \n            /** Absorbs touches. The entry / screen does nothing (Swallows the touch) */\n            case absorbTouches\n            \n            /** Touches delay the exit of the entry */\n            case delayExit(by: TimeInterval)\n            \n            /** Taps dismiss the entry immediately */\n            case dismissEntry\n            \n            /** Touches are forwarded to the lower window (In most cases it would be the application main window that will handle it */\n            case forward\n        }\n        \n        var isResponsive: Bool {\n            switch defaultAction {\n            case .forward:\n                return false\n            default:\n                return true\n            }\n        }\n        \n        var isDelayExit: Bool {\n            switch defaultAction {\n            case .delayExit:\n                return true\n            default:\n                return false\n            }\n        }\n        \n        /** A default action that is executed when the entry or the screen are interacted by the user */\n        public var defaultAction: Default\n        \n        /** Additional actions that can be customized by the user */\n        public var customTapActions: [Action]\n        \n        public init(defaultAction: Default = .absorbTouches, customTapActions: [Action] = []) {\n            self.defaultAction = defaultAction\n            self.customTapActions = customTapActions\n        }\n        \n        /** Dismiss action */\n        public static var dismiss: UserInteraction {\n            return UserInteraction(defaultAction: .dismissEntry)\n        }\n        \n        /** Forward action */\n        public static var forward: UserInteraction {\n            return UserInteraction(defaultAction: .forward)\n        }\n        \n        /** Absorb touches action */\n        public static var absorbTouches: UserInteraction {\n            return UserInteraction(defaultAction: .absorbTouches)\n        }\n        \n        /** Delay exit action */\n        public static func delayExit(by delay: TimeInterval) -> UserInteraction {\n            return UserInteraction(defaultAction: .delayExit(by: delay))\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+Validations.swift",
    "content": "//\n//  EKAttributes+Validations.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/18/18.\n//\n\nimport Foundation\n\nextension EKAttributes {\n    \n    private static var minDisplayDuration: DisplayDuration {\n        return 0\n    }\n    \n    var validateDisplayDuration: Bool {\n        guard displayDuration >= EKAttributes.minDisplayDuration else {\n            return false\n        }\n        return true\n    }\n    \n    var validateWindowLevel: Bool {\n        return windowLevel.value >= .normal\n    }\n    \n    var isValid: Bool {\n        return validateDisplayDuration && validateWindowLevel\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes+WindowLevel.swift",
    "content": "//\n//  EKAttributes+WindowLevel.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/21/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\npublic extension EKAttributes {\n    \n    /** Describes the window level in which the entry would be displayed */\n    enum WindowLevel {\n        \n        /** Above the alerts */\n        case alerts\n        \n        /** Above the status bar */\n        case statusBar\n        \n        /** Above the application window */\n        case normal\n        \n        /** Custom level */\n        case custom(level: UIWindow.Level)\n        \n        /** Returns the raw value - the window level itself */\n        public var value: UIWindow.Level {\n            switch self {\n            case .alerts:\n                return .alert\n            case .statusBar:\n                return .statusBar\n            case .normal:\n                return .normal\n            case .custom(level: let level):\n                return level\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Model/EntryAttributes/EKAttributes.swift",
    "content": "//\n//  EKAttributes.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/19/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\npublic struct EKAttributes {\n    \n    // MARK: Identification\n    \n    /**\n     A settable **optional** name that matches the entry-attributes.\n     - Nameless entries cannot be inquired using *SwiftEntryKit.isCurrentlyDisplaying(entryNamed: _) -> Bool*\n     */\n    public var name: String?\n    \n    // MARK: Display Attributes\n    \n    /** Entry presentation window level */\n    public var windowLevel = WindowLevel.statusBar\n    \n    /** The position of the entry inside the screen */\n    public var position = Position.top\n\n    /** The display manner of the entry. */\n    public var precedence = Precedence.override(priority: .normal, dropEnqueuedEntries: false)\n    \n    /** Describes how long the entry is displayed before it is dismissed */\n    public var displayDuration: DisplayDuration = 2 // Use .infinity for infinite duration\n    \n    /** The frame attributes of the entry */\n    public var positionConstraints = PositionConstraints()\n    \n    // MARK: User Interaction Attributes\n    \n    /** Describes what happens when the user interacts the screen,\n     forwards the touch to the application window by default */\n    public var screenInteraction = UserInteraction.forward\n    \n    /** Describes what happens when the user interacts the entry,\n     dismisses the content by default */\n    public var entryInteraction = UserInteraction.dismiss\n\n    /** Describes the scrolling behaviour of the entry.\n     The entry can be swiped out and in with an ability to spring back with a jolt */\n    public var scroll = Scroll.enabled(swipeable: true, pullbackAnimation: .jolt)\n    \n    /** Generate haptic feedback once the entry is displayed */\n    public var hapticFeedbackType = NotificationHapticFeedback.none\n    \n    /** Describes the actions that take place when the entry appears or is being dismissed */\n    public var lifecycleEvents = LifecycleEvents()\n    \n    // MARK: Theme & Style Attributes\n    \n    /** The display mode of the entry */\n    public var displayMode = DisplayMode.inferred\n    \n    /** Describes the entry's background appearance while it shows */\n    public var entryBackground = BackgroundStyle.clear\n    \n    /** Describes the background appearance while the entry shows */\n    public var screenBackground = BackgroundStyle.clear\n    \n    /** The shadow around the entry */\n    public var shadow = Shadow.none\n    \n    /** The corner attributes */\n    public var roundCorners = RoundCorners.none\n    \n    /** The border around the entry */\n    public var border = Border.none\n    \n    /** Preferred status bar style while the entry shows */\n    public var statusBar = StatusBar.inferred\n    \n    // MARK: Animation Attributes\n    \n    /** Describes how the entry animates in */\n    public var entranceAnimation = Animation.translation\n    \n    /** Describes how the entry animates out */\n    public var exitAnimation = Animation.translation\n    \n    /** Describes the previous entry behaviour when a new entry with higher display-priority shows */\n    public var popBehavior = PopBehavior.animated(animation: .translation) {\n        didSet {\n            popBehavior.validate()\n        }\n    }\n\n    /** Init with default attributes */\n    public init() {}\n}\n"
  },
  {
    "path": "Source/SwiftEntryKit.swift",
    "content": "//\n//  SwiftEntryKit.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/29/18.\n//\n\nimport UIKit\n\n/**\n A stateless, threadsafe (unless described otherwise) entry point that contains the display and the dismissal logic of entries.\n */\npublic final class SwiftEntryKit {\n    \n    /** Describes the a single or multiple entries for possible dismissal states */\n    public enum EntryDismissalDescriptor {\n        \n        /** Describes specific entry / entries with name */\n        case specific(entryName: String)\n        \n        /** Describes a group of entries with lower or equal display priority */\n        case prioritizedLowerOrEqualTo(priority: EKAttributes.Precedence.Priority)\n        \n        /** Describes all the entries that are currently in the queue and pending presentation */\n        case enqueued\n        \n        /** Describes all the entries */\n        case all\n        \n        /** Describes the currently displayed entry */\n        case displayed\n    }\n    \n    /** The window to rollback to after dismissal */\n    public enum RollbackWindow {\n        \n        /** The main window */\n        case main\n        \n        /** A given custom window */\n        case custom(window: UIWindow)\n    }\n    \n    /** Completion handler for the dismissal method */\n    public typealias DismissCompletionHandler = () -> Void\n    \n    /** Cannot be instantiated, customized, inherited. */\n    private init() {}\n    \n    /**\n     Returns the window that displays the entry.\n     **Warning**: the returned `UIWindow` instance is `nil` in case\n     no entry is currently displayed.\n     This can be used\n     */\n    public class var window: UIWindow? {\n        return EKWindowProvider.shared.entryWindow\n    }\n    \n    /**\n     Returns true if **any** entry is currently displayed.\n     - Not thread safe - should be called from the main queue only in order to receive a reliable result.\n     - Convenience computed variable. Using it is the same as invoking **isCurrentlyDisplaying() -> Bool** (witohut the name of the entry).\n     */\n    public class var isCurrentlyDisplaying: Bool {\n        return isCurrentlyDisplaying()\n    }\n    \n    /**\n     Returns true if an entry with a given name is currently displayed.\n     - Not thread safe - should be called from the main queue only in order to receive a reliable result.\n     - If invoked with *name* = *nil* or without the parameter value, it will return *true* if **any** entry is currently displayed.\n     - Returns a *false* value for currently enqueued entries.\n     - parameter name: The name of the entry. Its default value is *nil*.\n     */\n    public class func isCurrentlyDisplaying(entryNamed name: String? = nil) -> Bool {\n        return EKWindowProvider.shared.isCurrentlyDisplaying(entryNamed: name)\n    }\n    \n    /**\n     Returns true if **any** entry is currently enqueued and waiting to be displayed.\n     - Not thread safe - should be called from the main queue only in order to receive a reliable result.\n     - Convenience computed variable. Using it is the same as invoking **~queueContains() -> Bool** (witohut the name of the entry)\n     */\n    public class var isQueueEmpty: Bool {\n        return !queueContains()\n    }\n    \n    /**\n     Returns true if an entry with a given name is currently enqueued and waiting to be displayed.\n     - Not thread safe - should be called from the main queue only in order to receive a reliable result.\n     - If invoked with *name* = *nil* or without the parameter value, it will return *true* if **any** entry is currently displayed, meaning, the queue is not currently empty.\n     - parameter name: The name of the entry. Its default value is *nil*.\n     */\n    public class func queueContains(entryNamed name: String? = nil) -> Bool {\n        return EKWindowProvider.shared.queueContains(entryNamed: name)\n    }\n    \n    /**\n     Displays a given entry view using an attributes struct.\n     - A thread-safe method - Can be invokes from any thread\n     - A class method - Should be called on the class\n     - parameter view: Custom view that is to be displayed\n     - parameter attributes: Display properties\n     - parameter presentInsideKeyWindow: Indicates whether the entry window should become the key window.\n     - parameter rollbackWindow: After the entry has been dismissed, SwiftEntryKit rolls back to the given window. By default it is *.main* which is the app main window\n     */\n    public class func display(entry view: UIView, using attributes: EKAttributes, presentInsideKeyWindow: Bool = false, rollbackWindow: RollbackWindow = .main) {\n        DispatchQueue.main.async {\n            EKWindowProvider.shared.display(view: view, using: attributes, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow)\n        }\n    }\n    \n    /**\n     Displays a given entry view controller using an attributes struct.\n     - A thread-safe method - Can be invokes from any thread\n     - A class method - Should be called on the class\n     - parameter view: Custom view that is to be displayed\n     - parameter attributes: Display properties\n     - parameter presentInsideKeyWindow: Indicates whether the entry window should become the key window.\n     - parameter rollbackWindow: After the entry has been dismissed, SwiftEntryKit rolls back to the given window. By default it is *.main* - which is the app main window\n     */\n    public class func display(entry viewController: UIViewController, using attributes: EKAttributes, presentInsideKeyWindow: Bool = false, rollbackWindow: RollbackWindow = .main) {\n        DispatchQueue.main.async {\n            EKWindowProvider.shared.display(viewController: viewController, using: attributes, presentInsideKeyWindow: presentInsideKeyWindow, rollbackWindow: rollbackWindow)\n        }\n    }\n    \n    /**\n     ALPHA FEATURE: Transform the previous entry to the current one using the previous attributes struct.\n     - A thread-safe method - Can be invoked from any thread.\n     - A class method - Should be called on the class.\n     - This feature hasn't been fully tested. Use with caution.\n     - parameter view: Custom view that is to be displayed instead of the currently displayed entry\n     */\n    public class func transform(to view: UIView) {\n        DispatchQueue.main.async {\n            EKWindowProvider.shared.transform(to: view)\n        }\n    }\n    \n    /**\n     Dismisses the currently presented entry and removes the presented window instance after the exit animation is concluded.\n     - A thread-safe method - Can be invoked from any thread.\n     - A class method - Should be called on the class.\n     - parameter descriptor: A descriptor for the entries that are to be dismissed. The default value is *.displayed*.\n     - parameter completion: A completion handler that is to be called right after the entry is dismissed (After the animation is concluded).\n     */\n    public class func dismiss(_ descriptor: EntryDismissalDescriptor = .displayed, with completion: DismissCompletionHandler? = nil) {\n        DispatchQueue.main.async {\n            EKWindowProvider.shared.dismiss(descriptor, with: completion)\n        }\n    }\n    \n    /**\n     Layout the view hierarchy that is rooted in the window.\n     - In case you use complex animations, you can call it to refresh the AutoLayout mechanism on the entire view hierarchy.\n     - A thread-safe method - Can be invoked from any thread.\n     - A class method - Should be called on the class.\n     */\n    public class func layoutIfNeeded() {\n        if Thread.isMainThread {\n            EKWindowProvider.shared.layoutIfNeeded()\n        } else {\n            DispatchQueue.main.async {\n                EKWindowProvider.shared.layoutIfNeeded()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/Utils/GradientView.swift",
    "content": "//\n//  GradientView.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nclass GradientView: UIView {\n    \n    struct Style {\n        let gradient: EKAttributes.BackgroundStyle.Gradient\n        let displayMode: EKAttributes.DisplayMode\n        \n        init?(gradient: EKAttributes.BackgroundStyle.Gradient?,\n              displayMode: EKAttributes.DisplayMode) {\n            guard let gradient = gradient else {\n                return nil\n            }\n            self.gradient = gradient\n            self.displayMode = displayMode\n        }\n    }\n    \n    private let gradientLayer = CAGradientLayer()\n    \n    var style: Style? {\n        didSet {\n            setupColor()\n        }\n    }\n    \n    init() {\n        super.init(frame: .zero)\n        layer.addSublayer(gradientLayer)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        gradientLayer.frame = bounds\n    }\n    \n    private func setupColor() {\n        guard let style = style else {\n            return\n        }\n        gradientLayer.colors = style.gradient.colors.map {\n            $0.color(for: traitCollection, mode: style.displayMode).cgColor\n        }\n        gradientLayer.startPoint = style.gradient.startPoint\n        gradientLayer.endPoint = style.gradient.endPoint\n    }\n    \n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        setupColor()\n    }\n}\n"
  },
  {
    "path": "Source/Utils/HapticFeedbackGenerator.swift",
    "content": "//\n//  HapticFeedbackGenerator.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 4/20/18.\n//  Copyright (c) 2018 huri000@gmail.com. All rights reserved.\n//\n\nimport UIKit\n\nstruct HapticFeedbackGenerator {\n    @available(iOS 10.0, *)\n    static func notification(type: EKAttributes.NotificationHapticFeedback) {\n        guard let value = type.value else {\n            return\n        }\n        let generator = UINotificationFeedbackGenerator()\n        generator.notificationOccurred(value)\n    }\n}\n"
  },
  {
    "path": "Source/Utils/UIView+Responder.swift",
    "content": "//\n//  UIView+Responder.swift\n//  SwiftEntryKit\n//\n//  Created by Daniel Huri on 5/17/18.\n//\n\nimport UIKit\n\nextension UIView {\n    var containsFirstResponder: Bool {\n        var contains = false\n        for subview in subviews.reversed() where !contains {\n            if subview.isFirstResponder {\n                contains = true\n            } else {\n                contains = subview.containsFirstResponder\n            }\n        }\n        return contains\n    }\n}\n"
  },
  {
    "path": "SwiftEntryKit.podspec",
    "content": "#\n# Be sure to run `pod lib lint SwiftEntryKit.podspec' to ensure this is a\n# valid spec before submitting.\n#\n# Any lines starting with a # are optional, but their use is encouraged\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html\n#\n\nPod::Spec.new do |s|\n  s.name = 'SwiftEntryKit'\n  s.version = '2.0.0'\n  s.summary = 'A simple banner and pop-up displayer for iOS. Written in Swift.'\n  s.platform = :ios\n  s.ios.deployment_target = '9.0'\n  s.swift_version = '5.0'\n  s.requires_arc = true\n\ns.description      = <<-DESC\nSwiftEntryKit is a banner presenter library for iOS. It can be used to easily display pop-ups and notification-like views within your iOS apps. SwiftEntryKit is highly customizable but also offers a bunch of beautiful presets that can be themed with your app fonts and colors.\nDESC\n  s.homepage         = 'https://github.com/huri000/SwiftEntryKit'\n  s.license          = { :type => 'MIT', :file => 'LICENSE' }\n  s.author           = { 'Daniel Huri' => 'huri000@gmail.com' }\n  s.source           = { :git => 'https://github.com/huri000/SwiftEntryKit.git', :tag => s.version.to_s }\n  s.source_files = 'Source/**/*'\n  s.frameworks = 'UIKit'\nend\n"
  }
]