Skip to content

Commit

Permalink
Merge pull request #16 from GrioSF/v1.1-design-updates
Browse files Browse the repository at this point in the history
V1.1 design updates
  • Loading branch information
hgarcia-grio authored Aug 8, 2019
2 parents 178f641 + 401e359 commit 82a29e3
Show file tree
Hide file tree
Showing 22 changed files with 1,527 additions and 324 deletions.
4 changes: 2 additions & 2 deletions BugSnap Demo App/BugSnap Demo App/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.2</string>
<string>1.0.4</string>
<key>CFBundleVersion</key>
<string>3</string>
<string>7</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
Expand Down
10 changes: 4 additions & 6 deletions BugSnap.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ Pod::Spec.new do |spec|
#

spec.name = "BugSnap"
spec.version = "1.0.3"
spec.summary = "POD that allows to snapshot the screen after a shake gesture, annotate the image and upload it to JIRA"
spec.version = "1.0.4"
spec.summary = "POD that allows to snapshot or record the screen after a shake gesture, annotate the image and upload it to JIRA"

# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
Expand All @@ -27,9 +27,7 @@ Pod::Spec.new do |spec|
spec.description = <<-DESC
This framework is to ease the task of QA when testing mobile Apps managed with JIRA. Basically what it does is to
generate a notification through NotificationCenter and then use the UIApplication singleton to present a UI that allows
to annotate the captured image and then upload such image and some description to JIRA. The integration with JIRA uses Basic Authentication
and JIRA's Rest API v3 (https://developer.atlassian.com/cloud/jira/platform/rest/v3/), so basically you'll need to setup the app where the
framework is embedded with your email and API Token.
either to annotate the captured image or record a video from the app and then upload it with some description and device information to JIRA. The integration with JIRA uses Basic Authentication and JIRA's Rest API v3 (https://developer.atlassian.com/cloud/jira/platform/rest/v3/), so basically you'll need to setup the app where the framework is embedded with your email and API Token.
DESC

spec.homepage = "https://github.com/GrioSF/bugsnap-iOS"
Expand Down Expand Up @@ -74,7 +72,7 @@ Pod::Spec.new do |spec|
# Supports git, hg, bzr, svn and HTTP.
#

spec.source = { :git => "https://github.com/GrioSF/bugsnap-iOS.git", :tag => "v1.0.3" }
spec.source = { :git => "https://github.com/GrioSF/bugsnap-iOS.git", :tag => "v1.0.4" }


# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
Expand Down
42 changes: 42 additions & 0 deletions BugSnap/BugSnap.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,16 @@
7F0BCF9922B047BC006B4F26 /* BugSnapAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F0BCF9822B047BC006B4F26 /* BugSnapAction.swift */; };
7F0BCF9C22B04B28006B4F26 /* BugReportAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F0BCF9B22B04B28006B4F26 /* BugReportAction.swift */; };
7F0BCF9E22B04C1A006B4F26 /* UIView+Snap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F0BCF9D22B04C1A006B4F26 /* UIView+Snap.swift */; };
7F18DCD522F9E4E600319066 /* CheckboxButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F18DCD422F9E4E600319066 /* CheckboxButton.swift */; };
7F2716F422E62B980068C502 /* UIApplication+ScreenRecording.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F2716F322E62B980068C502 /* UIApplication+ScreenRecording.swift */; };
7F2716F622E766470068C502 /* VideoFileWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F2716F522E766470068C502 /* VideoFileWriter.swift */; };
7F2716F822E772C90068C502 /* UIViewController+JIRAIssueFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F2716F722E772C90068C502 /* UIViewController+JIRAIssueFlow.swift */; };
7F4C8E0222F89445001EAD96 /* CaptureOptionSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F4C8E0122F89445001EAD96 /* CaptureOptionSheetViewController.swift */; };
7F4C8E0422F8982D001EAD96 /* ScreenshotButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F4C8E0322F8982D001EAD96 /* ScreenshotButton.swift */; };
7F4C8E0622F898DD001EAD96 /* ScreenRecordingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F4C8E0522F898DD001EAD96 /* ScreenRecordingButton.swift */; };
7F4C8E0822F8B6D2001EAD96 /* TrashToolButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F4C8E0722F8B6D2001EAD96 /* TrashToolButton.swift */; };
7F4C8E0B22F9D249001EAD96 /* TextViewAccessoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F4C8E0A22F9D249001EAD96 /* TextViewAccessoryView.swift */; };
7F4C8E0D22F9DD02001EAD96 /* ChevronLeftButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F4C8E0C22F9DD02001EAD96 /* ChevronLeftButton.swift */; };
7F66ABC222C151F200806661 /* UserDefaults+Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F66ABC122C151F200806661 /* UserDefaults+Keys.swift */; };
7F66ABC422C1538700806661 /* JIRALoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F66ABC322C1538700806661 /* JIRALoginViewController.swift */; };
7F66ABC822C1D47000806661 /* JIRAIssueFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F66ABC722C1D47000806661 /* JIRAIssueFormViewController.swift */; };
Expand Down Expand Up @@ -62,6 +69,7 @@
7FEB197B22BC050300E9C8B5 /* UIColor+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB197A22BC050300E9C8B5 /* UIColor+Helpers.swift */; };
7FEB197D22BC264800E9C8B5 /* PaddedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB197C22BC264800E9C8B5 /* PaddedTextField.swift */; };
7FEB197F22BD91A400E9C8B5 /* AutocompleteTextFieldViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB197E22BD91A400E9C8B5 /* AutocompleteTextFieldViewController.swift */; };
7FEB52FD22FC5ECC000498BC /* OptionSelectorPopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB52FC22FC5ECC000498BC /* OptionSelectorPopupViewController.swift */; };
7FEBAC4F22B180B00022158D /* PathBasedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEBAC4E22B180B00022158D /* PathBasedButton.swift */; };
7FEBAC5322B19E7C0022158D /* MarkupEditorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEBAC5222B19E7C0022158D /* MarkupEditorViewController.swift */; };
7FEBAC5822B1ABE90022158D /* ColorSelectorButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEBAC5722B1ABE90022158D /* ColorSelectorButton.swift */; };
Expand Down Expand Up @@ -105,9 +113,16 @@
7F0BCF9822B047BC006B4F26 /* BugSnapAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BugSnapAction.swift; sourceTree = "<group>"; };
7F0BCF9B22B04B28006B4F26 /* BugReportAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BugReportAction.swift; sourceTree = "<group>"; };
7F0BCF9D22B04C1A006B4F26 /* UIView+Snap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Snap.swift"; sourceTree = "<group>"; };
7F18DCD422F9E4E600319066 /* CheckboxButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxButton.swift; sourceTree = "<group>"; };
7F2716F322E62B980068C502 /* UIApplication+ScreenRecording.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+ScreenRecording.swift"; sourceTree = "<group>"; };
7F2716F522E766470068C502 /* VideoFileWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoFileWriter.swift; sourceTree = "<group>"; };
7F2716F722E772C90068C502 /* UIViewController+JIRAIssueFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+JIRAIssueFlow.swift"; sourceTree = "<group>"; };
7F4C8E0122F89445001EAD96 /* CaptureOptionSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureOptionSheetViewController.swift; sourceTree = "<group>"; };
7F4C8E0322F8982D001EAD96 /* ScreenshotButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotButton.swift; sourceTree = "<group>"; };
7F4C8E0522F898DD001EAD96 /* ScreenRecordingButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenRecordingButton.swift; sourceTree = "<group>"; };
7F4C8E0722F8B6D2001EAD96 /* TrashToolButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrashToolButton.swift; sourceTree = "<group>"; };
7F4C8E0A22F9D249001EAD96 /* TextViewAccessoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewAccessoryView.swift; sourceTree = "<group>"; };
7F4C8E0C22F9DD02001EAD96 /* ChevronLeftButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChevronLeftButton.swift; sourceTree = "<group>"; };
7F66ABC122C151F200806661 /* UserDefaults+Keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Keys.swift"; sourceTree = "<group>"; };
7F66ABC322C1538700806661 /* JIRALoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JIRALoginViewController.swift; sourceTree = "<group>"; };
7F66ABC722C1D47000806661 /* JIRAIssueFormViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JIRAIssueFormViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -149,9 +164,11 @@
7FBCBE4C22EA0C0000347B36 /* UIDevice+Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Logging.swift"; sourceTree = "<group>"; };
7FD2312722E8B0F100292997 /* UIApplication+Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Logging.swift"; sourceTree = "<group>"; };
7FD2312922E8FA8D00292997 /* FileManager+Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileManager+Util.swift"; sourceTree = "<group>"; };
7FE43E1622F1050D000F8ABC /* BugSnap.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; name = BugSnap.podspec; path = ../../BugSnap.podspec; sourceTree = "<group>"; };
7FEB197A22BC050300E9C8B5 /* UIColor+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Helpers.swift"; sourceTree = "<group>"; };
7FEB197C22BC264800E9C8B5 /* PaddedTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaddedTextField.swift; sourceTree = "<group>"; };
7FEB197E22BD91A400E9C8B5 /* AutocompleteTextFieldViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocompleteTextFieldViewController.swift; sourceTree = "<group>"; };
7FEB52FC22FC5ECC000498BC /* OptionSelectorPopupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionSelectorPopupViewController.swift; sourceTree = "<group>"; };
7FEBAC4E22B180B00022158D /* PathBasedButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PathBasedButton.swift; sourceTree = "<group>"; };
7FEBAC5222B19E7C0022158D /* MarkupEditorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkupEditorViewController.swift; sourceTree = "<group>"; };
7FEBAC5722B1ABE90022158D /* ColorSelectorButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorSelectorButton.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -211,6 +228,7 @@
7F0BCF2C22AFFF53006B4F26 /* BugSnap */ = {
isa = PBXGroup;
children = (
7FE43E1622F1050D000F8ABC /* BugSnap.podspec */,
7F87683722B44A5E0018AC74 /* LICENSE */,
7F87683622B44A5E0018AC74 /* README.md */,
7FB62E2722B836460007A02E /* Networking */,
Expand Down Expand Up @@ -253,10 +271,20 @@
7FEBAC5222B19E7C0022158D /* MarkupEditorViewController.swift */,
7F66ABD322C2CACD00806661 /* LoadingViewController.swift */,
7F66ABF722C5336D00806661 /* ScrolledViewController.swift */,
7F4C8E0122F89445001EAD96 /* CaptureOptionSheetViewController.swift */,
7FEB52FC22FC5ECC000498BC /* OptionSelectorPopupViewController.swift */,
);
path = ViewControllers;
sourceTree = "<group>";
};
7F4C8E0922F9D218001EAD96 /* AccessoryViews */ = {
isa = PBXGroup;
children = (
7F4C8E0A22F9D249001EAD96 /* TextViewAccessoryView.swift */,
);
path = AccessoryViews;
sourceTree = "<group>";
};
7F66ABE922C5150200806661 /* Buttons */ = {
isa = PBXGroup;
children = (
Expand All @@ -265,6 +293,7 @@
7F66ABD522C2E1EF00806661 /* DrawToolButton.swift */,
7F66ABD722C2E2CB00806661 /* TextToolButton.swift */,
7F66ABD922C2E37E00806661 /* ShapesToolButton.swift */,
7F4C8E0722F8B6D2001EAD96 /* TrashToolButton.swift */,
7FEBAC4E22B180B00022158D /* PathBasedButton.swift */,
7FB62E2322B7F4C60007A02E /* UndoButton.swift */,
7FEBAC5722B1ABE90022158D /* ColorSelectorButton.swift */,
Expand All @@ -276,6 +305,10 @@
7F66ABE322C3C71600806661 /* ToolbarSelectableButton.swift */,
7F66ABF122C51BA700806661 /* AbstractFormButton.swift */,
7F66ABF322C51CDD00806661 /* FormsButtons.swift */,
7F4C8E0322F8982D001EAD96 /* ScreenshotButton.swift */,
7F4C8E0522F898DD001EAD96 /* ScreenRecordingButton.swift */,
7F4C8E0C22F9DD02001EAD96 /* ChevronLeftButton.swift */,
7F18DCD422F9E4E600319066 /* CheckboxButton.swift */,
);
path = Buttons;
sourceTree = "<group>";
Expand Down Expand Up @@ -364,6 +397,7 @@
7FEBAC4D22B17FF70022158D /* CustomViews */ = {
isa = PBXGroup;
children = (
7F4C8E0922F9D218001EAD96 /* AccessoryViews */,
7F66ABF022C51A5000806661 /* TextFields */,
7F66ABEA22C5165E00806661 /* Label */,
7F66ABE922C5150200806661 /* Buttons */,
Expand Down Expand Up @@ -522,9 +556,11 @@
7F66ABDE22C2E85300806661 /* TrashButton.swift in Sources */,
7FEBAC4F22B180B00022158D /* PathBasedButton.swift in Sources */,
7F66ABD222C2C2B700806661 /* JIRA+Attachment.swift in Sources */,
7F4C8E0222F89445001EAD96 /* CaptureOptionSheetViewController.swift in Sources */,
7F66ABF622C51F5C00806661 /* FormTextField.swift in Sources */,
7F66ABDC22C2E53600806661 /* DismissButton.swift in Sources */,
7F0B0CB322EF7A6700029C68 /* HTTPPostBodyMultipartInputStream.swift in Sources */,
7F4C8E0622F898DD001EAD96 /* ScreenRecordingButton.swift in Sources */,
7FEBAC7822B41FD60022158D /* PathBasedTableViewCell.swift in Sources */,
7F66ABE822C4610C00806661 /* ShapeEditorScrollView.swift in Sources */,
7FEBAC6322B2A3F80022158D /* Number+Utilities.swift in Sources */,
Expand All @@ -547,10 +583,12 @@
7F66ABC422C1538700806661 /* JIRALoginViewController.swift in Sources */,
7FEBAC6E22B3077D0022158D /* ColorSelectorViewController.swift in Sources */,
7FEBAC6C22B2FF080022158D /* ToolsButtons.swift in Sources */,
7F18DCD522F9E4E600319066 /* CheckboxButton.swift in Sources */,
7F2716F822E772C90068C502 /* UIViewController+JIRAIssueFlow.swift in Sources */,
7FEBAC7422B41A5E0022158D /* LineWidthSelectorButton.swift in Sources */,
7F66ABEE22C517DB00806661 /* FormLabels.swift in Sources */,
7FEBAC5322B19E7C0022158D /* MarkupEditorViewController.swift in Sources */,
7F4C8E0422F8982D001EAD96 /* ScreenshotButton.swift in Sources */,
7F66ABC222C151F200806661 /* UserDefaults+Keys.swift in Sources */,
7F66ABD622C2E1EF00806661 /* DrawToolButton.swift in Sources */,
7FB62E3022B981AB0007A02E /* JIRAIssueCreatorViewController.swift in Sources */,
Expand All @@ -561,10 +599,13 @@
7F66ABF822C5336D00806661 /* ScrolledViewController.swift in Sources */,
7F2716F622E766470068C502 /* VideoFileWriter.swift in Sources */,
7FB62E1A22B7CE7F0007A02E /* LineShapes.swift in Sources */,
7F4C8E0B22F9D249001EAD96 /* TextViewAccessoryView.swift in Sources */,
7F66ABD822C2E2CB00806661 /* TextToolButton.swift in Sources */,
7F66ABCE22C28E3100806661 /* JIRA+User.swift in Sources */,
7F4C8E0D22F9DD02001EAD96 /* ChevronLeftButton.swift in Sources */,
7F66ABC822C1D47000806661 /* JIRAIssueFormViewController.swift in Sources */,
7F66ABE222C3C04700806661 /* ToolOptionsViewController.swift in Sources */,
7FEB52FD22FC5ECC000498BC /* OptionSelectorPopupViewController.swift in Sources */,
7FBCBE4D22EA0C0000347B36 /* UIDevice+Logging.swift in Sources */,
7F0BCF9722B045A2006B4F26 /* UIViewController+Snap.swift in Sources */,
7F87683C22B44BE50018AC74 /* StrokeColorSelectorButton.swift in Sources */,
Expand All @@ -586,6 +627,7 @@
7FEBAC7222B408BC0022158D /* PathBasedCollectionViewCell.swift in Sources */,
7F66ABF422C51CDD00806661 /* FormsButtons.swift in Sources */,
7FB62E1D22B7D4900007A02E /* ShapeToolViewController.swift in Sources */,
7F4C8E0822F8B6D2001EAD96 /* TrashToolButton.swift in Sources */,
7F66ABFA22C55C5E00806661 /* TextOptionsViewController.swift in Sources */,
7FB62E2622B8363C0007A02E /* JIRA-API.swift in Sources */,
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
//
// TextViewAccessoryView.swift
// BugSnap
//
// Created by Héctor García Peña on 8/6/19.
// Copyright © 2019 Héctor García Peña. All rights reserved.
//

import UIKit

/**
Accessory view for a UITextView to allow resigning the keyboard when capturing a multiline text
*/
public class TextViewAccessoryView: UIView {

// MARK: - Private Properties

/// The main button contained in this accessory view
private var doneButton : SubmitFormButton!

/// The default value for the label
public static let defaultButtonLabel = "Done"

// MARK: - Initialization

public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}

public override init(frame: CGRect) {
super.init(frame: frame)
setup()
}

/**
Initializes this accessory view.
- Parameter buttonLabel: The label for the button included in the accessory view. The default value is "Done"
*/
public init( buttonLabel : String = TextViewAccessoryView.defaultButtonLabel ) {
super.init(frame: CGRect.zero)
setup(buttonLabel: buttonLabel)
}

// MARK: - Convenience methods

/**
Adds a handler for the only button contained within this accessory view. The main purpose of this button should be dismissing the keyboard (resigning the first responder).
- Parameter target: The instance of the object to which the action message will be sent
- Parameter action: The message sent to the target when the button is tapped (the primary action)
*/
public func addTarget( _ target : Any? , action : Selector ) {
doneButton.addTarget(target, action: action, for: .primaryActionTriggered)
}

// MARK: - Setup

private func setup( buttonLabel : String = TextViewAccessoryView.defaultButtonLabel ) {
let toolbar = UIVisualEffectView(effect: UIBlurEffect(style: .light))
doneButton = SubmitFormButton(title: buttonLabel)
doneButton.cornerRadius = 5.0
toolbar.contentView.addSubview(doneButton)
doneButton.trailingAnchor.constraint(equalTo: toolbar.contentView.safeAreaLayoutGuide.trailingAnchor, constant: -20.0).isActive = true
doneButton.centerYAnchor.constraint(equalTo: toolbar.contentView.centerYAnchor).isActive = true
doneButton.widthAnchor.constraint(equalToConstant: 50.0).isActive = true
doneButton.heightAnchor.constraint(equalToConstant: 36.0).isActive = true

// Setup the view
frame = CGRect(x: 0, y: 0, width: 200.0, height: 42.0)
backgroundColor = UIColor.clear
addSubview(toolbar)

toolbar.translatesAutoresizingMaskIntoConstraints = false
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[toolbar]|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: ["toolbar":toolbar]))
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[toolbar]|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: ["toolbar":toolbar]))
}

}
Loading

0 comments on commit 82a29e3

Please sign in to comment.