SageTV Community  

Go Back   SageTV Community > SageTV Development and Customizations > SageTV Github Development
Forum Rules FAQs Community Downloads Today's Posts Search

Notices

SageTV Github Development Discussion related to SageTV Open Source Development. Use this forum for development topics about the Open Source versions of SageTV, hosted on Github.

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 10-13-2015, 12:36 PM
Opus4's Avatar
Opus4 Opus4 is offline
Administrator
 
Join Date: Sep 2003
Location: NJ
Posts: 19,624
Windows installer and running as a service

I'm curious about a couple things:

1) Does anyone have the Wise Installer tool, or an installer that could use a Wise Installer project as a base to convert to a new installer? (... and of course is willing to work on an installer)

2) What was the status regarding being able to run the newly compiled SageTVService.exe as a Windows service? Does it work OK for a new SageTV install, or does it need some sort of permissions/security settings for it to work?

Thanks.

Andy
__________________
SageTV Open Source v9 is available.
- Read the SageTV FAQ. Older PDF User's Guides mostly still apply: SageTV V7.0 & SageTV Studio v7.1.
- Hauppauge remote help: 1) Basics/Extending it 2) Replace it 3) Use it w/o needing focus
- HD Extenders: A) FAQs B) URC MX-700 remote setup
Note: This is a users' forum; see the Rules. For official tech support fill out a Support Request.
Reply With Quote
  #2  
Old 10-14-2015, 06:40 AM
rickw rickw is offline
Sage Advanced User
 
Join Date: Aug 2004
Location: Spring Hill, TN
Posts: 108
I don't have access to a version of Wise, but I have started creating a setup using Inno Setup. http://www.jrsoftware.org/isinfo.php

To get started I installed 7.1.9 with the logging on verbose. That should tell me everything that was done with the existing installer.

It's doing the basics right now.
  • Prompting for EULA agreement
  • Copying Files
  • Registering components

The bad news is Sage hangs on startup at "Object Database Backup is initializing". So something still isn't right.

Rick...
Reply With Quote
  #3  
Old 10-14-2015, 07:30 AM
Taddeusz Taddeusz is offline
SageTVaholic
 
Join Date: Nov 2004
Location: Yukon, OK
Posts: 3,919
If possible you should include a prompt for a license key and put that in the correct system environment variable.
__________________
Server: i5 8400, ASUS Prime H370M-Plus/CSM, 16GB RAM, 15TB drive array + 500GB cache, 2 HDHR's, SageTV 9, unRAID 6.6.3
Client 1: HD300 (latest FW), HDMI to an Insignia 65" 1080p LCD and optical SPDIF to a Sony Receiver
Client 2: HD200 (latest FW), HDMI to an Insignia NS-LCD42HD-09 1080p LCD
Reply With Quote
  #4  
Old 10-14-2015, 11:43 AM
Narflex's Avatar
Narflex Narflex is online now
Sage
 
Join Date: Feb 2003
Location: Redondo Beach, CA
Posts: 6,349
Quote:
Originally Posted by rickw View Post
The bad news is Sage hangs on startup at "Object Database Backup is initializing". So something still isn't right.

Rick...
If you post the output of the SageTV log file here I can probably help. I'll definitely know the answer if you follow these instructions and get the Ctrl-break output:

http://forums.sagetv.com/forums/show...41&postcount=5
__________________
Jeffrey Kardatzke
Google
Founder of SageTV
Reply With Quote
  #5  
Old 10-15-2015, 06:42 AM
rickw rickw is offline
Sage Advanced User
 
Join Date: Aug 2004
Location: Spring Hill, TN
Posts: 108
Here's the output from the consolewin.

Code:
ERROR Saving preferences:java.io.FileNotFoundException: C:\Program Files (x86)\SageTV\SageTV\Sage.properties.tmp (Access is denied)
Thu 10/15 7:38:44.944 [main@20c684] Succesfully setup system shell hook
Thu 10/15 7:38:44.945 [main@20c684] not specifiy WinkeyboardHook in registery, load default one
[GC (Allocation Failure)  6656K->1776K(23808K), 0.0057444 secs]
[GC (Allocation Failure)  8432K->3735K(23808K), 0.0068206 secs]
Thu 10/15 7:38:47.731 [main@20c684] thrown java.io.IOException: Access is denied

Thu 10/15 7:38:47.745 [main@20c684] java.io.IOException: Access is deniedThu 10/15 7:38:47.745 [main@20c684]    at java.io.WinNTFileSystem.createFileExclusively
(Native Method)Thu 10/15 7:38:47.745 [main@20c684]      at java.io.File.createNewFile(Unknown Source)Thu 10/15 7:38:47.746 [main@20c684]        at sage.Wizard.s
aveDBFile(Wizard.java:7772)Thu 10/15 7:38:47.746 [main@20c684]  at sage.Wizard.startSeq(Wizard.java:2596)Thu 10/15 7:38:47.747 [main@20c684]    at sage.Wizard.i
nit(Wizard.java:664)Thu 10/15 7:38:47.747 [main@20c684]         at sage.Wizard.prime(Wizard.java:467)Thu 10/15 7:38:47.747 [main@20c684]        at sage.SageTV.<
init>(SageTV.java:404)Thu 10/15 7:38:47.748 [main@20c684]       at sage.Sage.startup(Sage.java:1173)Thu 10/15 7:38:47.748 [main@20c684]         at sage.Sage.b(S
age.java:961)Thu 10/15 7:38:47.748 [main@20c684] Error with DB file:java.io.IOException: Access is denied, attempting to restore backup.
2015-10-15 07:38:54
Full thread dump Java HotSpot(TM) Client VM (25.60-b23 mixed mode):

"LucenePersonTransactionTask" #20 daemon prio=1 os_prio=-2 tid=0x05ce4c00 nid=0x2f88 in Object.wait() [0x0862f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x107f9850> (a java.lang.Object)
        at java.lang.Object.wait(Unknown Source)
        at sage.Wizard$7.run(Wizard.java:9553)
        - locked <0x107f9850> (a java.lang.Object)
        at sage.Pooler$PooledThread.run(Pooler.java:252)

"LuceneShowTransactionTask" #19 daemon prio=1 os_prio=-2 tid=0x04effc00 nid=0x2184 in Object.wait() [0x084ef000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x103a75c0> (a java.lang.Object)
        at java.lang.Object.wait(Unknown Source)
        at sage.Wizard$6.run(Wizard.java:9390)
        - locked <0x103a75c0> (a java.lang.Object)
        at sage.Pooler$PooledThread.run(Pooler.java:252)

"AWTThreadWatcher-SAGETV_PROCESS_LOCAL_UI" #15 daemon prio=5 os_prio=0 tid=0x05c2d800 nid=0x64 waiting on condition [0x07aaf000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at sage.AWTThreadWatcher.run(AWTThreadWatcher.java:58)

"FinalRender-SAGETV_PROCESS_LOCAL_UI" #17 daemon prio=3 os_prio=-1 tid=0x05c95c00 nid=0x2040 in Object.wait() [0x079af000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x1088a738> (a java.lang.Object)
        at sage.ZRoot$1.run(ZRoot.java:156)
        - locked <0x1088a738> (a java.lang.Object)

"ActiveRender-SAGETV_PROCESS_LOCAL_UI" #16 daemon prio=2 os_prio=-2 tid=0x05c06400 nid=0x21b8 in Object.wait() [0x078af000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x1088a8b8> (a java.lang.Object)
        at sage.ZRoot.run(ZRoot.java:870)
        - locked <0x1088a8b8> (a java.lang.Object)
        at java.lang.Thread.run(Unknown Source)

"AWT-EventQueue-0" #14 prio=6 os_prio=0 tid=0x05bd5800 nid=0x1580 waiting on condition [0x0724f000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x2024a2b0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        at java.awt.EventQueue.getNextEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

"AWT-Windows" #10 daemon prio=6 os_prio=0 tid=0x05b36c00 nid=0x2db4 runnable [0x0638f000]
   java.lang.Thread.State: RUNNABLE
        at sun.awt.windows.WToolkit.eventLoop(Native Method)
        at sun.awt.windows.WToolkit.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

"AWT-Shutdown" #9 prio=5 os_prio=0 tid=0x05b64000 nid=0xf1c in Object.wait() [0x0624f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x203319e0> (a java.lang.Object)
        at java.lang.Object.wait(Unknown Source)
        at sun.awt.AWTAutoShutdown.run(Unknown Source)
        - locked <0x203319e0> (a java.lang.Object)
        at java.lang.Thread.run(Unknown Source)

"Java2D Disposer" #8 daemon prio=10 os_prio=2 tid=0x0502e400 nid=0x1e8c in Object.wait() [0x0614f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x20331b80> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        - locked <0x20331b80> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        at sun.java2d.Disposer.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x04e77000 nid=0xb20 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x04e54000 nid=0x23a0 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x04e5e800 nid=0xfc4 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x04e5d800 nid=0x24bc waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x04e37400 nid=0x1b18 in Object.wait() [0x0522f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x20332348> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        - locked <0x20332348> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0247e400 nid=0x7b0 in Object.wait() [0x0512f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x203324e8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Unknown Source)
        at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
        - locked <0x203324e8> (a java.lang.ref.Reference$Lock)

"main" #1 prio=5 os_prio=0 tid=0x0262c400 nid=0x13d0 in Object.wait() [0x004ed000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x102d9058> (a java.util.Vector)
        at sage.Wizard.saveDBFile(Wizard.java:7710)
        - locked <0x102d9058> (a java.util.Vector)
        at sage.Wizard.startSeq(Wizard.java:2596)
        at sage.Wizard.startSeq(Wizard.java:2631)
        at sage.Wizard.init(Wizard.java:664)
        at sage.Wizard.prime(Wizard.java:467)
        - locked <0x102c2858> (a java.lang.Object)
        at sage.SageTV.<init>(SageTV.java:404)
        at sage.Sage.startup(Sage.java:1173)
        at sage.Sage.b(Sage.java:961)

"VM Thread" os_prio=2 tid=0x0247bc00 nid=0x1f68 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x04e8d000 nid=0x114c waiting on condition

JNI global references: 431

Heap
 def new generation   total 7424K, used 7424K [0x10200000, 0x10a00000, 0x20200000)
  eden space 6656K, 100% used [0x10200000, 0x10880000, 0x10880000)
  from space 768K, 100% used [0x10880000, 0x10940000, 0x10940000)
  to   space 768K,   0% used [0x10940000, 0x10940000, 0x10a00000)
 tenured generation   total 16384K, used 2967K [0x20200000, 0x21200000, 0x40200000)
   the space 16384K,  18% used [0x20200000, 0x204e5c90, 0x204e5e00, 0x21200000)
 Metaspace       used 9477K, capacity 9649K, committed 9728K, reserved 10624K
Reply With Quote
  #6  
Old 10-15-2015, 07:06 AM
stuckless's Avatar
stuckless stuckless is offline
SageTVaholic
 
Join Date: Oct 2007
Location: London, Ontario, Canada
Posts: 9,713
I'm not a windows guy, that "Access Denied" looks like the sagetv service user doesn't have access to write in the SageTV directory.
Reply With Quote
  #7  
Old 10-15-2015, 08:17 AM
rickw rickw is offline
Sage Advanced User
 
Join Date: Aug 2004
Location: Spring Hill, TN
Posts: 108
The "access denied" is the clue. But not because it's running as a service, the same thing happens when running SageTV.exe directly.

But when I run SageTV.exe as Administrator it starts properly. So either the original installer was changing rights (which I'l check next) or it's setting thing up to write to a different location. (i.e. other than the "Program Files\SageTV" folder).
Reply With Quote
  #8  
Old 10-15-2015, 08:44 AM
Opus4's Avatar
Opus4 Opus4 is offline
Administrator
 
Join Date: Sep 2003
Location: NJ
Posts: 19,624
And that is why I posted this pair of questions... if someone were able to check out a Wise installer project, it would be easier to see what had been going on in terms of permission/etc when the exe files were installed. I need to see if it is a human-readable format...

Andy
__________________
SageTV Open Source v9 is available.
- Read the SageTV FAQ. Older PDF User's Guides mostly still apply: SageTV V7.0 & SageTV Studio v7.1.
- Hauppauge remote help: 1) Basics/Extending it 2) Replace it 3) Use it w/o needing focus
- HD Extenders: A) FAQs B) URC MX-700 remote setup
Note: This is a users' forum; see the Rules. For official tech support fill out a Support Request.
Reply With Quote
  #9  
Old 10-15-2015, 08:51 AM
rickw rickw is offline
Sage Advanced User
 
Join Date: Aug 2004
Location: Spring Hill, TN
Posts: 108
Quote:
Originally Posted by Opus4 View Post
And that is why I posted this pair of questions... if someone were able to check out a Wise installer project, it would be easier to see what had been going on in terms of permission/etc when the exe files were installed. I need to see if it is a human-readable format...

Andy
Agreed it would be much easier. The verbose logging of the setup does detail most of what happens, but ACL changes are not mentioned in the log

BTW The existing installer was granting modify permission to the Everyone group. I updated my setup and Sage now starts successfully . Haven't tried running as a service or the other executables.
Reply With Quote
  #10  
Old 12-29-2015, 07:21 PM
jusjoken jusjoken is offline
SageTVaholic
 
Join Date: Dec 2005
Location: Strathmore, AB
Posts: 2,727
Quote:
Originally Posted by Opus4 View Post
I'm curious about a couple things:

1) Does anyone have the Wise Installer tool, or an installer that could use a Wise Installer project as a base to convert to a new installer? (... and of course is willing to work on an installer)

2) What was the status regarding being able to run the newly compiled SageTVService.exe as a Windows service? Does it work OK for a new SageTV install, or does it need some sort of permissions/security settings for it to work?

Thanks.

Andy
I wanted to see if ANYONE else had taken this task on....a Windows Installer? If not, I will take a stab at it.

So...

1. please advise if anyone is already doing this and I will go back to Gemstone2/Phoenix work (please!!!!)

2. is there ANY info available from the previous v7 installer. Something I can try to reverse engineer...some docs etc ????

3. my initial plan is to use WIX. It is open source, works with VS2015 and seems to have all the bells and whistles but can be simple too (perhaps a steep learning curve but that's good too). I like that the source can easily be stored with SageTV OS on GitHub as it's basically an XML derivitive so other developers can download the source and install the WIX Toolkit and edit and compile. It is a NON-GUI solution (provides a GUI for the installer but the install "code" is written in the XML file and then compiled).

I will report back on progress and STOP immediately IF ANYONE has taken this on already or wants to more than me

k
Reply With Quote
  #11  
Old 12-31-2015, 08:53 AM
Fuzzy's Avatar
Fuzzy Fuzzy is offline
SageTVaholic
 
Join Date: Sep 2005
Location: Jurupa Valley, CA
Posts: 9,957
Quote:
Originally Posted by jusjoken View Post
I wanted to see if ANYONE else had taken this task on....a Windows Installer? If not, I will take a stab at it.

So...

1. please advise if anyone is already doing this and I will go back to Gemstone2/Phoenix work (please!!!!)

2. is there ANY info available from the previous v7 installer. Something I can try to reverse engineer...some docs etc ????

3. my initial plan is to use WIX. It is open source, works with VS2015 and seems to have all the bells and whistles but can be simple too (perhaps a steep learning curve but that's good too). I like that the source can easily be stored with SageTV OS on GitHub as it's basically an XML derivitive so other developers can download the source and install the WIX Toolkit and edit and compile. It is a NON-GUI solution (provides a GUI for the installer but the install "code" is written in the XML file and then compiled).

I will report back on progress and STOP immediately IF ANYONE has taken this on already or wants to more than me

k
I have not read of anyone actually starting work on one - and nothing has been thrown around on github about it. I think everyone was waiting for someone else, or waiting until x feature was done first. IN any case, I doubt you'd need to reverse engineer much from the old installer, as sage's install seems to be pretty straight forward. UAC issues would be about it, since it is continually writing into the Program Files folder, but that should be handled properly by WIX. One thing that should probably be added is a way in the installer to (optionally) enter a SageTV license code (if available), and perhaps validate it with the EPG server at that point, to avoid issues during configuration later on.
As far as dependencies that need to be installed with sagetv, I think you're best bet is looking at installing the proper C++ runtime, JRE 7u80, and registering the directshow filters that are still needed/included.

Since we're talking about installers - what is the opinion here of removing standalone mode from SageTV, and leaving only separate Server and Client packages. Is this something that people think would simplify, or complicate installs?
__________________
Buy Fuzzy a beer! (Fuzzy likes beer)

unRAID Server: i7-6700, 32GB RAM, Dual 128GB SSD cache and 13TB pool, with SageTVv9, openDCT, Logitech Media Server and Plex Media Server each in Dockers.
Sources: HRHR Prime with Charter CableCard. HDHR-US for OTA.
Primary Client: HD-300 through XBoxOne in Living Room, Samsung HLT-6189S
Other Clients: Mi Box in Master Bedroom, HD-200 in kids room
Reply With Quote
  #12  
Old 12-31-2015, 02:42 PM
jusjoken jusjoken is offline
SageTVaholic
 
Join Date: Dec 2005
Location: Strathmore, AB
Posts: 2,727
The process I am using is to run an install monitoring tool and then run through the install to see what is changed...so far LOTS...but it basically comes done to installed files, registry settings and registering DLL's and a service.

I will start out with an optional entry of the registration key with no checking for now.

I will also display a license screen if we can determine what that needs to state....I will search and see what Jeff has stated about this in the past.

I planned to NOT implement the 2 options for capture cards that are offered in the installs.... Provideo 256 and PVR 150/250/350/USB2 IR Remote Control....unless there is a big need to figure what these options install.

I figured to begin with we need 3 install files ....Server, Client and Placeshifter. These could be collapsed into a single install with options but it just makes the install file larger. I will be doing compares to see what files get installed for each of these 3 types....perhaps they are not so different in the end.

I also thought about NOT installing the STV/SageTV3 folder.

Removing standalone mode..... not sure how this would change the installer other than the compiled file we include in it if someone builds one that does not include the standalone feature...or am I missing something here ?

k
Reply With Quote
  #13  
Old 01-01-2016, 02:43 AM
Fuzzy's Avatar
Fuzzy Fuzzy is offline
SageTVaholic
 
Join Date: Sep 2005
Location: Jurupa Valley, CA
Posts: 9,957
Quote:
Originally Posted by jusjoken View Post
Removing standalone mode..... not sure how this would change the installer other than the compiled file we include in it if someone builds one that does not include the standalone feature...or am I missing something here ?
Sorry, wasn't really intended as a comment on the impact on a windows installer, more-so on the overall installation and configuration process. It's always bugged me about the UI and Service using different properties files, but when in standalone, it only uses one. Always wished it had been completely separate for back end and front end, whether running standalone or server-client.
__________________
Buy Fuzzy a beer! (Fuzzy likes beer)

unRAID Server: i7-6700, 32GB RAM, Dual 128GB SSD cache and 13TB pool, with SageTVv9, openDCT, Logitech Media Server and Plex Media Server each in Dockers.
Sources: HRHR Prime with Charter CableCard. HDHR-US for OTA.
Primary Client: HD-300 through XBoxOne in Living Room, Samsung HLT-6189S
Other Clients: Mi Box in Master Bedroom, HD-200 in kids room
Reply With Quote
  #14  
Old 01-01-2016, 07:33 AM
jusjoken jusjoken is offline
SageTVaholic
 
Join Date: Dec 2005
Location: Strathmore, AB
Posts: 2,727
Quote:
Originally Posted by Fuzzy View Post
Sorry, wasn't really intended as a comment on the impact on a windows installer, more-so on the overall installation and configuration process. It's always bugged me about the UI and Service using different properties files, but when in standalone, it only uses one. Always wished it had been completely separate for back end and front end, whether running standalone or server-client.
From a concept perspective I totally agree. I fully support a concept of a server module installed as a service and if the server needs a UI running then optionally install the client.

However, that's not a project I plan to take on

k
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Any news on the Windows installer? Damstas SageTV Github Development 2 09-03-2015 10:09 AM
DTV Serial control broken in windows 7 when running as a service? 4T2 Hardware Support 2 03-26-2011 07:41 AM
Web Interface - where is the Windows installer ckewinjones SageTV Customizations 2 01-09-2011 10:36 AM
SageTV installer doesn't keep service account settings electron SageTV Software 5 07-27-2009 08:00 PM


All times are GMT -6. The time now is 11:04 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2023, vBulletin Solutions Inc.
Copyright 2003-2005 SageTV, LLC. All rights reserved.