diff --git a/Limelight/Input/KeyboardSupport.m b/Limelight/Input/KeyboardSupport.m index fa6601b0..8cbf7a33 100644 --- a/Limelight/Input/KeyboardSupport.m +++ b/Limelight/Input/KeyboardSupport.m @@ -201,7 +201,7 @@ keyCode = 0x6B; break; case UIKeyboardHIDUsageKeypadEnter: - keyCode = 0x0D; // FIXME: Is this correct? + keyCode = 0x0D; break; case UIKeyboardHIDUsageKeypadPeriod: keyCode = 0x6E; @@ -248,6 +248,9 @@ case UIKeyboardHIDUsageKeyboardRightAlt: keyCode = 0xA5; break; + case 669: // This value corresponds to the "Globe" or "Language" key on most Apple branded iPad keyboards. + keyCode = 0x1B; // This value corresponds to "Escape", which is missing from most Apple branded iPad keyboards. + break; default: NSLog(@"Unhandled HID usage: %lu", (unsigned long)key.keyCode); assert(0); diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index 4ef5e8bd..008920e3 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -323,6 +323,12 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; - (void)sendStylusEvent:(UITouch*)event { uint8_t type; + // Don't touch stylus events if the host doesn't support them. We want to pass + // them as normal touches for legacy hosts that don't understand pen events. + if (!(LiGetHostFeatureFlags() & LI_FF_PEN_TOUCH_EVENTS)) { + return NO; + } + switch (event.phase) { case UITouchPhaseBegan: type = LI_TOUCH_EVENT_DOWN; @@ -337,17 +343,17 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; type = LI_TOUCH_EVENT_CANCEL; break; default: - return; + return YES; } CGPoint location = [self adjustCoordinatesForVideoArea:[event locationInView:self]]; CGSize videoSize = [self getVideoAreaSize]; - LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height, - (event.force / event.maximumPossibleForce) / sin(event.altitudeAngle), - 0.0f, 0.0f, - [self getRotationFromAzimuthAngle:[event azimuthAngleInView:self]], - [self getTiltFromAltitudeAngle:event.altitudeAngle]); + return LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height, + (event.force / event.maximumPossibleForce) / sin(event.altitudeAngle), + 0.0f, 0.0f, + [self getRotationFromAzimuthAngle:[event azimuthAngleInView:self]], + [self getTiltFromAltitudeAngle:event.altitudeAngle]) != LI_ERR_UNSUPPORTED; } - (void)sendStylusHoverEvent:(UIHoverGestureRecognizer*)gesture API_AVAILABLE(ios(13.0)) { @@ -425,8 +431,9 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; // } for (UITouch* touch in touches) { if (touch.type == UITouchTypePencil) { - [self sendStylusEvent:touch]; - return; + if ([self sendStylusEvent:touch]) { + return; + } } TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; if (settings.absoluteTouchMode) { @@ -607,8 +614,9 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; if (@available(iOS 13.4, *)) { for (UITouch* touch in touches) { if (touch.type == UITouchTypePencil) { - [self sendStylusEvent:touch]; - return; + if ([self sendStylusEvent:touch]) { + return; + } } TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; if (settings.absoluteTouchMode) { @@ -699,8 +707,9 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; if (@available(iOS 13.4, *)) { for (UITouch* touch in touches) { if (touch.type == UITouchTypePencil) { - [self sendStylusEvent:touch]; - return; + if ([self sendStylusEvent:touch]) { + return; + } } TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; if (settings.absoluteTouchMode) { @@ -811,20 +820,21 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; } CGPoint currentScrollTranslation = [gesture translationInView:self]; + const short translationMultiplier = 120 * 20; // WHEEL_DELTA * 20 { - short translationDeltaY = ((currentScrollTranslation.y - lastScrollTranslation.y) / self.bounds.size.height) * 120; // WHEEL_DELTA + short translationDeltaY = ((currentScrollTranslation.y - lastScrollTranslation.y) / self.bounds.size.height) * translationMultiplier; if (translationDeltaY != 0) { - LiSendHighResScrollEvent(translationDeltaY * 20); + LiSendHighResScrollEvent(translationDeltaY); lastScrollTranslation = currentScrollTranslation; } } { - short translationDeltaX = ((currentScrollTranslation.x - lastScrollTranslation.x) / self.bounds.size.width) * 120; // WHEEL_DELTA + short translationDeltaX = ((currentScrollTranslation.x - lastScrollTranslation.x) / self.bounds.size.width) * translationMultiplier; if (translationDeltaX != 0) { // Direction is reversed from vertical scrolling - LiSendHighResHScrollEvent(-translationDeltaX * 20); + LiSendHighResHScrollEvent(-translationDeltaX); lastScrollTranslation = currentScrollTranslation; } } diff --git a/Limelight/Input/StreamView.m.orig b/Limelight/Input/StreamView.m.orig new file mode 100644 index 00000000..2ba52acc --- /dev/null +++ b/Limelight/Input/StreamView.m.orig @@ -0,0 +1,1078 @@ +// +// StreamView.m +// Moonlight +// +// Created by Cameron Gutman on 10/19/14. +// Copyright (c) 2014 Moonlight Stream. All rights reserved. +// + +#import "StreamView.h" +#include +#import "DataManager.h" +#import "ControllerSupport.h" +#import "KeyboardSupport.h" +#import "RelativeTouchHandler.h" +#import "AbsoluteTouchHandler.h" +#import "KeyboardInputField.h" +#import "zlib.h" //to implement crc32 checksum + +static const double X1_MOUSE_SPEED_DIVISOR = 2.5; + +@implementation StreamView { + OnScreenControls* onScreenControls; + + KeyboardInputField* keyInputField; + BOOL isInputingText; + NSMutableSet* keysDown; + + float streamAspectRatio; + + // iOS 13.4 mouse support + NSInteger lastMouseButtonMask; + float lastMouseX; + float lastMouseY; + CGPoint lastScrollTranslation; + + // Citrix X1 mouse support + X1Mouse* x1mouse; + double accumulatedMouseDeltaX; + double accumulatedMouseDeltaY; + + UIResponder* touchHandler; + + id interactionDelegate; + NSTimer* interactionTimer; + BOOL hasUserInteracted; + + NSDictionary *dictCodes; +} + +- (void) setupStreamView:(ControllerSupport*)controllerSupport + interactionDelegate:(id)interactionDelegate + config:(StreamConfiguration*)streamConfig { + self->interactionDelegate = interactionDelegate; + self->streamAspectRatio = (float)streamConfig.width / (float)streamConfig.height; + + TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; + + keysDown = [[NSMutableSet alloc] init]; + keyInputField = [[KeyboardInputField alloc] initWithFrame:CGRectZero]; + [keyInputField setKeyboardType:UIKeyboardTypeDefault]; + [keyInputField setAutocorrectionType:UITextAutocorrectionTypeNo]; + [keyInputField setAutocapitalizationType:UITextAutocapitalizationTypeNone]; + [keyInputField setSpellCheckingType:UITextSpellCheckingTypeNo]; + [self addSubview:keyInputField]; + +#if TARGET_OS_TV + // tvOS requires RelativeTouchHandler to manage Apple Remote input + self->touchHandler = [[RelativeTouchHandler alloc] initWithView:self]; +#else + // iOS uses RelativeTouchHandler or AbsoluteTouchHandler depending on user preference + if (settings.absoluteTouchMode) { + self->touchHandler = [[AbsoluteTouchHandler alloc] initWithView:self]; + } + else { + self->touchHandler = [[RelativeTouchHandler alloc] initWithView:self]; + } + + onScreenControls = [[OnScreenControls alloc] initWithView:self controllerSup:controllerSupport streamConfig:streamConfig]; + OnScreenControlsLevel level = (OnScreenControlsLevel)[settings.onscreenControls integerValue]; + if (settings.absoluteTouchMode) { + Log(LOG_I, @"On-screen controls disabled in absolute touch mode"); + [onScreenControls setLevel:OnScreenControlsLevelOff]; + } + else if (level == OnScreenControlsLevelAuto) { + [controllerSupport initAutoOnScreenControlMode:onScreenControls]; + } + else { + Log(LOG_I, @"Setting manual on-screen controls level: %d", (int)level); + [onScreenControls setLevel:level]; + } + // It would be nice to just use GCMouse on iOS 14+ and the older API on iOS 13 + // but unfortunately that isn't possible today. GCMouse doesn't recognize many + // mice correctly, but UIKit does. We will register for both and ignore UIKit + // events if a GCMouse is connected. + if (@available(iOS 13.4, *)) { +// [self addInteraction:[[UIPointerInteraction alloc] initWithDelegate:self]]; +// +// UIPanGestureRecognizer *discreteMouseWheelRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(mouseWheelMovedDiscrete:)]; +// discreteMouseWheelRecognizer.maximumNumberOfTouches = 0; +// discreteMouseWheelRecognizer.allowedScrollTypesMask = UIScrollTypeMaskDiscrete; +// discreteMouseWheelRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirectPointer)]; +// [self addGestureRecognizer:discreteMouseWheelRecognizer]; +// +// UIPanGestureRecognizer *continuousMouseWheelRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(mouseWheelMovedContinuous:)]; +// continuousMouseWheelRecognizer.maximumNumberOfTouches = 0; +// continuousMouseWheelRecognizer.allowedScrollTypesMask = UIScrollTypeMaskContinuous; +// continuousMouseWheelRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirectPointer)]; +// [self addGestureRecognizer:continuousMouseWheelRecognizer]; + } + +#if defined(__IPHONE_16_1) || defined(__TVOS_16_1) + if (@available(iOS 16.1, *)) { + UIHoverGestureRecognizer *stylusHoverRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(sendStylusHoverEvent:)]; + stylusHoverRecognizer.allowedTouchTypes = @[@(UITouchTypePencil)]; + [self addGestureRecognizer:stylusHoverRecognizer]; + } +#endif +#endif + + x1mouse = [[X1Mouse alloc] init]; + x1mouse.delegate = self; + + if (settings.btMouseSupport) { + [x1mouse start]; + } + + // This is critical to ensure keyboard events are delivered to this + // StreamView and not our parent UIView, especially on tvOS. + [self becomeFirstResponder]; +} + +- (void)startInteractionTimer { + // Restart user interaction tracking + hasUserInteracted = NO; + + BOOL timerAlreadyRunning = interactionTimer != nil; + + // Start/restart the timer + [interactionTimer invalidate]; + interactionTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 + target:self + selector:@selector(interactionTimerExpired:) + userInfo:nil + repeats:NO]; + + // Notify the delegate if this was a new user interaction + if (!timerAlreadyRunning) { + [interactionDelegate userInteractionBegan]; + } +} + +- (void)interactionTimerExpired:(NSTimer *)timer { + if (!hasUserInteracted) { + // User has finished touching the screen + interactionTimer = nil; + [interactionDelegate userInteractionEnded]; + } + else { + // User is still touching the screen. Restart the timer. + [self startInteractionTimer]; + } +} + +- (void) showOnScreenControls { +#if !TARGET_OS_TV + [onScreenControls show]; +#endif +} + +- (OnScreenControlsLevel) getCurrentOscState { + if (onScreenControls == nil) { + return OnScreenControlsLevelOff; + } + else { + return [onScreenControls getLevel]; + } +} + +- (CGSize) getVideoAreaSize { + if (self.bounds.size.width > self.bounds.size.height * streamAspectRatio) { + return CGSizeMake(self.bounds.size.height * streamAspectRatio, self.bounds.size.height); + } else { + return CGSizeMake(self.bounds.size.width, self.bounds.size.width / streamAspectRatio); + } +} + +- (CGPoint) adjustCoordinatesForVideoArea:(CGPoint)point { + // These are now relative to the StreamView, however we need to scale them + // further to make them relative to the actual video portion. + float x = point.x - self.bounds.origin.x; + float y = point.y - self.bounds.origin.y; + + // For some reason, we don't seem to always get to the bounds of the window + // so we'll subtract 1 pixel if we're to the left/below of the origin and + // and add 1 pixel if we're to the right/above. It should be imperceptible + // to the user but it will allow activation of gestures that require contact + // with the edge of the screen (like Aero Snap). + if (x < self.bounds.size.width / 2) { + x--; + } + else { + x++; + } + if (y < self.bounds.size.height / 2) { + y--; + } + else { + y++; + } + + // This logic mimics what iOS does with AVLayerVideoGravityResizeAspect + CGSize videoSize = [self getVideoAreaSize]; + CGPoint videoOrigin = CGPointMake(self.bounds.size.width / 2 - videoSize.width / 2, + self.bounds.size.height / 2 - videoSize.height / 2); + + // Confine the cursor to the video region. We don't just discard events outside + // the region because we won't always get one exactly when the mouse leaves the region. + return CGPointMake(MIN(MAX(x, videoOrigin.x), videoOrigin.x + videoSize.width) - videoOrigin.x, + MIN(MAX(y, videoOrigin.y), videoOrigin.y + videoSize.height) - videoOrigin.y); +} + +#if !TARGET_OS_TV + +- (uint16_t)getRotationFromAzimuthAngle:(float)azimuthAngle { + // iOS reports azimuth of 0 when the stylus is pointing west, but Moonlight expects + // rotation of 0 to mean the stylus is pointing north. Rotate the azimuth angle + // clockwise by 90 degrees to convert from iOS to Moonlight rotation conventions. + int32_t rotationAngle = (azimuthAngle - M_PI_2) * (180.f / M_PI); + if (rotationAngle < 0) { + rotationAngle += 360; + } + return (uint16_t)rotationAngle; +} + +- (uint8_t)getTiltFromAltitudeAngle:(float)altitudeAngle { + // iOS reports an altitude of 0 when the stylus is parallel to the touch surface, + // while Moonlight expects a tilt of 0 when the stylus is perpendicular to the surface. + // Subtract the tilt angle from 90 to convert from iOS to Moonlight tilt conventions. + uint8_t altitudeDegs = abs((int16_t)(altitudeAngle * (180.f / M_PI))); + return 90 - MIN(90, altitudeDegs); +} + +<<<<<<< HEAD +// convert 64bit pointer to CRC32 checksum +- (uint32_t)crc32OfUint64:(uint64_t)value { + // uint64_t可以被视为字符数组来计算CRC32 + char data[sizeof(value)]; + memcpy(data, &value, sizeof(value)); + uint32_t crc = crc32(0, Z_NULL, 0); + crc = crc32(crc, (const Bytef *)data, sizeof(value)); + return crc; +} + +- (void)trySendTouchEvent:(UITouch*)event index:(int)index{ + uint8_t type; + // NSLog(@"trySendTouchEvent %ld,%d",(long)event.phase,(uint32_t)event); +//#define LI_TOUCH_EVENT_HOVER 0x00 +//#define LI_TOUCH_EVENT_DOWN 0x01 +//#define LI_TOUCH_EVENT_UP 0x02 +//#define LI_TOUCH_EVENT_MOVE 0x03 +//#define LI_TOUCH_EVENT_CANCEL 0x04 +//#define LI_TOUCH_EVENT_BUTTON_ONLY 0x05 +//#define LI_TOUCH_EVENT_HOVER_LEAVE 0x06 +//#define LI_TOUCH_EVENT_CANCEL_ALL 0x07 +//#define LI_ROT_UNKNOWN 0xFFFF + + +// UITouchPhaseBegan, // whenever a finger touches the surface. +// UITouchPhaseMoved, // whenever a finger moves on the surface. +// UITouchPhaseStationary, // whenever a finger is touching the surface but hasn't moved since the previous event. +// UITouchPhaseEnded, // whenever a finger leaves the surface. +// UITouchPhaseCancelled, // whenever a touch doesn't end but we need to stop tracking (e.g. putting device to face) +// UITouchPhaseRegionEntered API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos), // whenever a touch is entering the region of a user interface +// UITouchPhaseRegionMoved API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos), // when a touch is inside the region of a user interface, but hasn’t yet made contact or left the region +// UITouchPhaseRegionExited API_AVAILABLE(ios(13.4), tvos(13.4)) + + switch (event.phase) { + case UITouchPhaseBegan://开始触摸 + type = LI_TOUCH_EVENT_DOWN; + break; + case UITouchPhaseMoved://移动 + case UITouchPhaseStationary: + type = LI_TOUCH_EVENT_MOVE; + break; + case UITouchPhaseEnded://触摸结束 + type = LI_TOUCH_EVENT_UP; + break; + case UITouchPhaseCancelled://触摸取消 + type = LI_TOUCH_EVENT_CANCEL; + break; + case UITouchPhaseRegionEntered://停留 + case UITouchPhaseRegionMoved://停留 + type = LI_TOUCH_EVENT_HOVER; + break; + default: + return; + } +// switch (event.phase) { +// case UITouchPhaseBegan: +// type = LI_TOUCH_EVENT_DOWN; +// break; +// case UITouchPhaseMoved: +// type = LI_TOUCH_EVENT_MOVE; +// break; +// case UITouchPhaseEnded: +// type = LI_TOUCH_EVENT_UP; +// break; +// case UITouchPhaseCancelled: +// type = LI_TOUCH_EVENT_CANCEL; +// break; +// default: +// return; +// } + uint32_t pointerId = [self crc32OfUint64:((uint64_t)event)]; // convert pointer event(64bit) to CRC32 checksum as touch pointer ID. + // There's no pointerId like Android in definition of iOS touch event "UITouch", we use pointer to UITouch to generate touch pointer ID. + // Since touch pointer ID is defined to be uint32_t, I implement CRC32 checksum to the 64bit address, which avoids touch pointer ID repetition. + CGPoint location = [self adjustCoordinatesForVideoArea:[event locationInView:self]]; + CGSize videoSize = [self getVideoAreaSize]; + LiSendTouchEvent(type,pointerId,location.x / videoSize.width, location.y / videoSize.height,(event.force / event.maximumPossibleForce) / sin(event.altitudeAngle),0.0f, 0.0f,[self getRotationFromAzimuthAngle:[event azimuthAngleInView:self]]); +} + + + +- (void)sendStylusEvent:(UITouch*)event { +======= +- (BOOL)sendStylusEvent:(UITouch*)event { +>>>>>>> Moonlight-iOS-Official9.0.2 + uint8_t type; + + // Don't touch stylus events if the host doesn't support them. We want to pass + // them as normal touches for legacy hosts that don't understand pen events. + if (!(LiGetHostFeatureFlags() & LI_FF_PEN_TOUCH_EVENTS)) { + return NO; + } + + switch (event.phase) { + case UITouchPhaseBegan: + type = LI_TOUCH_EVENT_DOWN; + break; + case UITouchPhaseMoved: + type = LI_TOUCH_EVENT_MOVE; + break; + case UITouchPhaseEnded: + type = LI_TOUCH_EVENT_UP; + break; + case UITouchPhaseCancelled: + type = LI_TOUCH_EVENT_CANCEL; + break; + default: + return YES; + } + + CGPoint location = [self adjustCoordinatesForVideoArea:[event locationInView:self]]; + CGSize videoSize = [self getVideoAreaSize]; + + return LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height, + (event.force / event.maximumPossibleForce) / sin(event.altitudeAngle), + 0.0f, 0.0f, + [self getRotationFromAzimuthAngle:[event azimuthAngleInView:self]], + [self getTiltFromAltitudeAngle:event.altitudeAngle]) != LI_ERR_UNSUPPORTED; +} + +- (void)sendStylusHoverEvent:(UIHoverGestureRecognizer*)gesture API_AVAILABLE(ios(13.0)) { + uint8_t type; + + switch (gesture.state) { + case UIGestureRecognizerStateBegan: + case UIGestureRecognizerStateChanged: + type = LI_TOUCH_EVENT_HOVER; + break; + + case UIGestureRecognizerStateEnded: + type = LI_TOUCH_EVENT_HOVER_LEAVE; + break; + + default: + return; + } + + CGPoint location = [self adjustCoordinatesForVideoArea:[gesture locationInView:self]]; + CGSize videoSize = [self getVideoAreaSize]; + + float distance = 0.0f; +#if defined(__IPHONE_16_1) || defined(__TVOS_16_1) + if (@available(iOS 16.1, *)) { + distance = gesture.zOffset; + } +#endif + + uint16_t rotationAngle = LI_ROT_UNKNOWN; + uint8_t tiltAngle = LI_TILT_UNKNOWN; +#if defined(__IPHONE_16_4) || defined(__TVOS_16_4) + if (@available(iOS 16.4, *)) { + rotationAngle = [self getRotationFromAzimuthAngle:[gesture azimuthAngleInView:self]]; + tiltAngle = [self getTiltFromAltitudeAngle:gesture.altitudeAngle]; + } +#endif + + LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height, + distance, 0.0f, 0.0f, rotationAngle, tiltAngle); +} + +#endif + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + if ([self handleMouseButtonEvent:BUTTON_ACTION_PRESS + forTouches:touches + withEvent:event]) { + // If it's a mouse event, we're done + return; + } + + Log(LOG_D, @"Touch down"); + + // Notify of user interaction and start expiration timer + [self startInteractionTimer]; + +#if !TARGET_OS_TV + if (@available(iOS 13.4, *)) { +// NSArray *arr1 = [[event allTouches] allObjects]; +//// NSLog(@"touchesBegan - %lu",[[event allTouches] count]); +//// NSLog(@"touchesBegan - %lu",arr1.count); +// +// for(int i=0;i *)presses withEvent:(UIPressesEvent *)event { + BOOL handled = NO; + + if (@available(iOS 13.4, tvOS 13.4, *)) { + for (UIPress* press in presses) { + // For now, we'll treated it as handled if we handle at least one of the + // UIPress events inside the set. + if ([KeyboardSupport sendKeyEventForPress:press down:YES]) { + // This will prevent the legacy UITextField from receiving the event + handled = YES; + } + } + } + + if (!handled) { + [super pressesBegan:presses withEvent:event]; + } +} + +- (void)pressesEnded:(NSSet *)presses withEvent:(UIPressesEvent *)event { + BOOL handled = NO; + + if (@available(iOS 13.4, tvOS 13.4, *)) { + for (UIPress* press in presses) { + // For now, we'll treated it as handled if we handle at least one of the + // UIPress events inside the set. + if ([KeyboardSupport sendKeyEventForPress:press down:NO]) { + // This will prevent the legacy UITextField from receiving the event + handled = YES; + } + } + } + + if (!handled) { + [super pressesEnded:presses withEvent:event]; + } +} + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { + if ([self handleMouseButtonEvent:BUTTON_ACTION_RELEASE + forTouches:touches + withEvent:event]) { + // If it's a mouse event, we're done + return; + } + + Log(LOG_D, @"Touch up"); + + hasUserInteracted = YES; + +#if !TARGET_OS_TV + if (@available(iOS 13.4, *)) { + for (UITouch* touch in touches) { + if (touch.type == UITouchTypePencil) { + if ([self sendStylusEvent:touch]) { + return; + } + } + TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; + if (settings.absoluteTouchMode) { + [self trySendTouchEvent:touch index:0]; +// return; + } + } + } +#endif + + if (![onScreenControls handleTouchUpEvent:touches]) { + [touchHandler touchesEnded:touches withEvent:event]; + } +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { + [touchHandler touchesCancelled:touches withEvent:event]; + [self handleMouseButtonEvent:BUTTON_ACTION_RELEASE + forTouches:touches + withEvent:event]; +#if !TARGET_OS_TV + if (@available(iOS 13.4, *)) { + for (UITouch* touch in touches) { + if (touch.type == UITouchTypePencil) { + [self sendStylusEvent:touch]; + } + TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; + if (settings.absoluteTouchMode) { + [self trySendTouchEvent:touch index:0]; +// return; + } + } + } +#endif +} + +#if !TARGET_OS_TV +- (void) updateCursorLocation:(CGPoint)location isMouse:(BOOL)isMouse { + CGPoint normalizedLocation = [self adjustCoordinatesForVideoArea:location]; + CGSize videoSize = [self getVideoAreaSize]; + + // Send the mouse position relative to the video region if it has changed + // if we're receiving coordinates from a real mouse. + // + // NB: It is important for functionality (not just optimization) to only + // send it if the value has changed. We will receive one of these events + // any time the user presses a modifier key, which can result in errant + // mouse motion when using a Citrix X1 mouse. + if (normalizedLocation.x != lastMouseX || normalizedLocation.y != lastMouseY || !isMouse) { + if (lastMouseX != 0 || lastMouseY != 0 || !isMouse) { + LiSendMousePositionEvent(normalizedLocation.x, normalizedLocation.y, videoSize.width, videoSize.height); + } + + if (isMouse) { + lastMouseX = normalizedLocation.x; + lastMouseY = normalizedLocation.y; + } + } +} + +- (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction + regionForRequest:(UIPointerRegionRequest *)request + defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4)) { + if (@available(iOS 14.0, *)) { + if ([GCMouse current] != nil) { + // We'll handle this with GCMouse. Do nothing here. + return nil; + } + } + + // This logic mimics what iOS does with AVLayerVideoGravityResizeAspect + CGSize videoSize; + CGPoint videoOrigin; + if (self.bounds.size.width > self.bounds.size.height * streamAspectRatio) { + videoSize = CGSizeMake(self.bounds.size.height * streamAspectRatio, self.bounds.size.height); + } else { + videoSize = CGSizeMake(self.bounds.size.width, self.bounds.size.width / streamAspectRatio); + } + videoOrigin = CGPointMake(self.bounds.size.width / 2 - videoSize.width / 2, + self.bounds.size.height / 2 - videoSize.height / 2); + + // Move the cursor on the host if no buttons are pressed. + // Motion with buttons pressed in handled in touchesMoved: + if (lastMouseButtonMask == 0) { + [self updateCursorLocation:request.location isMouse:YES]; + } + + // The pointer interaction should cover the video region only + return [UIPointerRegion regionWithRect:CGRectMake(videoOrigin.x, videoOrigin.y, videoSize.width, videoSize.height) identifier:nil]; +} + +- (UIPointerStyle *)pointerInteraction:(UIPointerInteraction *)interaction styleForRegion:(UIPointerRegion *)region API_AVAILABLE(ios(13.4)) { + // Always hide the mouse cursor over our stream view + return [UIPointerStyle hiddenPointerStyle]; +} + +- (void)mouseWheelMovedContinuous:(UIPanGestureRecognizer *)gesture { + switch (gesture.state) { + case UIGestureRecognizerStateBegan: + case UIGestureRecognizerStateChanged: + break; + + case UIGestureRecognizerStateEnded: + default: + // Ignore recognition failure and other states + lastScrollTranslation = CGPointMake(0, 0); + return; + } + + CGPoint currentScrollTranslation = [gesture translationInView:self]; + const short translationMultiplier = 120 * 20; // WHEEL_DELTA * 20 + + { + short translationDeltaY = ((currentScrollTranslation.y - lastScrollTranslation.y) / self.bounds.size.height) * translationMultiplier; + if (translationDeltaY != 0) { + LiSendHighResScrollEvent(translationDeltaY); + lastScrollTranslation = currentScrollTranslation; + } + } + + { + short translationDeltaX = ((currentScrollTranslation.x - lastScrollTranslation.x) / self.bounds.size.width) * translationMultiplier; + if (translationDeltaX != 0) { + // Direction is reversed from vertical scrolling + LiSendHighResHScrollEvent(-translationDeltaX); + lastScrollTranslation = currentScrollTranslation; + } + } +} + +- (void)mouseWheelMovedDiscrete:(UIPanGestureRecognizer *)gesture { + switch (gesture.state) { + case UIGestureRecognizerStateBegan: + case UIGestureRecognizerStateChanged: + break; + + case UIGestureRecognizerStateEnded: + default: + // Ignore recognition failure and other states + lastScrollTranslation = CGPointMake(0, 0); + return; + } + + // Using velocityInView is 0 for discrete scroll events + // when scrolling very slowly, but translationInView does work. + CGPoint currentScrollTranslation = [gesture translationInView:self]; + + { + short translationDeltaY = currentScrollTranslation.y - lastScrollTranslation.y; + if (translationDeltaY != 0) { + LiSendScrollEvent(translationDeltaY > 0 ? 1 : -1); + } + } + + { + short translationDeltaX = currentScrollTranslation.x - lastScrollTranslation.x; + if (translationDeltaX != 0) { + // Direction is reversed from vertical scrolling + LiSendHScrollEvent(translationDeltaX < 0 ? 1 : -1); + } + } + + lastScrollTranslation = currentScrollTranslation; +} + +#endif + +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { + if (@available(iOS 13.0, *)) { + // Disable the 3 finger tap gestures that trigger the copy/paste/undo toolbar on iOS 13+ + return gestureRecognizer.name == nil || ![gestureRecognizer.name hasPrefix:@"kbProductivity."]; + } + else { + return YES; + } +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + // This method is called when the "Return" key is pressed. + LiSendKeyboardEvent(0x0d, KEY_ACTION_DOWN, 0); + usleep(50 * 1000); + LiSendKeyboardEvent(0x0d, KEY_ACTION_UP, 0); + return NO; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField { + for (NSNumber* keyCode in keysDown) { + LiSendKeyboardEvent([keyCode shortValue], KEY_ACTION_UP, 0); + } + [keysDown removeAllObjects]; +} + +- (void)onKeyboardPressed:(UITextField *)textField { + NSString* inputText = textField.text; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + // If the text became empty, we know the user pressed the backspace key. + if ([inputText isEqual:@""]) { + LiSendKeyboardEvent(0x08, KEY_ACTION_DOWN, 0); + usleep(50 * 1000); + LiSendKeyboardEvent(0x08, KEY_ACTION_UP, 0); + } else { + // Character 0 will be our known sentinel value + + // Check if any characters exist which can't be represented in a basic key event + for (int i = 1; i < [inputText length]; i++) { + struct KeyEvent event = [KeyboardSupport translateKeyEvent:[inputText characterAtIndex:i] withModifierFlags:0]; + if (event.keycode == 0) { + // We found an unknown key, so send the entire string as UTF-8 + const char* utf8String = [inputText UTF8String]; + + // Skip the first character which is our sentinel + LiSendUtf8TextEvent(utf8String + 1, (int)strlen(utf8String) - 1); + return; + } + } + + // We didn't find any unknown characters, so send them all as basic key events + for (int i = 1; i < [inputText length]; i++) { + struct KeyEvent event = [KeyboardSupport translateKeyEvent:[inputText characterAtIndex:i] withModifierFlags:0]; + assert(event.keycode != 0); + [self sendLowLevelEvent:event]; + } + } + }); + + // Reset text field back to known state + textField.text = @"0"; + + // Move the insertion point back to the end of the text box + UITextRange *textRange = [textField textRangeFromPosition:textField.endOfDocument toPosition:textField.endOfDocument]; + [textField setSelectedTextRange:textRange]; +} + +- (void)specialCharPressed:(UIKeyCommand *)cmd { + struct KeyEvent event = [KeyboardSupport translateKeyEvent:0x20 withModifierFlags:[cmd modifierFlags]]; + event.keycode = [[dictCodes valueForKey:[cmd input]] intValue]; + [self sendLowLevelEvent:event]; +} + +- (void)keyPressed:(UIKeyCommand *)cmd { + struct KeyEvent event = [KeyboardSupport translateKeyEvent:[[cmd input] characterAtIndex:0] withModifierFlags:[cmd modifierFlags]]; + [self sendLowLevelEvent:event]; +} + +- (void)sendLowLevelEvent:(struct KeyEvent)event { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + // When we want to send a modified key (like uppercase letters) we need to send the + // modifier ("shift") seperately from the key itself. + if (event.modifier != 0) { + LiSendKeyboardEvent(event.modifierKeycode, KEY_ACTION_DOWN, event.modifier); + } + // Let the host know these are not (necessarily) normalized to US English scancodes + LiSendKeyboardEvent2(event.keycode, KEY_ACTION_DOWN, event.modifier, SS_KBE_FLAG_NON_NORMALIZED); + usleep(50 * 1000); + LiSendKeyboardEvent2(event.keycode, KEY_ACTION_UP, event.modifier, SS_KBE_FLAG_NON_NORMALIZED); + if (event.modifier != 0) { + LiSendKeyboardEvent(event.modifierKeycode, KEY_ACTION_UP, event.modifier); + } + }); +} + +- (BOOL)canBecomeFirstResponder { + return YES; +} + +- (NSArray *)keyCommands +{ + NSString *charset = @"qwertyuiopasdfghjklzxcvbnm1234567890\t§[]\\'\"/.,`<>-´ç+`¡'º;ñ= "; + + NSMutableArray * commands = [NSMutableArray array]; + dictCodes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt: 0x0d], @"\r", [NSNumber numberWithInt: 0x08], @"\b", [NSNumber numberWithInt: 0x1b], UIKeyInputEscape, [NSNumber numberWithInt: 0x28], UIKeyInputDownArrow, [NSNumber numberWithInt: 0x26], UIKeyInputUpArrow, [NSNumber numberWithInt: 0x25], UIKeyInputLeftArrow, [NSNumber numberWithInt: 0x27], UIKeyInputRightArrow, nil]; + + [charset enumerateSubstringsInRange:NSMakeRange(0, charset.length) + options:NSStringEnumerationByComposedCharacterSequences + usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { + [commands addObject:[UIKeyCommand keyCommandWithInput:substring modifierFlags:0 action:@selector(keyPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:substring modifierFlags:UIKeyModifierShift action:@selector(keyPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:substring modifierFlags:UIKeyModifierControl action:@selector(keyPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:substring modifierFlags:UIKeyModifierAlternate action:@selector(keyPressed:)]]; + }]; + + for (NSString *c in [dictCodes keyEnumerator]) { + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:0 + action:@selector(specialCharPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:UIKeyModifierShift + action:@selector(specialCharPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:UIKeyModifierShift | UIKeyModifierAlternate + action:@selector(specialCharPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:UIKeyModifierShift | UIKeyModifierControl + action:@selector(specialCharPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:UIKeyModifierControl + action:@selector(specialCharPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:UIKeyModifierControl | UIKeyModifierAlternate + action:@selector(specialCharPressed:)]]; + [commands addObject:[UIKeyCommand keyCommandWithInput:c + modifierFlags:UIKeyModifierAlternate + action:@selector(specialCharPressed:)]]; + } + + return commands; +} + +- (void)connectedStateDidChangeWithIdentifier:(NSUUID * _Nonnull)identifier isConnected:(BOOL)isConnected { + NSLog(@"Citrix X1 mouse state change: %@ -> %s", + identifier, isConnected ? "connected" : "disconnected"); +} + +- (void)mouseDidMoveWithIdentifier:(NSUUID * _Nonnull)identifier deltaX:(int16_t)deltaX deltaY:(int16_t)deltaY { + accumulatedMouseDeltaX += deltaX / X1_MOUSE_SPEED_DIVISOR; + accumulatedMouseDeltaY += deltaY / X1_MOUSE_SPEED_DIVISOR; + + short shortX = (short)accumulatedMouseDeltaX; + short shortY = (short)accumulatedMouseDeltaY; + + if (shortX == 0 && shortY == 0) { + return; + } + + LiSendMouseMoveEvent(shortX, shortY); + + accumulatedMouseDeltaX -= shortX; + accumulatedMouseDeltaY -= shortY; +} + +- (int) buttonFromX1ButtonCode:(enum X1MouseButton)button { + switch (button) { + case X1MouseButtonLeft: + return BUTTON_LEFT; + case X1MouseButtonRight: + return BUTTON_RIGHT; + case X1MouseButtonMiddle: + return BUTTON_MIDDLE; + default: + return -1; + } +} + +- (void)mouseDownWithIdentifier:(NSUUID * _Nonnull)identifier button:(enum X1MouseButton)button { + LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, [self buttonFromX1ButtonCode:button]); +} + +- (void)mouseUpWithIdentifier:(NSUUID * _Nonnull)identifier button:(enum X1MouseButton)button { + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, [self buttonFromX1ButtonCode:button]); +} + +- (void)wheelDidScrollWithIdentifier:(NSUUID * _Nonnull)identifier deltaZ:(int8_t)deltaZ { + LiSendScrollEvent(deltaZ); +} + +#if !TARGET_OS_TV +- (BOOL)isMultipleTouchEnabled { + return YES; +} +#endif + +@end diff --git a/Limelight/Network/HttpManager.m b/Limelight/Network/HttpManager.m index 61882244..9a1dd3e3 100644 --- a/Limelight/Network/HttpManager.m +++ b/Limelight/Network/HttpManager.m @@ -276,7 +276,7 @@ // indicated by a negative version in the last field. int fps = (config.frameRate > 60 && ![config.appVersion containsString:@".-"]) ? 0 : config.frameRate; - NSString* urlString = [NSString stringWithFormat:@"%@/%@?uniqueid=%@&appid=%@&mode=%dx%dx%d&additionalStates=1&sops=%d&rikey=%@&rikeyid=%d%@&localAudioPlayMode=%d&surroundAudioInfo=%d&remoteControllersBitmap=%d&gcmap=%d&gcpersist=%d", + NSString* urlString = [NSString stringWithFormat:@"%@/%@?uniqueid=%@&appid=%@&mode=%dx%dx%d&additionalStates=1&sops=%d&rikey=%@&rikeyid=%d%@&localAudioPlayMode=%d&surroundAudioInfo=%d&remoteControllersBitmap=%d&gcmap=%d&gcpersist=%d%s", _baseHTTPSURL, verb, _uniqueId, config.appID, config.width, config.height, fps, @@ -286,7 +286,8 @@ config.playAudioOnPC ? 1 : 0, SURROUNDAUDIOINFO_FROM_AUDIO_CONFIGURATION(config.audioConfiguration), config.gamepadMask, config.gamepadMask, - !config.multiController ? 1 : 0]; + !config.multiController ? 1 : 0, + LiGetLaunchUrlQueryParameters()]; Log(LOG_I, @"Requesting: %@", urlString); // This blocks while the app is launching return [self createRequestFromString:urlString timeout:LONG_TIMEOUT_SEC]; diff --git a/Limelight/Stream/Connection.m b/Limelight/Stream/Connection.m index 24433117..846add93 100644 --- a/Limelight/Stream/Connection.m +++ b/Limelight/Stream/Connection.m @@ -420,9 +420,10 @@ void ClSetControllerLED(uint16_t controllerNumber, uint8_t r, uint8_t g, uint8_t _streamConfig.supportedVideoFormats = config.supportedVideoFormats; _streamConfig.audioConfiguration = config.audioConfiguration; - // TODO: If/when video encryption is added, we'll probably want to - // limit that to devices that support the ARMv8 AES instructions. - _streamConfig.encryptionFlags = ENCFLG_AUDIO; + // Since we require iOS 12 or above, we're guaranteed to be running + // on a 64-bit device with ARMv8 crypto instructions, so we don't + // need to check for that here. + _streamConfig.encryptionFlags = ENCFLG_ALL; if ([Utils isActiveNetworkVPN]) { // Force remote streaming mode when a VPN is connected diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index 66da2521..facefbdc 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -439,9 +439,21 @@ break; default: + { + NSString* errorString; + if (abs(errorCode) > 1000) { + // We'll assume large errors are hex values + errorString = [NSString stringWithFormat:@"%08X", (uint32_t)errorCode]; + } + else { + // Smaller values will just be printed as decimal (probably errno.h values) + errorString = [NSString stringWithFormat:@"%d", errorCode]; + } + title = @"Connection Terminated"; - message = @"The connection was terminated"; + message = [NSString stringWithFormat: @"The connection was terminated\n\nError code: %@", errorString]; break; + } } } diff --git a/Moonlight-ZWM.xcodeproj/project.pbxproj b/Moonlight-ZWM.xcodeproj/project.pbxproj index dc69c9a4..f05f1f62 100644 --- a/Moonlight-ZWM.xcodeproj/project.pbxproj +++ b/Moonlight-ZWM.xcodeproj/project.pbxproj @@ -1191,7 +1191,7 @@ "$(PROJECT_DIR)/libs/SDL2/lib/tvOS-Sim", "$(PROJECT_DIR)/libs/FFmpeg/lib/tvOS-Sim", ); - MARKETING_VERSION = 9.0.0; + MARKETING_VERSION = 9.0.2; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1247,7 +1247,7 @@ "$(PROJECT_DIR)/libs/SDL2/lib/tvOS-Sim", "$(PROJECT_DIR)/libs/FFmpeg/lib/tvOS-Sim", ); - MARKETING_VERSION = 9.0.0; + MARKETING_VERSION = 9.0.2; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1406,8 +1406,8 @@ "$(PROJECT_DIR)/libs/SDL2/lib/iOS-Sim", "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS-Sim", ); - MARKETING_VERSION = 9.0.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-zwm.iPadOS"; + MARKETING_VERSION = 9.0.2; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SKIP_INSTALL = NO; diff --git a/Moonlight-ZWM.xcodeproj/project.pbxproj.orig b/Moonlight-ZWM.xcodeproj/project.pbxproj.orig new file mode 100644 index 00000000..7d23c81a --- /dev/null +++ b/Moonlight-ZWM.xcodeproj/project.pbxproj.orig @@ -0,0 +1,1555 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 693B3A9B218638CD00982F7B /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 693B3A9A218638CD00982F7B /* Settings.bundle */; }; + 98181BE92791277400E43572 /* libSDL2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98181BE82791275D00E43572 /* libSDL2.a */; }; + 98181BEB2791278F00E43572 /* libSDL2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98181BEA2791278300E43572 /* libSDL2.a */; }; + 98181BED2791281100E43572 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98181BEC2791281100E43572 /* CoreMotion.framework */; }; + 9819CC14254F107A008A7C8E /* RelativeTouchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9819CC13254F107A008A7C8E /* RelativeTouchHandler.m */; }; + 9819CC1D254F1730008A7C8E /* RelativeTouchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9819CC13254F107A008A7C8E /* RelativeTouchHandler.m */; }; + 9819CC22254F180F008A7C8E /* AbsoluteTouchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9819CC21254F180F008A7C8E /* AbsoluteTouchHandler.m */; }; + 9827E7A32514366900F25707 /* HapticContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 9827E7A22514366900F25707 /* HapticContext.m */; }; + 9827E7A42514366900F25707 /* HapticContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 9827E7A22514366900F25707 /* HapticContext.m */; }; + 9832D1361BBCD5C50036EF48 /* TemporaryApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 9832D1351BBCD5C50036EF48 /* TemporaryApp.m */; }; + 9865DC30213260B40005B9B9 /* libmoonlight-common-tv.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB1A68152132509400507771 /* libmoonlight-common-tv.a */; }; + 9865DC31213260F10005B9B9 /* mkcert.c in Sources */ = {isa = PBXBuildFile; fileRef = FB89460719F646E200339C8A /* mkcert.c */; }; + 9865DC36213287F30005B9B9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FB290D0319B2C406004C83CF /* AppDelegate.m */; }; + 9865DC37213287FE0005B9B9 /* StreamFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89462719F646E200339C8A /* StreamFrameViewController.m */; }; + 9865DC38213287FE0005B9B9 /* LoadingFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4A23B71A9D3637004D2EF2 /* LoadingFrameViewController.m */; }; + 9865DC3C2132922E0005B9B9 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9865DC3B2132922E0005B9B9 /* GameController.framework */; }; + 9865DC3E21332D660005B9B9 /* MainFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89462519F646E200339C8A /* MainFrameViewController.m */; }; + 98882A062AF60F7000C5A11C /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98882A032AF60F5300C5A11C /* libavcodec.a */; }; + 98882A072AF60F7200C5A11C /* libavformat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98882A052AF60F5300C5A11C /* libavformat.a */; }; + 98882A082AF60F7400C5A11C /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98882A042AF60F5300C5A11C /* libavutil.a */; }; + 98882A0C2AF60F9E00C5A11C /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98882A0A2AF60F9000C5A11C /* libavcodec.a */; }; + 98882A0D2AF60FA000C5A11C /* libavformat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98882A0B2AF60F9000C5A11C /* libavformat.a */; }; + 98882A0E2AF60FA300C5A11C /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98882A092AF60F9000C5A11C /* libavutil.a */; }; + 988FCD41293B091B003050E2 /* KeyboardInputField.m in Sources */ = {isa = PBXBuildFile; fileRef = 988FCD40293B091B003050E2 /* KeyboardInputField.m */; }; + 988FCD42293B091B003050E2 /* KeyboardInputField.m in Sources */ = {isa = PBXBuildFile; fileRef = 988FCD40293B091B003050E2 /* KeyboardInputField.m */; }; + 9890CF6B203B7EE1006C4B06 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9890CF6A203B7EE1006C4B06 /* libxml2.tbd */; }; + 9896219723D15C7000211983 /* X1Kit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9896219623D15C7000211983 /* X1Kit.swift */; }; + 9896219A23D56E8100211983 /* X1Kit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9896219623D15C7000211983 /* X1Kit.swift */; }; + 9897B6A1221260EF00966419 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 9897B6A0221260EF00966419 /* Controller.m */; }; + 9897B6A62212732C00966419 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 9897B6A0221260EF00966419 /* Controller.m */; }; + 98A2E31129B5256200CA17A7 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A2E31029B5256200CA17A7 /* OpenSSL.xcframework */; }; + 98A2E31229B5256E00CA17A7 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A2E31029B5256200CA17A7 /* OpenSSL.xcframework */; }; + 98B9CE6D27B2144B00B473C4 /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98B9CE6C27B2144B00B473C4 /* AVKit.framework */; }; + 98CFB82F1CAD481B0048EF74 /* libmoonlight-common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98AB2E841CAD46840089BB98 /* libmoonlight-common.a */; }; + 98D5856D1C0EA79600F6CC00 /* TemporaryHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 98D5856C1C0EA79600F6CC00 /* TemporaryHost.m */; }; + 98D585701C0ED0E800F6CC00 /* TemporarySettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 98D5856F1C0ED0E800F6CC00 /* TemporarySettings.m */; }; + DC1F5A07206436B20037755F /* ConnectionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1F5A06206436B20037755F /* ConnectionHelper.m */; }; + FB1A674D2131E65900507771 /* KeyboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1A674C2131E65900507771 /* KeyboardSupport.m */; }; + FB1A67602132419700507771 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB1A675E2132419700507771 /* Main.storyboard */; }; + FB1A67622132419A00507771 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FB1A67612132419A00507771 /* Assets.xcassets */; }; + FB1A67A12132458C00507771 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1A67642132419A00507771 /* main.m */; }; + FB1A67A3213245BD00507771 /* Connection.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461719F646E200339C8A /* Connection.m */; }; + FB1A67A5213245BD00507771 /* StreamConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461919F646E200339C8A /* StreamConfiguration.m */; }; + FB1A67A7213245BD00507771 /* StreamManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461B19F646E200339C8A /* StreamManager.m */; }; + FB1A67A9213245BD00507771 /* VideoDecoderRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461D19F646E200339C8A /* VideoDecoderRenderer.m */; }; + FB1A67AB213245C500507771 /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460619F646E200339C8A /* CryptoManager.m */; }; + FB1A67AF213245C500507771 /* IdManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB53E1421BE5DC4400CD6ECE /* IdManager.m */; }; + FB1A67B1213245D500507771 /* HttpManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461019F646E200339C8A /* HttpManager.m */; }; + FB1A67B3213245D500507771 /* HttpRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD361A7E02DB00872C98 /* HttpRequest.m */; }; + FB1A67B5213245D500507771 /* HttpResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD271A7C84ED00872C98 /* HttpResponse.m */; }; + FB1A67B7213245D500507771 /* ServerInfoResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD391A7E05CE00872C98 /* ServerInfoResponse.m */; }; + FB1A67B9213245D500507771 /* AppAssetResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD3C1A7E111600872C98 /* AppAssetResponse.m */; }; + FB1A67BB213245D500507771 /* AppListResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD3F1A7E127D00872C98 /* AppListResponse.m */; }; + FB1A67BD213245E000507771 /* DiscoveryManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678F91A55FFAD00377732 /* DiscoveryManager.m */; }; + FB1A67BF213245E000507771 /* DiscoveryWorker.m in Sources */ = {isa = PBXBuildFile; fileRef = FB6549551A57907E001C8F39 /* DiscoveryWorker.m */; }; + FB1A67C1213245E000507771 /* MDNSManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461219F646E200339C8A /* MDNSManager.m */; }; + FB1A67C3213245EA00507771 /* AppAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494219FC9C04002D2A60 /* AppAssetManager.m */; }; + FB1A67C5213245EA00507771 /* AppAssetRetriever.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD311A7D867C00872C98 /* AppAssetRetriever.m */; }; + FB1A67C7213245EA00507771 /* PairManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461419F646E200339C8A /* PairManager.m */; }; + FB1A67C9213245EA00507771 /* WakeOnLanManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678FE1A565DAC00377732 /* WakeOnLanManager.m */; }; + FB1A67CB213245EA00507771 /* ConnectionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1F5A06206436B20037755F /* ConnectionHelper.m */; }; + FB1A67CD213245F800507771 /* DataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD349611A0089F6002D2A60 /* DataManager.m */; }; + FB1A67CF213245F800507771 /* TemporaryApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 9832D1351BBCD5C50036EF48 /* TemporaryApp.m */; }; + FB1A67D1213245F800507771 /* TemporaryHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 98D5856C1C0EA79600F6CC00 /* TemporaryHost.m */; }; + FB1A67D3213245F800507771 /* TemporarySettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 98D5856F1C0ED0E800F6CC00 /* TemporarySettings.m */; }; + FB1A67D52132460400507771 /* ControllerSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460B19F646E200339C8A /* ControllerSupport.m */; }; + FB1A67D82132460400507771 /* StreamView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460D19F646E200339C8A /* StreamView.m */; }; + FB1A67DA2132460400507771 /* OnScreenControls.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678EC1A50C40900377732 /* OnScreenControls.m */; }; + FB1A67DC2132460400507771 /* KeyboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1A674C2131E65900507771 /* KeyboardSupport.m */; }; + FB1A67DE2132460A00507771 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89462219F646E200339C8A /* Utils.m */; }; + FB1A67E02132460A00507771 /* Logger.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD1C8E11A8AD71400C6703C /* Logger.m */; }; + FB1A67E32132498A00507771 /* Limelight.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */; }; + FB1A67E521324A1F00507771 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB1A67E421324A1F00507771 /* CoreData.framework */; }; + FB1A67E821324DE300507771 /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946EA19F6AFB800339C8A /* libopus.a */; }; + FB1A67EA21324DF300507771 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = FB1A67E921324DF300507771 /* libxml2.tbd */; }; + FB1A6819213284FB00507771 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; + FB1A681A213284FB00507771 /* UIAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E519F82297001C18A8 /* UIAppView.m */; }; + FB1A681B213284FB00507771 /* ComputerScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */; }; + FB1A681C213284FB00507771 /* AppCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */; }; + FB1A681E21328A1B00507771 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FB290D0819B2C406004C83CF /* Images.xcassets */; }; + FB1D59971BBCCB6400F482CA /* ComputerScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */; }; + FB1D599A1BBCCD7E00F482CA /* AppCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */; }; + FB290CF219B2C406004C83CF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290CF119B2C406004C83CF /* Foundation.framework */; }; + FB290CF419B2C406004C83CF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290CF319B2C406004C83CF /* CoreGraphics.framework */; }; + FB290CF619B2C406004C83CF /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290CF519B2C406004C83CF /* UIKit.framework */; }; + FB290CF819B2C406004C83CF /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290CF719B2C406004C83CF /* CoreData.framework */; }; + FB290CFE19B2C406004C83CF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FB290CFC19B2C406004C83CF /* InfoPlist.strings */; }; + FB290D0019B2C406004C83CF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FB290CFF19B2C406004C83CF /* main.m */; }; + FB290D0419B2C406004C83CF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FB290D0319B2C406004C83CF /* AppDelegate.m */; }; + FB290D0719B2C406004C83CF /* Limelight.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */; }; + FB290D0919B2C406004C83CF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FB290D0819B2C406004C83CF /* Images.xcassets */; }; + FB290E7919B37D81004C83CF /* iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7819B37D81004C83CF /* iPad.storyboard */; }; + FB290E7B19B38036004C83CF /* iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7A19B38036004C83CF /* iPhone.storyboard */; }; + FB4678ED1A50C40900377732 /* OnScreenControls.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678EC1A50C40900377732 /* OnScreenControls.m */; }; + FB4678FA1A55FFAD00377732 /* DiscoveryManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678F91A55FFAD00377732 /* DiscoveryManager.m */; }; + FB4678FF1A565DAC00377732 /* WakeOnLanManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678FE1A565DAC00377732 /* WakeOnLanManager.m */; }; + FB4679011A57048000377732 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB4679001A57048000377732 /* CoreFoundation.framework */; }; + FB4A23B81A9D3637004D2EF2 /* LoadingFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4A23B71A9D3637004D2EF2 /* LoadingFrameViewController.m */; }; + FB53E1431BE5DC4400CD6ECE /* IdManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB53E1421BE5DC4400CD6ECE /* IdManager.m */; }; + FB6549561A57907E001C8F39 /* DiscoveryWorker.m in Sources */ = {isa = PBXBuildFile; fileRef = FB6549551A57907E001C8F39 /* DiscoveryWorker.m */; }; + FB89462819F646E200339C8A /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460619F646E200339C8A /* CryptoManager.m */; }; + FB89462919F646E200339C8A /* mkcert.c in Sources */ = {isa = PBXBuildFile; fileRef = FB89460719F646E200339C8A /* mkcert.c */; }; + FB89462A19F646E200339C8A /* ControllerSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460B19F646E200339C8A /* ControllerSupport.m */; }; + FB89462B19F646E200339C8A /* StreamView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460D19F646E200339C8A /* StreamView.m */; }; + FB89462C19F646E200339C8A /* HttpManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461019F646E200339C8A /* HttpManager.m */; }; + FB89462D19F646E200339C8A /* MDNSManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461219F646E200339C8A /* MDNSManager.m */; }; + FB89462E19F646E200339C8A /* PairManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461419F646E200339C8A /* PairManager.m */; }; + FB89462F19F646E200339C8A /* Connection.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461719F646E200339C8A /* Connection.m */; }; + FB89463019F646E200339C8A /* StreamConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461919F646E200339C8A /* StreamConfiguration.m */; }; + FB89463119F646E200339C8A /* StreamManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461B19F646E200339C8A /* StreamManager.m */; }; + FB89463219F646E200339C8A /* VideoDecoderRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89461D19F646E200339C8A /* VideoDecoderRenderer.m */; }; + FB89463419F646E200339C8A /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89462219F646E200339C8A /* Utils.m */; }; + FB89463519F646E200339C8A /* MainFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89462519F646E200339C8A /* MainFrameViewController.m */; }; + FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89462719F646E200339C8A /* StreamFrameViewController.m */; }; + FB89463819F6473800339C8A /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = FB89463719F6473800339C8A /* Launch Screen.xib */; }; + FB8946ED19F6AFE800339C8A /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946EA19F6AFB800339C8A /* libopus.a */; }; + FB9AFD281A7C84ED00872C98 /* HttpResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD271A7C84ED00872C98 /* HttpResponse.m */; }; + FB9AFD321A7D867C00872C98 /* AppAssetRetriever.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD311A7D867C00872C98 /* AppAssetRetriever.m */; }; + FB9AFD371A7E02DB00872C98 /* HttpRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD361A7E02DB00872C98 /* HttpRequest.m */; }; + FB9AFD3A1A7E05CE00872C98 /* ServerInfoResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD391A7E05CE00872C98 /* ServerInfoResponse.m */; }; + FB9AFD3D1A7E111600872C98 /* AppAssetResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD3C1A7E111600872C98 /* AppAssetResponse.m */; }; + FB9AFD401A7E127D00872C98 /* AppListResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FB9AFD3F1A7E127D00872C98 /* AppListResponse.m */; }; + FBD1C8E21A8AD71400C6703C /* Logger.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD1C8E11A8AD71400C6703C /* Logger.m */; }; + FBD3494319FC9C04002D2A60 /* AppAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494219FC9C04002D2A60 /* AppAssetManager.m */; }; + FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494F19FF2174002D2A60 /* SettingsViewController.m */; }; + FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */; }; + FBD349621A0089F6002D2A60 /* DataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD349611A0089F6002D2A60 /* DataManager.m */; }; + FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; + FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E519F82297001C18A8 /* UIAppView.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 98AB2E831CAD46840089BB98 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = FB290E2E19B37A4E004C83CF; + remoteInfo = "moonlight-common"; + }; + 98AB2E851CAD468B0089BB98 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = FB290E2D19B37A4E004C83CF; + remoteInfo = "moonlight-common"; + }; + FB1A68142132509400507771 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = FB1A67EF21324EE300507771; + remoteInfo = "moonlight-common-tv"; + }; + FB1A68162132509800507771 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = FB1A67EE21324EE300507771; + remoteInfo = "moonlight-common-tv"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 566E9D2B2770B23A00EF7BFE /* Moonlight v1.7.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.7.xcdatamodel"; sourceTree = ""; }; + 693B3A9A218638CD00982F7B /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; + 9803CCAB254F9EAF00EE185E /* ConnectionCallbacks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ConnectionCallbacks.h; sourceTree = ""; }; + 98132E8C20BC9A62007A053F /* Moonlight v1.1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.1.xcdatamodel"; sourceTree = ""; }; + 98181BE82791275D00E43572 /* libSDL2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSDL2.a; path = libs/SDL2/lib/iOS/libSDL2.a; sourceTree = ""; }; + 98181BEA2791278300E43572 /* libSDL2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSDL2.a; path = libs/SDL2/lib/tvOS/libSDL2.a; sourceTree = ""; }; + 98181BEC2791281100E43572 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; + 9819CC12254F107A008A7C8E /* RelativeTouchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RelativeTouchHandler.h; sourceTree = ""; }; + 9819CC13254F107A008A7C8E /* RelativeTouchHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RelativeTouchHandler.m; sourceTree = ""; }; + 9819CC20254F180F008A7C8E /* AbsoluteTouchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AbsoluteTouchHandler.h; sourceTree = ""; }; + 9819CC21254F180F008A7C8E /* AbsoluteTouchHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AbsoluteTouchHandler.m; sourceTree = ""; }; + 9819CC25254F2734008A7C8E /* Moonlight v1.6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.6.xcdatamodel"; sourceTree = ""; }; + 9827E7A22514366900F25707 /* HapticContext.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HapticContext.m; sourceTree = ""; }; + 9827E7A7251436EA00F25707 /* HapticContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HapticContext.h; sourceTree = ""; }; + 9832D1341BBCD5C50036EF48 /* TemporaryApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TemporaryApp.h; path = Database/TemporaryApp.h; sourceTree = ""; }; + 9832D1351BBCD5C50036EF48 /* TemporaryApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TemporaryApp.m; path = Database/TemporaryApp.m; sourceTree = ""; }; + 984CD023288A310D0097D2D4 /* Moonlight v1.8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.8.xcdatamodel"; sourceTree = ""; }; + 98517B1B21CE0A9000481377 /* Moonlight v1.3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.3.xcdatamodel"; sourceTree = ""; }; + 98608BDD22DC0C2C000E5672 /* Moonlight v1.4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.4.xcdatamodel"; sourceTree = ""; }; + 9865DC3B2132922E0005B9B9 /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS11.4.sdk/System/Library/Frameworks/GameController.framework; sourceTree = DEVELOPER_DIR; }; + 986CCE6C2133E45300168291 /* Moonlight v1.2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.2.xcdatamodel"; sourceTree = ""; }; + 986E28A528EA989100758361 /* Moonlight v1.9.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.9.xcdatamodel"; sourceTree = ""; }; + 9874E8962AE95E1D00130A3C /* Moonlight v1.10.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.10.xcdatamodel"; sourceTree = ""; }; + 98783FEA242EAC5D00F00EF4 /* Moonlight v1.5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.5.xcdatamodel"; sourceTree = ""; }; + 98882A032AF60F5300C5A11C /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavcodec.a; path = libs/FFmpeg/lib/iOS/libavcodec.a; sourceTree = ""; }; + 98882A042AF60F5300C5A11C /* libavutil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavutil.a; path = libs/FFmpeg/lib/iOS/libavutil.a; sourceTree = ""; }; + 98882A052AF60F5300C5A11C /* libavformat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavformat.a; path = libs/FFmpeg/lib/iOS/libavformat.a; sourceTree = ""; }; + 98882A092AF60F9000C5A11C /* libavutil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavutil.a; path = libs/FFmpeg/lib/tvOS/libavutil.a; sourceTree = ""; }; + 98882A0A2AF60F9000C5A11C /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavcodec.a; path = libs/FFmpeg/lib/tvOS/libavcodec.a; sourceTree = ""; }; + 98882A0B2AF60F9000C5A11C /* libavformat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavformat.a; path = libs/FFmpeg/lib/tvOS/libavformat.a; sourceTree = ""; }; + 988FCD3F293B091B003050E2 /* KeyboardInputField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyboardInputField.h; sourceTree = ""; }; + 988FCD40293B091B003050E2 /* KeyboardInputField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KeyboardInputField.m; sourceTree = ""; }; + 9890CF6A203B7EE1006C4B06 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; + 9896219623D15C7000211983 /* X1Kit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = X1Kit.swift; path = X1Kit/Sources/X1Kit/X1Kit.swift; sourceTree = ""; }; + 9897B6A0221260EF00966419 /* Controller.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; + 9897B6A32212610800966419 /* Controller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; + 98A2E31029B5256200CA17A7 /* OpenSSL.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = libs/OpenSSL.xcframework; sourceTree = ""; }; + 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "moonlight-common.xcodeproj"; path = "moonlight-common/moonlight-common.xcodeproj"; sourceTree = ""; }; + 98B9CE6C27B2144B00B473C4 /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS15.2.sdk/System/Library/Frameworks/AVKit.framework; sourceTree = DEVELOPER_DIR; }; + 98D5856B1C0EA79600F6CC00 /* TemporaryHost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TemporaryHost.h; path = Database/TemporaryHost.h; sourceTree = ""; }; + 98D5856C1C0EA79600F6CC00 /* TemporaryHost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TemporaryHost.m; path = Database/TemporaryHost.m; sourceTree = ""; }; + 98D5856E1C0ED0E800F6CC00 /* TemporarySettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TemporarySettings.h; path = Database/TemporarySettings.h; sourceTree = ""; }; + 98D5856F1C0ED0E800F6CC00 /* TemporarySettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TemporarySettings.m; path = Database/TemporarySettings.m; sourceTree = ""; }; + D4746EEA1CBC740C006FB401 /* Moonlight-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Moonlight-Bridging-Header.h"; path = "Input/Moonlight-Bridging-Header.h"; sourceTree = ""; }; + DC1F5A05206436B10037755F /* ConnectionHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectionHelper.h; sourceTree = ""; }; + DC1F5A06206436B20037755F /* ConnectionHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConnectionHelper.m; sourceTree = ""; }; + FB1A674B2131E65900507771 /* KeyboardSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyboardSupport.h; sourceTree = ""; }; + FB1A674C2131E65900507771 /* KeyboardSupport.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KeyboardSupport.m; sourceTree = ""; }; + FB1A67532132419700507771 /* Moonlight-ZWM TV.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Moonlight-ZWM TV.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + FB1A675F2132419700507771 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FB1A67612132419A00507771 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FB1A67632132419A00507771 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FB1A67642132419A00507771 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FB1A67E421324A1F00507771 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS11.4.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; + FB1A67E921324DF300507771 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS11.4.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; }; + FB1D59951BBCCB6400F482CA /* ComputerScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComputerScrollView.h; sourceTree = ""; }; + FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ComputerScrollView.m; sourceTree = ""; }; + FB1D59981BBCCD7E00F482CA /* AppCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppCollectionView.h; sourceTree = ""; }; + FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppCollectionView.m; sourceTree = ""; }; + FB290CEE19B2C406004C83CF /* Moonlight-ZWM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Moonlight-ZWM.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + FB290CF119B2C406004C83CF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + FB290CF319B2C406004C83CF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + FB290CF519B2C406004C83CF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + FB290CF719B2C406004C83CF /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + FB290CFB19B2C406004C83CF /* Limelight-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Limelight-Info.plist"; sourceTree = ""; }; + FB290CFD19B2C406004C83CF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + FB290CFF19B2C406004C83CF /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FB290D0119B2C406004C83CF /* Limelight-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Limelight-Prefix.pch"; sourceTree = ""; }; + FB290D0219B2C406004C83CF /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + FB290D0319B2C406004C83CF /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + FB290D0619B2C406004C83CF /* Limelight.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Limelight.xcdatamodel; sourceTree = ""; }; + FB290D0819B2C406004C83CF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + FB290E7819B37D81004C83CF /* iPad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPad.storyboard; sourceTree = SOURCE_ROOT; }; + FB290E7A19B38036004C83CF /* iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPhone.storyboard; sourceTree = SOURCE_ROOT; }; + FB4678EB1A50C40900377732 /* OnScreenControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OnScreenControls.h; sourceTree = ""; }; + FB4678EC1A50C40900377732 /* OnScreenControls.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OnScreenControls.m; sourceTree = ""; }; + FB4678F21A51BDCB00377732 /* Limelight 0.3.0.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Limelight 0.3.0.xcdatamodel"; sourceTree = ""; }; + FB4678F81A55FFAD00377732 /* DiscoveryManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiscoveryManager.h; sourceTree = ""; }; + FB4678F91A55FFAD00377732 /* DiscoveryManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DiscoveryManager.m; sourceTree = ""; }; + FB4678FD1A565DAC00377732 /* WakeOnLanManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WakeOnLanManager.h; sourceTree = ""; }; + FB4678FE1A565DAC00377732 /* WakeOnLanManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WakeOnLanManager.m; sourceTree = ""; }; + FB4679001A57048000377732 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; + FB4A23B61A9D3637004D2EF2 /* LoadingFrameViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoadingFrameViewController.h; sourceTree = ""; }; + FB4A23B71A9D3637004D2EF2 /* LoadingFrameViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LoadingFrameViewController.m; sourceTree = ""; }; + FB53E1411BE5DC4400CD6ECE /* IdManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IdManager.h; sourceTree = ""; }; + FB53E1421BE5DC4400CD6ECE /* IdManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IdManager.m; sourceTree = ""; }; + FB53E1441BE5DCBC00CD6ECE /* Moonlight v1.0-2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.0-2.xcdatamodel"; sourceTree = ""; }; + FB6549541A57907E001C8F39 /* DiscoveryWorker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiscoveryWorker.h; sourceTree = ""; }; + FB6549551A57907E001C8F39 /* DiscoveryWorker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DiscoveryWorker.m; sourceTree = ""; }; + FB6549621A60B4A9001C8F39 /* Limelight 0.3.1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Limelight 0.3.1.xcdatamodel"; sourceTree = ""; }; + FB89460519F646E200339C8A /* CryptoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoManager.h; sourceTree = ""; }; + FB89460619F646E200339C8A /* CryptoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CryptoManager.m; sourceTree = ""; }; + FB89460719F646E200339C8A /* mkcert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mkcert.c; sourceTree = ""; }; + FB89460819F646E200339C8A /* mkcert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mkcert.h; sourceTree = ""; }; + FB89460A19F646E200339C8A /* ControllerSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControllerSupport.h; sourceTree = ""; }; + FB89460B19F646E200339C8A /* ControllerSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ControllerSupport.m; sourceTree = ""; }; + FB89460C19F646E200339C8A /* StreamView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamView.h; sourceTree = ""; }; + FB89460D19F646E200339C8A /* StreamView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StreamView.m; sourceTree = ""; }; + FB89460F19F646E200339C8A /* HttpManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpManager.h; sourceTree = ""; }; + FB89461019F646E200339C8A /* HttpManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpManager.m; sourceTree = ""; }; + FB89461119F646E200339C8A /* MDNSManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDNSManager.h; sourceTree = ""; }; + FB89461219F646E200339C8A /* MDNSManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDNSManager.m; sourceTree = ""; }; + FB89461319F646E200339C8A /* PairManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PairManager.h; sourceTree = ""; }; + FB89461419F646E200339C8A /* PairManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PairManager.m; sourceTree = ""; }; + FB89461619F646E200339C8A /* Connection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Connection.h; sourceTree = ""; }; + FB89461719F646E200339C8A /* Connection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Connection.m; sourceTree = ""; }; + FB89461819F646E200339C8A /* StreamConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamConfiguration.h; sourceTree = ""; }; + FB89461919F646E200339C8A /* StreamConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StreamConfiguration.m; sourceTree = ""; }; + FB89461A19F646E200339C8A /* StreamManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamManager.h; sourceTree = ""; }; + FB89461B19F646E200339C8A /* StreamManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StreamManager.m; sourceTree = ""; }; + FB89461C19F646E200339C8A /* VideoDecoderRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoDecoderRenderer.h; sourceTree = ""; }; + FB89461D19F646E200339C8A /* VideoDecoderRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoDecoderRenderer.m; sourceTree = ""; }; + FB89462119F646E200339C8A /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utils.h; sourceTree = ""; }; + FB89462219F646E200339C8A /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Utils.m; sourceTree = ""; }; + FB89462419F646E200339C8A /* MainFrameViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainFrameViewController.h; sourceTree = ""; }; + FB89462519F646E200339C8A /* MainFrameViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainFrameViewController.m; sourceTree = ""; }; + FB89462619F646E200339C8A /* StreamFrameViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamFrameViewController.h; sourceTree = ""; }; + FB89462719F646E200339C8A /* StreamFrameViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StreamFrameViewController.m; sourceTree = ""; }; + FB89463719F6473800339C8A /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = SOURCE_ROOT; }; + FB89469419F6AFB800339C8A /* aes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; + FB89469519F6AFB800339C8A /* asn1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = ""; }; + FB89469619F6AFB800339C8A /* asn1_mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = asn1_mac.h; sourceTree = ""; }; + FB89469719F6AFB800339C8A /* asn1t.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = asn1t.h; sourceTree = ""; }; + FB89469819F6AFB800339C8A /* bio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bio.h; sourceTree = ""; }; + FB89469919F6AFB800339C8A /* blowfish.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = ""; }; + FB89469A19F6AFB800339C8A /* bn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bn.h; sourceTree = ""; }; + FB89469B19F6AFB800339C8A /* buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; + FB89469C19F6AFB800339C8A /* camellia.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = ""; }; + FB89469D19F6AFB800339C8A /* cast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = ""; }; + FB89469E19F6AFB800339C8A /* cmac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cmac.h; sourceTree = ""; }; + FB89469F19F6AFB800339C8A /* cms.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cms.h; sourceTree = ""; }; + FB8946A019F6AFB800339C8A /* comp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = comp.h; sourceTree = ""; }; + FB8946A119F6AFB800339C8A /* conf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = ""; }; + FB8946A219F6AFB800339C8A /* conf_api.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = conf_api.h; sourceTree = ""; }; + FB8946A319F6AFB800339C8A /* crypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = ""; }; + FB8946A419F6AFB800339C8A /* des.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = ""; }; + FB8946A519F6AFB800339C8A /* des_old.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = des_old.h; sourceTree = ""; }; + FB8946A619F6AFB800339C8A /* dh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dh.h; sourceTree = ""; }; + FB8946A719F6AFB800339C8A /* dsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dsa.h; sourceTree = ""; }; + FB8946A819F6AFB800339C8A /* dso.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dso.h; sourceTree = ""; }; + FB8946A919F6AFB800339C8A /* dtls1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtls1.h; sourceTree = ""; }; + FB8946AA19F6AFB800339C8A /* e_os2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = e_os2.h; sourceTree = ""; }; + FB8946AB19F6AFB800339C8A /* ebcdic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ebcdic.h; sourceTree = ""; }; + FB8946AC19F6AFB800339C8A /* ec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ec.h; sourceTree = ""; }; + FB8946AD19F6AFB800339C8A /* ecdh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = ""; }; + FB8946AE19F6AFB800339C8A /* ecdsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; + FB8946AF19F6AFB800339C8A /* engine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = ""; }; + FB8946B019F6AFB800339C8A /* err.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = ""; }; + FB8946B119F6AFB800339C8A /* evp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evp.h; sourceTree = ""; }; + FB8946B219F6AFB800339C8A /* hmac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = ""; }; + FB8946B319F6AFB800339C8A /* idea.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = idea.h; sourceTree = ""; }; + FB8946B419F6AFB800339C8A /* krb5_asn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = krb5_asn.h; sourceTree = ""; }; + FB8946B519F6AFB800339C8A /* kssl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kssl.h; sourceTree = ""; }; + FB8946B619F6AFB800339C8A /* lhash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lhash.h; sourceTree = ""; }; + FB8946B719F6AFB800339C8A /* md4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = ""; }; + FB8946B819F6AFB800339C8A /* md5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + FB8946B919F6AFB800339C8A /* mdc2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mdc2.h; sourceTree = ""; }; + FB8946BA19F6AFB800339C8A /* modes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = modes.h; sourceTree = ""; }; + FB8946BB19F6AFB800339C8A /* obj_mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = obj_mac.h; sourceTree = ""; }; + FB8946BC19F6AFB800339C8A /* objects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = ""; }; + FB8946BD19F6AFB800339C8A /* ocsp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ocsp.h; sourceTree = ""; }; + FB8946BE19F6AFB800339C8A /* opensslconf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opensslconf.h; sourceTree = ""; }; + FB8946BF19F6AFB800339C8A /* opensslv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opensslv.h; sourceTree = ""; }; + FB8946C019F6AFB800339C8A /* ossl_typ.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ossl_typ.h; sourceTree = ""; }; + FB8946C119F6AFB800339C8A /* pem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = ""; }; + FB8946C219F6AFB800339C8A /* pem2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pem2.h; sourceTree = ""; }; + FB8946C319F6AFB800339C8A /* pkcs12.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = ""; }; + FB8946C419F6AFB800339C8A /* pkcs7.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pkcs7.h; sourceTree = ""; }; + FB8946C519F6AFB800339C8A /* pqueue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pqueue.h; sourceTree = ""; }; + FB8946C619F6AFB800339C8A /* rand.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rand.h; sourceTree = ""; }; + FB8946C719F6AFB800339C8A /* rc2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rc2.h; sourceTree = ""; }; + FB8946C819F6AFB800339C8A /* rc4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rc4.h; sourceTree = ""; }; + FB8946C919F6AFB800339C8A /* ripemd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ripemd.h; sourceTree = ""; }; + FB8946CA19F6AFB800339C8A /* rsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = ""; }; + FB8946CB19F6AFB800339C8A /* safestack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = safestack.h; sourceTree = ""; }; + FB8946CC19F6AFB800339C8A /* seed.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = seed.h; sourceTree = ""; }; + FB8946CD19F6AFB800339C8A /* sha.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sha.h; sourceTree = ""; }; + FB8946CE19F6AFB800339C8A /* srp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = srp.h; sourceTree = ""; }; + FB8946CF19F6AFB800339C8A /* srtp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = srtp.h; sourceTree = ""; }; + FB8946D019F6AFB800339C8A /* ssl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = ""; }; + FB8946D119F6AFB800339C8A /* ssl2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ssl2.h; sourceTree = ""; }; + FB8946D219F6AFB800339C8A /* ssl23.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ssl23.h; sourceTree = ""; }; + FB8946D319F6AFB800339C8A /* ssl3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ssl3.h; sourceTree = ""; }; + FB8946D419F6AFB800339C8A /* stack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = ""; }; + FB8946D519F6AFB800339C8A /* symhacks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = symhacks.h; sourceTree = ""; }; + FB8946D619F6AFB800339C8A /* tls1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tls1.h; sourceTree = ""; }; + FB8946D719F6AFB800339C8A /* ts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ts.h; sourceTree = ""; }; + FB8946D819F6AFB800339C8A /* txt_db.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = txt_db.h; sourceTree = ""; }; + FB8946D919F6AFB800339C8A /* ui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = ""; }; + FB8946DA19F6AFB800339C8A /* ui_compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ui_compat.h; sourceTree = ""; }; + FB8946DB19F6AFB800339C8A /* whrlpool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = whrlpool.h; sourceTree = ""; }; + FB8946DC19F6AFB800339C8A /* x509.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = ""; }; + FB8946DD19F6AFB800339C8A /* x509_vfy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = ""; }; + FB8946DE19F6AFB800339C8A /* x509v3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = ""; }; + FB8946E019F6AFB800339C8A /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcrypto.a; sourceTree = ""; }; + FB8946E119F6AFB800339C8A /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libssl.a; sourceTree = ""; }; + FB8946E519F6AFB800339C8A /* opus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus.h; sourceTree = ""; }; + FB8946E619F6AFB800339C8A /* opus_defines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_defines.h; sourceTree = ""; }; + FB8946E719F6AFB800339C8A /* opus_multistream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; + FB8946E819F6AFB800339C8A /* opus_types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; + FB8946EA19F6AFB800339C8A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; + FB9AFD261A7C84ED00872C98 /* HttpResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpResponse.h; sourceTree = ""; }; + FB9AFD271A7C84ED00872C98 /* HttpResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpResponse.m; sourceTree = ""; }; + FB9AFD301A7D867C00872C98 /* AppAssetRetriever.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppAssetRetriever.h; sourceTree = ""; }; + FB9AFD311A7D867C00872C98 /* AppAssetRetriever.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppAssetRetriever.m; sourceTree = ""; }; + FB9AFD351A7E02DB00872C98 /* HttpRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpRequest.h; sourceTree = ""; }; + FB9AFD361A7E02DB00872C98 /* HttpRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpRequest.m; sourceTree = ""; }; + FB9AFD381A7E05CE00872C98 /* ServerInfoResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerInfoResponse.h; sourceTree = ""; }; + FB9AFD391A7E05CE00872C98 /* ServerInfoResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ServerInfoResponse.m; sourceTree = ""; }; + FB9AFD3B1A7E111600872C98 /* AppAssetResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppAssetResponse.h; sourceTree = ""; }; + FB9AFD3C1A7E111600872C98 /* AppAssetResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppAssetResponse.m; sourceTree = ""; }; + FB9AFD3E1A7E127D00872C98 /* AppListResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppListResponse.h; sourceTree = ""; }; + FB9AFD3F1A7E127D00872C98 /* AppListResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppListResponse.m; sourceTree = ""; }; + FBB460391B50ACE400F3099C /* Moonlight v1.0.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.0.xcdatamodel"; sourceTree = ""; }; + FBD1C8E01A8AD69E00C6703C /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logger.h; sourceTree = ""; }; + FBD1C8E11A8AD71400C6703C /* Logger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Logger.m; sourceTree = ""; }; + FBD3494119FC9C04002D2A60 /* AppAssetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppAssetManager.h; sourceTree = ""; }; + FBD3494219FC9C04002D2A60 /* AppAssetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppAssetManager.m; sourceTree = ""; }; + FBD3494E19FF2174002D2A60 /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; + FBD3494F19FF2174002D2A60 /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; + FBD3495119FF36FB002D2A60 /* SWRevealViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWRevealViewController.h; sourceTree = ""; }; + FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWRevealViewController.m; sourceTree = ""; }; + FBD349601A0089F6002D2A60 /* DataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DataManager.h; path = Database/DataManager.h; sourceTree = ""; }; + FBD349611A0089F6002D2A60 /* DataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DataManager.m; path = Database/DataManager.m; sourceTree = ""; }; + FBDE86DE19F7A837001C18A8 /* UIComputerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIComputerView.h; sourceTree = ""; }; + FBDE86DF19F7A837001C18A8 /* UIComputerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIComputerView.m; sourceTree = ""; }; + FBDE86E419F82297001C18A8 /* UIAppView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAppView.h; sourceTree = ""; }; + FBDE86E519F82297001C18A8 /* UIAppView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAppView.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FB1A67502132419700507771 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 98A2E31129B5256200CA17A7 /* OpenSSL.xcframework in Frameworks */, + 9865DC30213260B40005B9B9 /* libmoonlight-common-tv.a in Frameworks */, + 9865DC3C2132922E0005B9B9 /* GameController.framework in Frameworks */, + 98882A0D2AF60FA000C5A11C /* libavformat.a in Frameworks */, + 98882A0E2AF60FA300C5A11C /* libavutil.a in Frameworks */, + FB1A67EA21324DF300507771 /* libxml2.tbd in Frameworks */, + FB1A67E821324DE300507771 /* libopus.a in Frameworks */, + 98181BEB2791278F00E43572 /* libSDL2.a in Frameworks */, + FB1A67E521324A1F00507771 /* CoreData.framework in Frameworks */, + 98B9CE6D27B2144B00B473C4 /* AVKit.framework in Frameworks */, + 98882A0C2AF60F9E00C5A11C /* libavcodec.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FB290CEB19B2C406004C83CF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 98A2E31229B5256E00CA17A7 /* OpenSSL.xcframework in Frameworks */, + 9890CF6B203B7EE1006C4B06 /* libxml2.tbd in Frameworks */, + 98CFB82F1CAD481B0048EF74 /* libmoonlight-common.a in Frameworks */, + FB8946ED19F6AFE800339C8A /* libopus.a in Frameworks */, + 98882A082AF60F7400C5A11C /* libavutil.a in Frameworks */, + FB290CF419B2C406004C83CF /* CoreGraphics.framework in Frameworks */, + FB290CF819B2C406004C83CF /* CoreData.framework in Frameworks */, + 98181BED2791281100E43572 /* CoreMotion.framework in Frameworks */, + 98882A072AF60F7200C5A11C /* libavformat.a in Frameworks */, + FB290CF619B2C406004C83CF /* UIKit.framework in Frameworks */, + FB290CF219B2C406004C83CF /* Foundation.framework in Frameworks */, + FB4679011A57048000377732 /* CoreFoundation.framework in Frameworks */, + 98181BE92791277400E43572 /* libSDL2.a in Frameworks */, + 98882A062AF60F7000C5A11C /* libavcodec.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9896219423D15C2900211983 /* X1Kit */ = { + isa = PBXGroup; + children = ( + 9896219623D15C7000211983 /* X1Kit.swift */, + ); + name = X1Kit; + sourceTree = ""; + }; + 98AB2E801CAD46830089BB98 /* Products */ = { + isa = PBXGroup; + children = ( + 98AB2E841CAD46840089BB98 /* libmoonlight-common.a */, + FB1A68152132509400507771 /* libmoonlight-common-tv.a */, + ); + name = Products; + sourceTree = ""; + }; + FB1A67542132419700507771 /* Moonlight TV */ = { + isa = PBXGroup; + children = ( + FB1A675E2132419700507771 /* Main.storyboard */, + FB1A67612132419A00507771 /* Assets.xcassets */, + FB1A67632132419A00507771 /* Info.plist */, + FB1A67642132419A00507771 /* main.m */, + 693B3A9A218638CD00982F7B /* Settings.bundle */, + ); + path = "Moonlight TV"; + sourceTree = ""; + }; + FB290CE519B2C406004C83CF = { + isa = PBXGroup; + children = ( + 9896219423D15C2900211983 /* X1Kit */, + 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */, + FB290CF919B2C406004C83CF /* Moonlight */, + FB1A67542132419700507771 /* Moonlight TV */, + FB290CF019B2C406004C83CF /* Frameworks */, + FB290CEF19B2C406004C83CF /* Products */, + ); + sourceTree = ""; + }; + FB290CEF19B2C406004C83CF /* Products */ = { + isa = PBXGroup; + children = ( + FB290CEE19B2C406004C83CF /* Moonlight-ZWM.app */, + FB1A67532132419700507771 /* Moonlight-ZWM TV.app */, + ); + name = Products; + sourceTree = ""; + }; + FB290CF019B2C406004C83CF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 98882A032AF60F5300C5A11C /* libavcodec.a */, + 98882A052AF60F5300C5A11C /* libavformat.a */, + 98882A0A2AF60F9000C5A11C /* libavcodec.a */, + 98882A0B2AF60F9000C5A11C /* libavformat.a */, + 98882A042AF60F5300C5A11C /* libavutil.a */, + 98882A092AF60F9000C5A11C /* libavutil.a */, + 98A2E31029B5256200CA17A7 /* OpenSSL.xcframework */, + 98B9CE6C27B2144B00B473C4 /* AVKit.framework */, + 98181BEC2791281100E43572 /* CoreMotion.framework */, + 98181BE82791275D00E43572 /* libSDL2.a */, + 98181BEA2791278300E43572 /* libSDL2.a */, + 9865DC3B2132922E0005B9B9 /* GameController.framework */, + FB1A67E921324DF300507771 /* libxml2.tbd */, + FB1A67E421324A1F00507771 /* CoreData.framework */, + 9890CF6A203B7EE1006C4B06 /* libxml2.tbd */, + FB4679001A57048000377732 /* CoreFoundation.framework */, + FB89468F19F6AFB800339C8A /* libs */, + FB290CF119B2C406004C83CF /* Foundation.framework */, + FB290CF319B2C406004C83CF /* CoreGraphics.framework */, + FB290CF519B2C406004C83CF /* UIKit.framework */, + FB290CF719B2C406004C83CF /* CoreData.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + FB290CF919B2C406004C83CF /* Moonlight */ = { + isa = PBXGroup; + children = ( + D4746EEA1CBC740C006FB401 /* Moonlight-Bridging-Header.h */, + FB89460419F646E200339C8A /* Crypto */, + FB89460919F646E200339C8A /* Input */, + FB89460E19F646E200339C8A /* Network */, + FB89461519F646E200339C8A /* Stream */, + FB89461E19F646E200339C8A /* Utility */, + FB89462319F646E200339C8A /* ViewControllers */, + FBD3495F1A004453002D2A60 /* Database */, + FB290CFA19B2C406004C83CF /* Supporting Files */, + FB290D0219B2C406004C83CF /* AppDelegate.h */, + FB290D0319B2C406004C83CF /* AppDelegate.m */, + FBDE86DE19F7A837001C18A8 /* UIComputerView.h */, + FBDE86DF19F7A837001C18A8 /* UIComputerView.m */, + FBDE86E419F82297001C18A8 /* UIAppView.h */, + FBDE86E519F82297001C18A8 /* UIAppView.m */, + FB290E7819B37D81004C83CF /* iPad.storyboard */, + FB290E7A19B38036004C83CF /* iPhone.storyboard */, + FB89463719F6473800339C8A /* Launch Screen.xib */, + FB290D0819B2C406004C83CF /* Images.xcassets */, + FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */, + FB1D59951BBCCB6400F482CA /* ComputerScrollView.h */, + FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */, + FB1D59981BBCCD7E00F482CA /* AppCollectionView.h */, + FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */, + ); + name = Moonlight; + path = Limelight; + sourceTree = ""; + }; + FB290CFA19B2C406004C83CF /* Supporting Files */ = { + isa = PBXGroup; + children = ( + FB290CFB19B2C406004C83CF /* Limelight-Info.plist */, + FB290CFC19B2C406004C83CF /* InfoPlist.strings */, + FB290CFF19B2C406004C83CF /* main.m */, + FB290D0119B2C406004C83CF /* Limelight-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + FB89460419F646E200339C8A /* Crypto */ = { + isa = PBXGroup; + children = ( + FB89460519F646E200339C8A /* CryptoManager.h */, + FB89460619F646E200339C8A /* CryptoManager.m */, + FB89460719F646E200339C8A /* mkcert.c */, + FB89460819F646E200339C8A /* mkcert.h */, + FB53E1411BE5DC4400CD6ECE /* IdManager.h */, + FB53E1421BE5DC4400CD6ECE /* IdManager.m */, + ); + path = Crypto; + sourceTree = ""; + }; + FB89460919F646E200339C8A /* Input */ = { + isa = PBXGroup; + children = ( + FB89460A19F646E200339C8A /* ControllerSupport.h */, + FB89460B19F646E200339C8A /* ControllerSupport.m */, + FB89460C19F646E200339C8A /* StreamView.h */, + FB89460D19F646E200339C8A /* StreamView.m */, + FB4678EB1A50C40900377732 /* OnScreenControls.h */, + FB4678EC1A50C40900377732 /* OnScreenControls.m */, + FB1A674B2131E65900507771 /* KeyboardSupport.h */, + FB1A674C2131E65900507771 /* KeyboardSupport.m */, + 9897B6A0221260EF00966419 /* Controller.m */, + 9897B6A32212610800966419 /* Controller.h */, + 9827E7A22514366900F25707 /* HapticContext.m */, + 9827E7A7251436EA00F25707 /* HapticContext.h */, + 9819CC12254F107A008A7C8E /* RelativeTouchHandler.h */, + 9819CC13254F107A008A7C8E /* RelativeTouchHandler.m */, + 9819CC20254F180F008A7C8E /* AbsoluteTouchHandler.h */, + 9819CC21254F180F008A7C8E /* AbsoluteTouchHandler.m */, + 988FCD3F293B091B003050E2 /* KeyboardInputField.h */, + 988FCD40293B091B003050E2 /* KeyboardInputField.m */, + ); + path = Input; + sourceTree = ""; + }; + FB89460E19F646E200339C8A /* Network */ = { + isa = PBXGroup; + children = ( + FB9AFD2F1A7C979700872C98 /* Http */, + FB9AFD341A7D877B00872C98 /* Discovery */, + FB9AFD331A7D876F00872C98 /* AppList */, + FB89461319F646E200339C8A /* PairManager.h */, + FB89461419F646E200339C8A /* PairManager.m */, + FB4678FD1A565DAC00377732 /* WakeOnLanManager.h */, + FB4678FE1A565DAC00377732 /* WakeOnLanManager.m */, + DC1F5A05206436B10037755F /* ConnectionHelper.h */, + DC1F5A06206436B20037755F /* ConnectionHelper.m */, + ); + path = Network; + sourceTree = ""; + }; + FB89461519F646E200339C8A /* Stream */ = { + isa = PBXGroup; + children = ( + FB89461619F646E200339C8A /* Connection.h */, + FB89461719F646E200339C8A /* Connection.m */, + FB89461819F646E200339C8A /* StreamConfiguration.h */, + FB89461919F646E200339C8A /* StreamConfiguration.m */, + FB89461A19F646E200339C8A /* StreamManager.h */, + FB89461B19F646E200339C8A /* StreamManager.m */, + FB89461C19F646E200339C8A /* VideoDecoderRenderer.h */, + FB89461D19F646E200339C8A /* VideoDecoderRenderer.m */, + 9803CCAB254F9EAF00EE185E /* ConnectionCallbacks.h */, + ); + path = Stream; + sourceTree = ""; + }; + FB89461E19F646E200339C8A /* Utility */ = { + isa = PBXGroup; + children = ( + FB89462119F646E200339C8A /* Utils.h */, + FB89462219F646E200339C8A /* Utils.m */, + FBD1C8E01A8AD69E00C6703C /* Logger.h */, + FBD1C8E11A8AD71400C6703C /* Logger.m */, + ); + path = Utility; + sourceTree = ""; + }; + FB89462319F646E200339C8A /* ViewControllers */ = { + isa = PBXGroup; + children = ( + FBD3495119FF36FB002D2A60 /* SWRevealViewController.h */, + FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */, + FB89462419F646E200339C8A /* MainFrameViewController.h */, + FB89462519F646E200339C8A /* MainFrameViewController.m */, + FB89462619F646E200339C8A /* StreamFrameViewController.h */, + FB89462719F646E200339C8A /* StreamFrameViewController.m */, + FBD3494E19FF2174002D2A60 /* SettingsViewController.h */, + FBD3494F19FF2174002D2A60 /* SettingsViewController.m */, + FB4A23B61A9D3637004D2EF2 /* LoadingFrameViewController.h */, + FB4A23B71A9D3637004D2EF2 /* LoadingFrameViewController.m */, + ); + path = ViewControllers; + sourceTree = ""; + }; + FB89468F19F6AFB800339C8A /* libs */ = { + isa = PBXGroup; + children = ( + FB89469119F6AFB800339C8A /* openssl */, + FB8946E219F6AFB800339C8A /* opus */, + ); + path = libs; + sourceTree = ""; + }; + FB89469119F6AFB800339C8A /* openssl */ = { + isa = PBXGroup; + children = ( + FB89469219F6AFB800339C8A /* include */, + FB8946DF19F6AFB800339C8A /* lib */, + ); + path = openssl; + sourceTree = ""; + }; + FB89469219F6AFB800339C8A /* include */ = { + isa = PBXGroup; + children = ( + FB89469319F6AFB800339C8A /* openssl */, + ); + path = include; + sourceTree = ""; + }; + FB89469319F6AFB800339C8A /* openssl */ = { + isa = PBXGroup; + children = ( + FB89469419F6AFB800339C8A /* aes.h */, + FB89469519F6AFB800339C8A /* asn1.h */, + FB89469619F6AFB800339C8A /* asn1_mac.h */, + FB89469719F6AFB800339C8A /* asn1t.h */, + FB89469819F6AFB800339C8A /* bio.h */, + FB89469919F6AFB800339C8A /* blowfish.h */, + FB89469A19F6AFB800339C8A /* bn.h */, + FB89469B19F6AFB800339C8A /* buffer.h */, + FB89469C19F6AFB800339C8A /* camellia.h */, + FB89469D19F6AFB800339C8A /* cast.h */, + FB89469E19F6AFB800339C8A /* cmac.h */, + FB89469F19F6AFB800339C8A /* cms.h */, + FB8946A019F6AFB800339C8A /* comp.h */, + FB8946A119F6AFB800339C8A /* conf.h */, + FB8946A219F6AFB800339C8A /* conf_api.h */, + FB8946A319F6AFB800339C8A /* crypto.h */, + FB8946A419F6AFB800339C8A /* des.h */, + FB8946A519F6AFB800339C8A /* des_old.h */, + FB8946A619F6AFB800339C8A /* dh.h */, + FB8946A719F6AFB800339C8A /* dsa.h */, + FB8946A819F6AFB800339C8A /* dso.h */, + FB8946A919F6AFB800339C8A /* dtls1.h */, + FB8946AA19F6AFB800339C8A /* e_os2.h */, + FB8946AB19F6AFB800339C8A /* ebcdic.h */, + FB8946AC19F6AFB800339C8A /* ec.h */, + FB8946AD19F6AFB800339C8A /* ecdh.h */, + FB8946AE19F6AFB800339C8A /* ecdsa.h */, + FB8946AF19F6AFB800339C8A /* engine.h */, + FB8946B019F6AFB800339C8A /* err.h */, + FB8946B119F6AFB800339C8A /* evp.h */, + FB8946B219F6AFB800339C8A /* hmac.h */, + FB8946B319F6AFB800339C8A /* idea.h */, + FB8946B419F6AFB800339C8A /* krb5_asn.h */, + FB8946B519F6AFB800339C8A /* kssl.h */, + FB8946B619F6AFB800339C8A /* lhash.h */, + FB8946B719F6AFB800339C8A /* md4.h */, + FB8946B819F6AFB800339C8A /* md5.h */, + FB8946B919F6AFB800339C8A /* mdc2.h */, + FB8946BA19F6AFB800339C8A /* modes.h */, + FB8946BB19F6AFB800339C8A /* obj_mac.h */, + FB8946BC19F6AFB800339C8A /* objects.h */, + FB8946BD19F6AFB800339C8A /* ocsp.h */, + FB8946BE19F6AFB800339C8A /* opensslconf.h */, + FB8946BF19F6AFB800339C8A /* opensslv.h */, + FB8946C019F6AFB800339C8A /* ossl_typ.h */, + FB8946C119F6AFB800339C8A /* pem.h */, + FB8946C219F6AFB800339C8A /* pem2.h */, + FB8946C319F6AFB800339C8A /* pkcs12.h */, + FB8946C419F6AFB800339C8A /* pkcs7.h */, + FB8946C519F6AFB800339C8A /* pqueue.h */, + FB8946C619F6AFB800339C8A /* rand.h */, + FB8946C719F6AFB800339C8A /* rc2.h */, + FB8946C819F6AFB800339C8A /* rc4.h */, + FB8946C919F6AFB800339C8A /* ripemd.h */, + FB8946CA19F6AFB800339C8A /* rsa.h */, + FB8946CB19F6AFB800339C8A /* safestack.h */, + FB8946CC19F6AFB800339C8A /* seed.h */, + FB8946CD19F6AFB800339C8A /* sha.h */, + FB8946CE19F6AFB800339C8A /* srp.h */, + FB8946CF19F6AFB800339C8A /* srtp.h */, + FB8946D019F6AFB800339C8A /* ssl.h */, + FB8946D119F6AFB800339C8A /* ssl2.h */, + FB8946D219F6AFB800339C8A /* ssl23.h */, + FB8946D319F6AFB800339C8A /* ssl3.h */, + FB8946D419F6AFB800339C8A /* stack.h */, + FB8946D519F6AFB800339C8A /* symhacks.h */, + FB8946D619F6AFB800339C8A /* tls1.h */, + FB8946D719F6AFB800339C8A /* ts.h */, + FB8946D819F6AFB800339C8A /* txt_db.h */, + FB8946D919F6AFB800339C8A /* ui.h */, + FB8946DA19F6AFB800339C8A /* ui_compat.h */, + FB8946DB19F6AFB800339C8A /* whrlpool.h */, + FB8946DC19F6AFB800339C8A /* x509.h */, + FB8946DD19F6AFB800339C8A /* x509_vfy.h */, + FB8946DE19F6AFB800339C8A /* x509v3.h */, + ); + path = openssl; + sourceTree = ""; + }; + FB8946DF19F6AFB800339C8A /* lib */ = { + isa = PBXGroup; + children = ( + FB8946E019F6AFB800339C8A /* libcrypto.a */, + FB8946E119F6AFB800339C8A /* libssl.a */, + ); + path = lib; + sourceTree = ""; + }; + FB8946E219F6AFB800339C8A /* opus */ = { + isa = PBXGroup; + children = ( + FB8946E319F6AFB800339C8A /* include */, + FB8946E919F6AFB800339C8A /* lib */, + ); + path = opus; + sourceTree = ""; + }; + FB8946E319F6AFB800339C8A /* include */ = { + isa = PBXGroup; + children = ( + FB8946E419F6AFB800339C8A /* opus */, + ); + path = include; + sourceTree = ""; + }; + FB8946E419F6AFB800339C8A /* opus */ = { + isa = PBXGroup; + children = ( + FB8946E519F6AFB800339C8A /* opus.h */, + FB8946E619F6AFB800339C8A /* opus_defines.h */, + FB8946E719F6AFB800339C8A /* opus_multistream.h */, + FB8946E819F6AFB800339C8A /* opus_types.h */, + ); + path = opus; + sourceTree = ""; + }; + FB8946E919F6AFB800339C8A /* lib */ = { + isa = PBXGroup; + children = ( + FB8946EA19F6AFB800339C8A /* libopus.a */, + ); + path = lib; + sourceTree = ""; + }; + FB9AFD2F1A7C979700872C98 /* Http */ = { + isa = PBXGroup; + children = ( + FB89460F19F646E200339C8A /* HttpManager.h */, + FB89461019F646E200339C8A /* HttpManager.m */, + FB9AFD351A7E02DB00872C98 /* HttpRequest.h */, + FB9AFD361A7E02DB00872C98 /* HttpRequest.m */, + FB9AFD261A7C84ED00872C98 /* HttpResponse.h */, + FB9AFD271A7C84ED00872C98 /* HttpResponse.m */, + FB9AFD381A7E05CE00872C98 /* ServerInfoResponse.h */, + FB9AFD391A7E05CE00872C98 /* ServerInfoResponse.m */, + FB9AFD3B1A7E111600872C98 /* AppAssetResponse.h */, + FB9AFD3C1A7E111600872C98 /* AppAssetResponse.m */, + FB9AFD3E1A7E127D00872C98 /* AppListResponse.h */, + FB9AFD3F1A7E127D00872C98 /* AppListResponse.m */, + ); + name = Http; + sourceTree = ""; + }; + FB9AFD331A7D876F00872C98 /* AppList */ = { + isa = PBXGroup; + children = ( + FBD3494119FC9C04002D2A60 /* AppAssetManager.h */, + FBD3494219FC9C04002D2A60 /* AppAssetManager.m */, + FB9AFD301A7D867C00872C98 /* AppAssetRetriever.h */, + FB9AFD311A7D867C00872C98 /* AppAssetRetriever.m */, + ); + name = AppList; + sourceTree = ""; + }; + FB9AFD341A7D877B00872C98 /* Discovery */ = { + isa = PBXGroup; + children = ( + FB4678F81A55FFAD00377732 /* DiscoveryManager.h */, + FB4678F91A55FFAD00377732 /* DiscoveryManager.m */, + FB6549541A57907E001C8F39 /* DiscoveryWorker.h */, + FB6549551A57907E001C8F39 /* DiscoveryWorker.m */, + FB89461119F646E200339C8A /* MDNSManager.h */, + FB89461219F646E200339C8A /* MDNSManager.m */, + ); + name = Discovery; + sourceTree = ""; + }; + FBD3495F1A004453002D2A60 /* Database */ = { + isa = PBXGroup; + children = ( + FBD349601A0089F6002D2A60 /* DataManager.h */, + FBD349611A0089F6002D2A60 /* DataManager.m */, + 9832D1341BBCD5C50036EF48 /* TemporaryApp.h */, + 9832D1351BBCD5C50036EF48 /* TemporaryApp.m */, + 98D5856B1C0EA79600F6CC00 /* TemporaryHost.h */, + 98D5856C1C0EA79600F6CC00 /* TemporaryHost.m */, + 98D5856E1C0ED0E800F6CC00 /* TemporarySettings.h */, + 98D5856F1C0ED0E800F6CC00 /* TemporarySettings.m */, + ); + name = Database; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FB1A67522132419700507771 /* Moonlight-ZWM TV */ = { + isa = PBXNativeTarget; + buildConfigurationList = FB1A67682132419A00507771 /* Build configuration list for PBXNativeTarget "Moonlight-ZWM TV" */; + buildPhases = ( + FB1A674F2132419700507771 /* Sources */, + FB1A67502132419700507771 /* Frameworks */, + FB1A67512132419700507771 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + FB1A68172132509800507771 /* PBXTargetDependency */, + ); + name = "Moonlight-ZWM TV"; + productName = "Moonlight TV"; + productReference = FB1A67532132419700507771 /* Moonlight-ZWM TV.app */; + productType = "com.apple.product-type.application"; + }; + FB290CED19B2C406004C83CF /* Moonlight-ZWM */ = { + isa = PBXNativeTarget; + buildConfigurationList = FB290D2019B2C406004C83CF /* Build configuration list for PBXNativeTarget "Moonlight-ZWM" */; + buildPhases = ( + FB290CEA19B2C406004C83CF /* Sources */, + FB290CEB19B2C406004C83CF /* Frameworks */, + FB290CEC19B2C406004C83CF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 98AB2E861CAD468B0089BB98 /* PBXTargetDependency */, + ); + name = "Moonlight-ZWM"; + productName = Limelight; + productReference = FB290CEE19B2C406004C83CF /* Moonlight-ZWM.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FB290CE619B2C406004C83CF /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 1400; + ORGANIZATIONNAME = "Moonlight Game Streaming Project"; + TargetAttributes = { + FB1A67522132419700507771 = { + CreatedOnToolsVersion = 9.4.1; + LastSwiftMigration = 1140; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.GameControllers.appletvos = { + enabled = 1; + }; + }; + }; + FB290CED19B2C406004C83CF = { + LastSwiftMigration = 1140; + }; + }; + }; + buildConfigurationList = FB290CE919B2C406004C83CF /* Build configuration list for PBXProject "Moonlight-ZWM" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = FB290CE519B2C406004C83CF; + productRefGroup = FB290CEF19B2C406004C83CF /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 98AB2E801CAD46830089BB98 /* Products */; + ProjectRef = 98AB2E7F1CAD46830089BB98 /* moonlight-common.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + FB290CED19B2C406004C83CF /* Moonlight-ZWM */, + FB1A67522132419700507771 /* Moonlight-ZWM TV */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 98AB2E841CAD46840089BB98 /* libmoonlight-common.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libmoonlight-common.a"; + remoteRef = 98AB2E831CAD46840089BB98 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + FB1A68152132509400507771 /* libmoonlight-common-tv.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libmoonlight-common-tv.a"; + remoteRef = FB1A68142132509400507771 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + FB1A67512132419700507771 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 693B3A9B218638CD00982F7B /* Settings.bundle in Resources */, + FB1A681E21328A1B00507771 /* Images.xcassets in Resources */, + FB1A67622132419A00507771 /* Assets.xcassets in Resources */, + FB1A67602132419700507771 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FB290CEC19B2C406004C83CF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FB290E7919B37D81004C83CF /* iPad.storyboard in Resources */, + FB290CFE19B2C406004C83CF /* InfoPlist.strings in Resources */, + FB290E7B19B38036004C83CF /* iPhone.storyboard in Resources */, + FB290D0919B2C406004C83CF /* Images.xcassets in Resources */, + FB89463819F6473800339C8A /* Launch Screen.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FB1A674F2132419700507771 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9827E7A42514366900F25707 /* HapticContext.m in Sources */, + 9897B6A62212732C00966419 /* Controller.m in Sources */, + 9865DC3E21332D660005B9B9 /* MainFrameViewController.m in Sources */, + 9865DC36213287F30005B9B9 /* AppDelegate.m in Sources */, + FB1A6819213284FB00507771 /* UIComputerView.m in Sources */, + FB1A681A213284FB00507771 /* UIAppView.m in Sources */, + FB1A681B213284FB00507771 /* ComputerScrollView.m in Sources */, + FB1A681C213284FB00507771 /* AppCollectionView.m in Sources */, + 9865DC37213287FE0005B9B9 /* StreamFrameViewController.m in Sources */, + 9865DC38213287FE0005B9B9 /* LoadingFrameViewController.m in Sources */, + 9865DC31213260F10005B9B9 /* mkcert.c in Sources */, + FB1A67E32132498A00507771 /* Limelight.xcdatamodeld in Sources */, + FB1A67DE2132460A00507771 /* Utils.m in Sources */, + FB1A67E02132460A00507771 /* Logger.m in Sources */, + FB1A67D52132460400507771 /* ControllerSupport.m in Sources */, + FB1A67D82132460400507771 /* StreamView.m in Sources */, + 9896219A23D56E8100211983 /* X1Kit.swift in Sources */, + FB1A67DA2132460400507771 /* OnScreenControls.m in Sources */, + FB1A67DC2132460400507771 /* KeyboardSupport.m in Sources */, + FB1A67CD213245F800507771 /* DataManager.m in Sources */, + FB1A67CF213245F800507771 /* TemporaryApp.m in Sources */, + FB1A67D1213245F800507771 /* TemporaryHost.m in Sources */, + FB1A67D3213245F800507771 /* TemporarySettings.m in Sources */, + FB1A67C3213245EA00507771 /* AppAssetManager.m in Sources */, + FB1A67C5213245EA00507771 /* AppAssetRetriever.m in Sources */, + FB1A67C7213245EA00507771 /* PairManager.m in Sources */, + FB1A67C9213245EA00507771 /* WakeOnLanManager.m in Sources */, + FB1A67CB213245EA00507771 /* ConnectionHelper.m in Sources */, + FB1A67BD213245E000507771 /* DiscoveryManager.m in Sources */, + FB1A67BF213245E000507771 /* DiscoveryWorker.m in Sources */, + FB1A67C1213245E000507771 /* MDNSManager.m in Sources */, + FB1A67B1213245D500507771 /* HttpManager.m in Sources */, + FB1A67B3213245D500507771 /* HttpRequest.m in Sources */, + FB1A67B5213245D500507771 /* HttpResponse.m in Sources */, + FB1A67B7213245D500507771 /* ServerInfoResponse.m in Sources */, + FB1A67B9213245D500507771 /* AppAssetResponse.m in Sources */, + FB1A67BB213245D500507771 /* AppListResponse.m in Sources */, + 9819CC1D254F1730008A7C8E /* RelativeTouchHandler.m in Sources */, + FB1A67AB213245C500507771 /* CryptoManager.m in Sources */, + FB1A67AF213245C500507771 /* IdManager.m in Sources */, + 988FCD42293B091B003050E2 /* KeyboardInputField.m in Sources */, + FB1A67A3213245BD00507771 /* Connection.m in Sources */, + FB1A67A5213245BD00507771 /* StreamConfiguration.m in Sources */, + FB1A67A7213245BD00507771 /* StreamManager.m in Sources */, + FB1A67A9213245BD00507771 /* VideoDecoderRenderer.m in Sources */, + FB1A67A12132458C00507771 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FB290CEA19B2C406004C83CF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FB290D0719B2C406004C83CF /* Limelight.xcdatamodeld in Sources */, + 9819CC22254F180F008A7C8E /* AbsoluteTouchHandler.m in Sources */, + 9819CC14254F107A008A7C8E /* RelativeTouchHandler.m in Sources */, + FB1A674D2131E65900507771 /* KeyboardSupport.m in Sources */, + FB89463219F646E200339C8A /* VideoDecoderRenderer.m in Sources */, + FB290D0419B2C406004C83CF /* AppDelegate.m in Sources */, + FB9AFD401A7E127D00872C98 /* AppListResponse.m in Sources */, + FB89463419F646E200339C8A /* Utils.m in Sources */, + FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */, + FB89462F19F646E200339C8A /* Connection.m in Sources */, + FB9AFD321A7D867C00872C98 /* AppAssetRetriever.m in Sources */, + FB4678FF1A565DAC00377732 /* WakeOnLanManager.m in Sources */, + FB53E1431BE5DC4400CD6ECE /* IdManager.m in Sources */, + 9897B6A1221260EF00966419 /* Controller.m in Sources */, + FB89462919F646E200339C8A /* mkcert.c in Sources */, + FB9AFD281A7C84ED00872C98 /* HttpResponse.m in Sources */, + FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */, + FB89463019F646E200339C8A /* StreamConfiguration.m in Sources */, + FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */, + FB1D59971BBCCB6400F482CA /* ComputerScrollView.m in Sources */, + FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */, + FB89462C19F646E200339C8A /* HttpManager.m in Sources */, + FB89462D19F646E200339C8A /* MDNSManager.m in Sources */, + FB89462B19F646E200339C8A /* StreamView.m in Sources */, + FB4678FA1A55FFAD00377732 /* DiscoveryManager.m in Sources */, + 98D5856D1C0EA79600F6CC00 /* TemporaryHost.m in Sources */, + FB89463519F646E200339C8A /* MainFrameViewController.m in Sources */, + FBD1C8E21A8AD71400C6703C /* Logger.m in Sources */, + FB1D599A1BBCCD7E00F482CA /* AppCollectionView.m in Sources */, + FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */, + 9827E7A32514366900F25707 /* HapticContext.m in Sources */, + 9832D1361BBCD5C50036EF48 /* TemporaryApp.m in Sources */, + 98D585701C0ED0E800F6CC00 /* TemporarySettings.m in Sources */, + FB89462819F646E200339C8A /* CryptoManager.m in Sources */, + DC1F5A07206436B20037755F /* ConnectionHelper.m in Sources */, + FB89462E19F646E200339C8A /* PairManager.m in Sources */, + FB9AFD371A7E02DB00872C98 /* HttpRequest.m in Sources */, + FB4678ED1A50C40900377732 /* OnScreenControls.m in Sources */, + FB290D0019B2C406004C83CF /* main.m in Sources */, + 9896219723D15C7000211983 /* X1Kit.swift in Sources */, + FBD3494319FC9C04002D2A60 /* AppAssetManager.m in Sources */, + FB6549561A57907E001C8F39 /* DiscoveryWorker.m in Sources */, + FB89462A19F646E200339C8A /* ControllerSupport.m in Sources */, + FB9AFD3D1A7E111600872C98 /* AppAssetResponse.m in Sources */, + FBD349621A0089F6002D2A60 /* DataManager.m in Sources */, + FB4A23B81A9D3637004D2EF2 /* LoadingFrameViewController.m in Sources */, + FB9AFD3A1A7E05CE00872C98 /* ServerInfoResponse.m in Sources */, + FB89463119F646E200339C8A /* StreamManager.m in Sources */, + 988FCD41293B091B003050E2 /* KeyboardInputField.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 98AB2E861CAD468B0089BB98 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "moonlight-common"; + targetProxy = 98AB2E851CAD468B0089BB98 /* PBXContainerItemProxy */; + }; + FB1A68172132509800507771 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "moonlight-common-tv"; + targetProxy = FB1A68162132509800507771 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + FB1A675E2132419700507771 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FB1A675F2132419700507771 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + FB290CFC19B2C406004C83CF /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + FB290CFD19B2C406004C83CF /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FB1A67662132419A00507771 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Launch Image"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = DM46QST4M7; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Limelight/Limelight-Prefix.pch"; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/moonlight-common/moonlight-common-c/src", + "$(SDKROOT)/usr/include/libxml2/**", + "$(PROJECT_DIR)/libs/**", + ); + INFOPLIST_FILE = "Moonlight TV/Info.plist"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[sdk=appletvos*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/tvOS", + "$(PROJECT_DIR)/libs/SDL2/lib/tvOS", + "$(PROJECT_DIR)/libs/FFmpeg/lib/tvOS", + ); + "LIBRARY_SEARCH_PATHS[sdk=appletvsimulator*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/tvOS-Sim", + "$(PROJECT_DIR)/libs/SDL2/lib/tvOS-Sim", + "$(PROJECT_DIR)/libs/FFmpeg/lib/tvOS-Sim", + ); + MARKETING_VERSION = 9.0.2; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_OBJC_BRIDGING_HEADER = "Limelight/Input/Moonlight-Bridging-Header.h"; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "Moonlight-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 12.0; + }; + name = Debug; + }; + FB1A67672132419A00507771 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Launch Image"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = DM46QST4M7; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Limelight/Limelight-Prefix.pch"; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/moonlight-common/moonlight-common-c/src", + "$(SDKROOT)/usr/include/libxml2/**", + "$(PROJECT_DIR)/libs/**", + ); + INFOPLIST_FILE = "Moonlight TV/Info.plist"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[sdk=appletvos*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/tvOS", + "$(PROJECT_DIR)/libs/SDL2/lib/tvOS", + "$(PROJECT_DIR)/libs/FFmpeg/lib/tvOS", + ); + "LIBRARY_SEARCH_PATHS[sdk=appletvsimulator*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/tvOS-Sim", + "$(PROJECT_DIR)/libs/SDL2/lib/tvOS-Sim", + "$(PROJECT_DIR)/libs/FFmpeg/lib/tvOS-Sim", + ); + MARKETING_VERSION = 9.0.2; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OBJC_BRIDGING_HEADER = "Limelight/Input/Moonlight-Bridging-Header.h"; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "Moonlight-Swift.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 12.0; + }; + name = Release; + }; + FB290D1E19B2C406004C83CF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OBJC_INTERFACE_HEADER_NAME = ""; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + FB290D1F19B2C406004C83CF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + NDEBUG, + ENABLE_APP_STORE_RESTRICTIONS, + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PROVISIONING_PROFILE = ""; + SDKROOT = iphoneos; + SWIFT_OBJC_INTERFACE_HEADER_NAME = ""; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + FB290D2119B2C406004C83CF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; +<<<<<<< HEAD:Moonlight-ZWM.xcodeproj/project.pbxproj + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 8S84A8A3QF; +======= + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = DM46QST4M7; +>>>>>>> Moonlight-iOS-Official9.0.2:Moonlight.xcodeproj/project.pbxproj + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Limelight/Limelight-Prefix.pch"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(PROJECT_DIR)/moonlight-common/moonlight-common-c/src", + "$(SDKROOT)/usr/include/libxml2/**", + "$(PROJECT_DIR)/libs/**", + ); + INFOPLIST_FILE = "Limelight/Limelight-Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = MoonlightAXI; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/iOS", + "$(PROJECT_DIR)/libs/SDL2/lib/iOS", + "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS", + ); + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/iOS-Sim", + "$(PROJECT_DIR)/libs/SDL2/lib/iOS-Sim", + "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS-Sim", + ); +<<<<<<< HEAD:Moonlight-ZWM.xcodeproj/project.pbxproj + MARKETING_VERSION = 9.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-zwm.iPadOS"; +======= + MARKETING_VERSION = 9.0.2; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; +>>>>>>> Moonlight-iOS-Official9.0.2:Moonlight.xcodeproj/project.pbxproj + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SKIP_INSTALL = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Limelight/Input/Moonlight-Bridging-Header.h"; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "Moonlight-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + FB290D2219B2C406004C83CF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; +<<<<<<< HEAD:Moonlight-ZWM.xcodeproj/project.pbxproj + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 8S84A8A3QF; +======= + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = DM46QST4M7; +>>>>>>> Moonlight-iOS-Official9.0.2:Moonlight.xcodeproj/project.pbxproj + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Limelight/Limelight-Prefix.pch"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(PROJECT_DIR)/moonlight-common/moonlight-common-c/src", + "$(SDKROOT)/usr/include/libxml2/**", + "$(PROJECT_DIR)/libs/**", + ); + INFOPLIST_FILE = "Limelight/Limelight-Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = MoonlightAXI; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/iOS", + "$(PROJECT_DIR)/libs/SDL2/lib/iOS", + "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS", + ); + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = ( + "$(inherited)", + "$(PROJECT_DIR)/libs/opus/lib/iOS-Sim", + "$(PROJECT_DIR)/libs/SDL2/lib/iOS-Sim", + "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS-Sim", + ); +<<<<<<< HEAD:Moonlight-ZWM.xcodeproj/project.pbxproj + MARKETING_VERSION = 9.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-zwm.iPadOS"; +======= + MARKETING_VERSION = 9.0.2; + PRODUCT_BUNDLE_IDENTIFIER = "com.moonlight-stream.Moonlight"; +>>>>>>> Moonlight-iOS-Official9.0.2:Moonlight.xcodeproj/project.pbxproj + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SKIP_INSTALL = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OBJC_BRIDGING_HEADER = "Limelight/Input/Moonlight-Bridging-Header.h"; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "Moonlight-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FB1A67682132419A00507771 /* Build configuration list for PBXNativeTarget "Moonlight-ZWM TV" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FB1A67662132419A00507771 /* Debug */, + FB1A67672132419A00507771 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FB290CE919B2C406004C83CF /* Build configuration list for PBXProject "Moonlight-ZWM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FB290D1E19B2C406004C83CF /* Debug */, + FB290D1F19B2C406004C83CF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FB290D2019B2C406004C83CF /* Build configuration list for PBXNativeTarget "Moonlight-ZWM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FB290D2119B2C406004C83CF /* Debug */, + FB290D2219B2C406004C83CF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 9874E8962AE95E1D00130A3C /* Moonlight v1.10.xcdatamodel */, + 986E28A528EA989100758361 /* Moonlight v1.9.xcdatamodel */, + 984CD023288A310D0097D2D4 /* Moonlight v1.8.xcdatamodel */, + 566E9D2B2770B23A00EF7BFE /* Moonlight v1.7.xcdatamodel */, + 9819CC25254F2734008A7C8E /* Moonlight v1.6.xcdatamodel */, + 98783FEA242EAC5D00F00EF4 /* Moonlight v1.5.xcdatamodel */, + 98608BDD22DC0C2C000E5672 /* Moonlight v1.4.xcdatamodel */, + 98517B1B21CE0A9000481377 /* Moonlight v1.3.xcdatamodel */, + 986CCE6C2133E45300168291 /* Moonlight v1.2.xcdatamodel */, + 98132E8C20BC9A62007A053F /* Moonlight v1.1.xcdatamodel */, + FB53E1441BE5DCBC00CD6ECE /* Moonlight v1.0-2.xcdatamodel */, + FBB460391B50ACE400F3099C /* Moonlight v1.0.xcdatamodel */, + FB6549621A60B4A9001C8F39 /* Limelight 0.3.1.xcdatamodel */, + FB4678F21A51BDCB00377732 /* Limelight 0.3.0.xcdatamodel */, + FB290D0619B2C406004C83CF /* Limelight.xcdatamodel */, + ); + currentVersion = 9874E8962AE95E1D00130A3C /* Moonlight v1.10.xcdatamodel */; + path = Limelight.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = FB290CE619B2C406004C83CF /* Project object */; +} diff --git a/appveyor.yml b/appveyor.yml index ab99c2a5..91cab2db 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,11 +4,11 @@ clone_depth: 1 environment: matrix: - - APPVEYOR_BUILD_WORKER_IMAGE: macOS-Monterey + - APPVEYOR_BUILD_WORKER_IMAGE: macOS-Sonoma SCHEME: Moonlight SDK: iphonesimulator PLATFORM: iOS - - APPVEYOR_BUILD_WORKER_IMAGE: macOS-Monterey + - APPVEYOR_BUILD_WORKER_IMAGE: macOS-Sonoma SCHEME: Moonlight TV SDK: appletvsimulator PLATFORM: tvOS @@ -18,7 +18,7 @@ before_build: - sh: 'xcodebuild -downloadPlatform $PLATFORM' build_script: - - sh: set -o pipefail && xcodebuild -project Moonlight.xcodeproj -scheme "$SCHEME" -configuration Debug -sdk $SDK clean build | xcpretty - - sh: set -o pipefail && xcodebuild -project Moonlight.xcodeproj -scheme "$SCHEME" -configuration Release -sdk $SDK clean build | xcpretty + - sh: xcodebuild -project Moonlight.xcodeproj -scheme "$SCHEME" -configuration Debug -sdk $SDK clean build + - sh: xcodebuild -project Moonlight.xcodeproj -scheme "$SCHEME" -configuration Release -sdk $SDK clean build deploy: off diff --git a/moonlight-common/moonlight-common.xcodeproj/project.pbxproj b/moonlight-common/moonlight-common.xcodeproj/project.pbxproj index 224f5503..e5abffcb 100644 --- a/moonlight-common/moonlight-common.xcodeproj/project.pbxproj +++ b/moonlight-common/moonlight-common.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 48; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -364,7 +364,8 @@ FB290E2619B37A4E004C83CF /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1400; + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = "Moonlight Stream"; TargetAttributes = { FB1A67EE21324EE300507771 = { @@ -484,14 +485,11 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = DM46QST4M7; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); HEADER_SEARCH_PATHS = ( "moonlight-common-c/enet/include", "../libs/**", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-ObjC"; @@ -521,6 +519,7 @@ "moonlight-common-c/enet/include", "../libs/**", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-ObjC"; @@ -565,8 +564,10 @@ COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; + ENABLE_MODULE_VERIFIER = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -575,6 +576,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( LC_DEBUG, "DEBUG=1", + __APPLE_USE_RFC_3542, "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; @@ -585,6 +587,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SKIP_INSTALL = YES; @@ -624,11 +628,17 @@ DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; + ENABLE_MODULE_VERIFIER = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + __APPLE_USE_RFC_3542, + "$(inherited)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -636,6 +646,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PROVISIONING_PROFILE = ""; SDKROOT = macosx; SKIP_INSTALL = YES; @@ -652,6 +664,7 @@ "../libs/**", ); IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -669,6 +682,7 @@ "../libs/**", ); IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos;