1
0
mirror of https://github.com/Burrit0z/kai synced 2025-07-01 22:26:47 +00:00
This commit is contained in:
ren7995
2021-05-16 16:38:00 -04:00
parent df58fc48a7
commit ded80ae5a6
7 changed files with 271 additions and 190 deletions

View File

@ -3,278 +3,358 @@
KAIRootListController *controller;
NSBundle *tweakBundle;
//thank god for renai
// thank god for renai
static inline NSString *getPackageVersion() {
NSString *packageVersion = [NSString stringWithFormat:@"${%@}", @"Version"];
int status;
NSString *packageVersion = [NSString stringWithFormat:@"${%@}", @"Version"];
int status;
NSMutableArray<NSString *> *argsv0 = [NSMutableArray array];
for (NSString *string in @[ @"/usr/bin/dpkg-query", @"-Wf", packageVersion, @"com.burritoz.kai" ]) {
[argsv0
addObject:[NSString stringWithFormat:@"'%@'",
[string stringByReplacingOccurrencesOfString:@"'"
withString:@"\\'"
options:NSRegularExpressionSearch
range:NSMakeRange(
0, string.length)]]];
}
NSMutableArray<NSString *> *argsv0 = [NSMutableArray array];
for (NSString *string in @[
@"/usr/bin/dpkg-query", @"-Wf", packageVersion, @"com.burritoz.kai"
]) {
[argsv0
addObject:
[NSString
stringWithFormat:
@"'%@'",
[string
stringByReplacingOccurrencesOfString:@"'"
withString:@"\\'"
options:
NSRegularExpressionSearch
range:
NSMakeRange(
0,
string
.length)]]];
}
NSString *argsv1 = [argsv0 componentsJoinedByString:@" "];
FILE *file = popen(argsv1.UTF8String, "r");
if (!file) {
return nil;
}
NSString *argsv1 = [argsv0 componentsJoinedByString:@" "];
FILE *file = popen(argsv1.UTF8String, "r");
if (!file) {
return nil;
}
char data[1024];
NSMutableString *output = [NSMutableString string];
char data[1024];
NSMutableString *output = [NSMutableString string];
while (fgets(data, 1024, file) != NULL) {
[output appendString:[NSString stringWithUTF8String:data]];
}
while (fgets(data, 1024, file) != NULL) {
[output appendString:[NSString stringWithUTF8String:data]];
}
int result = pclose(file);
status = result;
int result = pclose(file);
status = result;
if (status == 0) {
return output ?: @"🏴‍☠️ Pirated";
}
if (status == 0) {
return output ?: @"🏴‍☠️ Pirated";
}
return @"🏴‍☠️ Pirated";
return @"🏴‍☠️ Pirated";
}
////////
static void respringNeeded() {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Respring"
message:@"Changing this requires a respring for it to take effect. Would you like to respring now?"
preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"Respring"
message:@"Changing this requires a respring for it to "
@"take effect. Would you like to respring now?"
preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"No"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action){
}];
UIAlertAction *defaultAction =
[UIAlertAction actionWithTitle:@"No"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action){
}];
UIAlertAction *yes = [UIAlertAction actionWithTitle:@"Respring"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
NSTask *t = [[NSTask alloc] init];
[t setLaunchPath:@"usr/bin/killall"];
[t setArguments:[NSArray arrayWithObjects:@"backboardd", nil]];
[t launch];
}];
UIAlertAction *yes = [UIAlertAction
actionWithTitle:@"Respring"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
NSTask *t = [[NSTask alloc] init];
[t setLaunchPath:@"usr/bin/killall"];
[t setArguments:[NSArray arrayWithObjects:@"backboardd", nil]];
[t launch];
}];
[alert addAction:defaultAction];
[alert addAction:yes];
[controller presentViewController:alert animated:YES completion:nil];
[alert addAction:defaultAction];
[alert addAction:yes];
[controller presentViewController:alert animated:YES completion:nil];
}
static void applyPrefs() {
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.burritoz.kaiprefs/reload"), nil, nil, true);
CFNotificationCenterPostNotification(
CFNotificationCenterGetDarwinNotifyCenter(),
CFSTR("com.burritoz.kaiprefs/reload"), nil, nil, true);
}
@implementation KAIRootListController
- (NSArray *)specifiers {
if (!_specifiers) {
_specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self];
}
if (!_specifiers) {
_specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self];
}
return _specifiers;
return _specifiers;
}
- (void)viewWillAppear:(BOOL)arg1 {
[[UISegmentedControl appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]];
[[UISwitch appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setOnTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]];
[[UISlider appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]];
[[UISegmentedControl
appearanceWhenContainedInInstancesOfClasses:@[ self.class ]]
setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]];
[[UISwitch appearanceWhenContainedInInstancesOfClasses:@[ self.class ]]
setOnTintColor:[UIColor colorWithRed:0.00
green:0.82
blue:1.00
alpha:1.00]];
[[UISlider appearanceWhenContainedInInstancesOfClasses:@[ self.class ]]
setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]];
}
- (void)viewWillDisappear:(BOOL)arg1 {
[super viewWillDisappear:arg1];
[super viewWillDisappear:arg1];
}
- (void)viewDidLoad {
[super viewDidLoad];
[super viewDidLoad];
self.navigationItem.titleView = [UIView new];
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
self.titleLabel.font = [UIFont systemFontOfSize:17.5];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.titleLabel.text = @"kai";
self.titleLabel.alpha = 0.0;
self.titleLabel.textAlignment = NSTextAlignmentCenter;
[self.navigationItem.titleView addSubview:self.titleLabel];
self.navigationItem.titleView = [UIView new];
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
self.titleLabel.font = [UIFont systemFontOfSize:17.5];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.titleLabel.text = @"kai";
self.titleLabel.alpha = 0.0;
self.titleLabel.textAlignment = NSTextAlignmentCenter;
[self.navigationItem.titleView addSubview:self.titleLabel];
self.iconView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
self.iconView.contentMode = UIViewContentModeScaleAspectFit;
self.iconView.image = [UIImage imageWithContentsOfFile:@"/Library/PreferenceBundles/kaiPrefs.bundle/icon.png"];
self.iconView.translatesAutoresizingMaskIntoConstraints = NO;
self.iconView.alpha = 1.0;
[self.navigationItem.titleView addSubview:self.iconView];
self.iconView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
self.iconView.contentMode = UIViewContentModeScaleAspectFit;
self.iconView.image =
[UIImage imageWithContentsOfFile:
@"/Library/PreferenceBundles/kaiPrefs.bundle/icon.png"];
self.iconView.translatesAutoresizingMaskIntoConstraints = NO;
self.iconView.alpha = 1.0;
[self.navigationItem.titleView addSubview:self.iconView];
[NSLayoutConstraint activateConstraints:@[
[self.titleLabel.topAnchor constraintEqualToAnchor:self.navigationItem.titleView.topAnchor],
[self.titleLabel.leadingAnchor constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor],
[self.titleLabel.trailingAnchor constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor],
[self.titleLabel.bottomAnchor constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor],
[self.iconView.topAnchor constraintEqualToAnchor:self.navigationItem.titleView.topAnchor],
[self.iconView.leadingAnchor constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor],
[self.iconView.trailingAnchor constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor],
[self.iconView.bottomAnchor constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor],
]];
[NSLayoutConstraint activateConstraints:@[
[self.titleLabel.topAnchor
constraintEqualToAnchor:self.navigationItem.titleView.topAnchor],
[self.titleLabel.leadingAnchor
constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor],
[self.titleLabel.trailingAnchor
constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor],
[self.titleLabel.bottomAnchor
constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor],
[self.iconView.topAnchor
constraintEqualToAnchor:self.navigationItem.titleView.topAnchor],
[self.iconView.leadingAnchor
constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor],
[self.iconView.trailingAnchor
constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor],
[self.iconView.bottomAnchor
constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor],
]];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Pirated :("
message:@"Please install kai from Chariz repository."
preferredStyle:UIAlertControllerStyleAlert];
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"Pirated :("
message:@"Please install kai from Chariz repository."
preferredStyle:UIAlertControllerStyleAlert];
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.list"] && [[NSFileManager defaultManager] fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.md5sums"]) {
// nothing
} else {
[self presentViewController:alert animated:YES completion:nil];
}
if ([[NSFileManager defaultManager]
fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.list"] &&
[[NSFileManager defaultManager]
fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.md5sums"]) {
// nothing
} else {
[self presentViewController:alert animated:YES completion:nil];
}
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)respringNeeded, CFSTR("com.burritoz.kaiprefs.respringneeded"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(
CFNotificationCenterGetDarwinNotifyCenter(), NULL,
(CFNotificationCallback)respringNeeded,
CFSTR("com.burritoz.kaiprefs.respringneeded"), NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)applyPrefs, CFSTR("com.burritoz.kaiprefs.apply"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(
CFNotificationCenterGetDarwinNotifyCenter(), NULL,
(CFNotificationCallback)applyPrefs, CFSTR("com.burritoz.kaiprefs.apply"),
NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
controller = self;
controller = self;
}
- (void)resetPrefs:(id)sender {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Reset Preferences"
message:@"Are you sure you want to reset all of your preferences? This action CANNOT be undone! Your device will respring."
preferredStyle:UIAlertControllerStyleAlert];
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"Reset Preferences"
message:@"Are you sure you want to reset all of your "
@"preferences? This action CANNOT be undone! "
@"Your device will respring."
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"No"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action){
}];
UIAlertAction *yes = [UIAlertAction actionWithTitle:@"Yes"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
NSUserDefaults *prefs = [[NSUserDefaults standardUserDefaults] init];
[prefs removePersistentDomainForName:@"com.burritoz.kaiprefs"];
UIAlertAction *defaultAction =
[UIAlertAction actionWithTitle:@"No"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action){
}];
UIAlertAction *yes = [UIAlertAction
actionWithTitle:@"Yes"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
NSUserDefaults *prefs =
[[NSUserDefaults standardUserDefaults] init];
[prefs removePersistentDomainForName:@"com.burritoz.kaiprefs"];
NSTask *f = [[NSTask alloc] init];
[f setLaunchPath:@"/usr/bin/killall"];
[f setArguments:[NSArray arrayWithObjects:@"backboardd", nil]];
[f launch];
}];
NSTask *f = [[NSTask alloc] init];
[f setLaunchPath:@"/usr/bin/killall"];
[f setArguments:[NSArray arrayWithObjects:@"backboardd", nil]];
[f launch];
}];
[alert addAction:defaultAction];
[alert addAction:yes];
[self presentViewController:alert animated:YES completion:nil];
[alert addAction:defaultAction];
[alert addAction:yes];
[self presentViewController:alert animated:YES completion:nil];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY > 120) {
[UIView animateWithDuration:0.2
animations:^{
self.iconView.alpha = 1.0;
self.titleLabel.alpha = 0.0;
}];
} else {
[UIView animateWithDuration:0.2
animations:^{
self.iconView.alpha = 0.0;
self.titleLabel.alpha = 1.0;
}];
}
if (offsetY > 120) {
[UIView animateWithDuration:0.2
animations:^{
self.iconView.alpha = 1.0;
self.titleLabel.alpha = 0.0;
}];
} else {
[UIView animateWithDuration:0.2
animations:^{
self.iconView.alpha = 0.0;
self.titleLabel.alpha = 1.0;
}];
}
}
- (void)followMeBurritoz {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://twitter.com/burrit0ztweaks"]];
- (void)followMeRen {
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:@"https://twitter.com/ren7995"]];
}
- (void)followMeOnTwitterThomz {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://twitter.com/thomzi07"]];
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:@"https://twitter.com/thomzi07"]];
}
@end
@implementation KaiHeaderCell // Header Cell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(id)reuseIdentifier specifier:(id)specifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier];
- (instancetype)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(id)reuseIdentifier
specifier:(id)specifier {
self = [super initWithStyle:style
reuseIdentifier:reuseIdentifier
specifier:specifier];
if (self) {
UILabel *tweakLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 30, self.contentView.bounds.size.width + 30, 50)];
[tweakLabel setTextAlignment:NSTextAlignmentLeft];
[tweakLabel setFont:[UIFont systemFontOfSize:50 weight:UIFontWeightRegular]];
tweakLabel.text = @"kai";
if (self) {
UILabel *tweakLabel = [[UILabel alloc]
initWithFrame:CGRectMake(20, 30,
self.contentView.bounds.size.width + 30, 50)];
[tweakLabel setTextAlignment:NSTextAlignmentLeft];
[tweakLabel setFont:[UIFont systemFontOfSize:50
weight:UIFontWeightRegular]];
tweakLabel.text = @"kai";
UILabel *devLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 70, self.contentView.bounds.size.width + 30, 50)];
[devLabel setTextAlignment:NSTextAlignmentLeft];
[devLabel setFont:[UIFont systemFontOfSize:20 weight:UIFontWeightMedium]];
devLabel.alpha = 0.8;
devLabel.text = getPackageVersion();
UILabel *devLabel = [[UILabel alloc]
initWithFrame:CGRectMake(20, 70,
self.contentView.bounds.size.width + 30, 50)];
[devLabel setTextAlignment:NSTextAlignmentLeft];
[devLabel setFont:[UIFont systemFontOfSize:20 weight:UIFontWeightMedium]];
devLabel.alpha = 0.8;
devLabel.text = getPackageVersion();
NSBundle *bundle = [[NSBundle alloc] initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"];
UIImage *logo = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"iconFullSize" ofType:@"png"]];
UIImageView *icon = [[UIImageView alloc] initWithImage:logo];
icon.frame = CGRectMake(self.contentView.bounds.size.width - 35, 35, 70, 70);
icon.translatesAutoresizingMaskIntoConstraints = NO;
NSBundle *bundle = [[NSBundle alloc]
initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"];
UIImage *logo =
[UIImage imageWithContentsOfFile:[bundle pathForResource:@"iconFullSize"
ofType:@"png"]];
UIImageView *icon = [[UIImageView alloc] initWithImage:logo];
icon.frame =
CGRectMake(self.contentView.bounds.size.width - 35, 35, 70, 70);
icon.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:tweakLabel];
[self addSubview:devLabel];
[self addSubview:icon];
[self addSubview:tweakLabel];
[self addSubview:devLabel];
[self addSubview:icon];
[icon.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:-20].active = YES;
[icon.centerYAnchor constraintEqualToAnchor:self.centerYAnchor].active = YES;
[icon.widthAnchor constraintEqualToConstant:70].active = YES;
[icon.heightAnchor constraintEqualToConstant:70].active = YES;
[icon.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:-20]
.active = YES;
[icon.centerYAnchor constraintEqualToAnchor:self.centerYAnchor].active =
YES;
[icon.widthAnchor constraintEqualToConstant:70].active = YES;
[icon.heightAnchor constraintEqualToConstant:70].active = YES;
icon.layer.masksToBounds = YES;
icon.layer.cornerRadius = 15;
}
icon.layer.masksToBounds = YES;
icon.layer.cornerRadius = 15;
}
return self;
return self;
}
- (instancetype)initWithSpecifier:(PSSpecifier *)specifier {
return [self initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"KaiHeaderCell" specifier:specifier];
return [self initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"KaiHeaderCell"
specifier:specifier];
}
- (void)setFrame:(CGRect)frame {
frame.origin.x = 0;
[super setFrame:frame];
frame.origin.x = 0;
[super setFrame:frame];
}
- (CGFloat)preferredHeightForWidth:(CGFloat)arg1 {
return 140.0f;
return 140.0f;
}
@end
@implementation Thomz_TwitterCell // lil copy of HBTwitterCell from Cephei
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier specifier:(PSSpecifier *)specifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier];
- (instancetype)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString *)reuseIdentifier
specifier:(PSSpecifier *)specifier {
self = [super initWithStyle:style
reuseIdentifier:reuseIdentifier
specifier:specifier];
if (self) {
UILabel *User = [[UILabel alloc] initWithFrame:CGRectMake(70, 15, 200, 20)];
[User setText:specifier.properties[@"user"]];
[User setFont:[User.font fontWithSize:15]];
if (self) {
UILabel *User = [[UILabel alloc] initWithFrame:CGRectMake(70, 15, 200, 20)];
[User setText:specifier.properties[@"user"]];
[User setFont:[User.font fontWithSize:15]];
UILabel *Description = [[UILabel alloc] initWithFrame:CGRectMake(70, 35, 200, 20)];
[Description setText:specifier.properties[@"description"]];
[Description setFont:[Description.font fontWithSize:10]];
UILabel *Description =
[[UILabel alloc] initWithFrame:CGRectMake(70, 35, 200, 20)];
[Description setText:specifier.properties[@"description"]];
[Description setFont:[Description.font fontWithSize:10]];
NSBundle *bundle = [[NSBundle alloc] initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"];
NSBundle *bundle = [[NSBundle alloc]
initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"];
UIImage *profilePicture;
profilePicture = [UIImage imageWithContentsOfFile:[bundle pathForResource:specifier.properties[@"image"] ofType:@"jpg"]];
UIImageView *profilePictureView = [[UIImageView alloc] initWithImage:profilePicture];
[profilePictureView.layer setMasksToBounds:YES];
[profilePictureView.layer setCornerRadius:20];
[profilePictureView setFrame:CGRectMake(15, 15, 40, 40)];
UIImage *profilePicture;
profilePicture = [UIImage
imageWithContentsOfFile:[bundle
pathForResource:specifier
.properties[@"image"]
ofType:@"jpg"]];
UIImageView *profilePictureView =
[[UIImageView alloc] initWithImage:profilePicture];
[profilePictureView.layer setMasksToBounds:YES];
[profilePictureView.layer setCornerRadius:20];
[profilePictureView setFrame:CGRectMake(15, 15, 40, 40)];
[self addSubview:User];
[self addSubview:Description];
[self addSubview:profilePictureView];
}
[self addSubview:User];
[self addSubview:Description];
[self addSubview:profilePictureView];
}
return self;
return self;
}
@end

View File

@ -18,15 +18,15 @@
<key>cellClass</key>
<string>Thomz_TwitterCell</string>
<key>user</key>
<string>Burrit0z</string>
<string>ren7995</string>
<key>description</key>
<string>Developer</string>
<key>height</key>
<integer>70</integer>
<key>image</key>
<string>burritoz</string>
<string>ren7995</string>
<key>action</key>
<string>followMeBurritoz</string>
<string>followMeRen</string>
</dict>
<dict>
<key>cell</key>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB